统计数据
当进程执行内存相关操作时,如分配大页,内核会记录下相关动作。这些数据作为进程生命周期的一部分存在。
mm->rss_stat[]
位置
首先我们来看看mm->rss_stat这个统计数据,在mm_struct中有一个rss_stat[]数组。
类型
这个数组一共就这么些类型。
enum {
MM_FILEPAGES, /* Resident file mapping pages */
MM_ANONPAGES, /* Resident anonymous pages */
MM_SWAPENTS, /* Anonymous swap entries */
MM_SHMEMPAGES, /* Resident shared memory pages */
NR_MM_COUNTERS
};
操作
对操作的方法是
add_mm_counter()
inc_mm_counter()
dec_mm_counter()
这个看上去是统计进程中各种类型内存的数量,以base page为单位。
比如在do_anonymous_page()中,如果分配成功了匿名页,则会 add_mm_counter(vma->vm_mm, MM_ANONPAGES, nr_pages);来增加对应的计数。
而在do_swap_page()中,如果是交换进页面,则会
add_mm_counter(vma->vm_mm, MM_ANONPAGES, nr_pages);
add_mm_counter(vma->vm_mm, MM_SWAPENTS, -nr_pages);
增加匿名页计数,同时减少swap页计数。
vm_event_states
位置
这是一个全局的per_cpu数组。
struct vm_event_state {
unsigned long event[NR_VM_EVENT_ITEMS];
};
DECLARE_PER_CPU(struct vm_event_state, vm_event_states);
此外,这个还是一个内核配置项。只有配置了CONFIG_VM_EVENT_COUNTERS才会记录相关的事件信息。
类型
这个种类就多很多了, 详见vm_event_item,目测有120+种。
操作
因为是事件的计数,所以好像只有count_vm_events是常用的。
观察 -- /proc/vmstat
这个计数是可以观察的。也就是我们熟知的vmstat文件。不过vmstat文件中,不仅包含了vm_event_states的信息。
mm/vmstat.c:
proc_create_seq("vmstat", 0444, NULL, &vmstat_op);
Last updated
Was this helpful?