能知道究竟是那个进程使用了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