能知道究竟是那个进程使用了swap吗?

2011-02-15 12:40:40


昨天有同学问了这个问题
我查了一下:
top 显示关于内存的信息
Mem:   1984888k total,   867772k used,  1117116k free,    88520k buffers
Swap:  7201788k total,        0k used,  7201788k free,   295756k cached

其中 swap 信息来自于 /proc/meminfo
SwapTotal:       7201788 kB
SwapFree:        7201788 kB

是 kernel 内页使用情况的真实反映:
mm/swapfile.c:1710: val->totalswap = total_swap_pages + nr_to_be_unused;

top 貌似也能显示每个进程的 SWAP 信息:
其值来自(402为进城id):
/proc/402/task/402/stat or /proc/402/statm
数值分别是:
size, resident, share, trs, lrs, drs, dt

其值不可能是真实的swap信息,计算方式是
case P_SWP:
  MKCOL(scale_num(PAGES_TO_KB(p->size - p->resident), w, s));
  break;

我想如果内核的mm模块不报告page的进程信息,那么压根就没有地方能准确得到“那个进程使用了swap”信息,后来在 htop 的faq 里找到了佐证: http://htop.sourceforge.net/index.php?page=faq

[update]
不知为何,我机器上的代码居然是2006年的,那时还没有以下方法呢

2008年在 /proc/pid/smaps 添加了 Swap 信息(account swap entries)
最早的实现方法是遍历了所有的page, 如果 is_swap_pte, 就记录为 swap

还有一个更精确的计算是/proc/pid/pagemap,但是是二进制的

 * /proc/pid/pagemap - an array mapping virtual pages to pfns
 *
 * For each page in the address space, this file contains one 64-bit entry
 * consisting of the following:
 *
 * Bits 0-55  page frame number (PFN) if present
 * Bits 0-4   swap type if swapped
 * Bits 5-55  swap offset if swapped
 * Bits 55-60 page shift (page size = 1<<page shift)
 * Bit  61    reserved for future use
 * Bit  62    page swapped
 * Bit  63    page present