LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 3145|回复: 4

/proc/vmstat 中Page in /Page out 和 Swap In /Swap out有什么区别?

[复制链接]
发表于 2007-11-19 02:13:22 | 显示全部楼层 |阅读模式
资料上说是
Number of pageins and pageouts (since the last boot):

pgpgin 33754195
pgpgout 38985992

Number of swapins and swapouts (since the last boot):

pswpin 2473
pswpout 2995

可是Page In 和Swap in 是什么区别呢?
是不是Page In 包括了更多的事件, 从Inactive List 到 Active List等等?

另外,我 看了VMSTAT这个命令的程序:
  getstat(cpu_use,cpu_nic,cpu_sys,cpu_idl,cpu_iow,cpu_xxx,cpu_yyy,
          pgpgin,pgpgout,pswpin,pswpout,
          intr,ctxt,
          &running,&blocked,
          &dummy_1, &dummy_2);

  duse= *cpu_use + *cpu_nic;
  dsys= *cpu_sys + *cpu_xxx + *cpu_yyy;
  didl= *cpu_idl;
  diow= *cpu_iow;
  Div= duse+dsys+didl+diow;
  divo2= Div/2UL;
  printf(format,
         running, blocked,
         unitConvert(kb_swap_used), unitConvert(kb_main_free),
         unitConvert(a_option?kb_inactive:kb_main_buffers),
         unitConvert(a_option?kb_active:kb_main_cached),
         (unsigned)( (*pswpin  * unitConvert(kb_per_page) * hz + divo2) / Div ),
         (unsigned)( (*pswpout * unitConvert(kb_per_page) * hz + divo2) / Div ),
         (unsigned)( (*pgpgin                * hz + divo2) / Div ),
         (unsigned)( (*pgpgout               * hz + divo2) / Div ),

。。。

其中getstat函数就是从/proc/stat读取从CPU的值,其他从./oproc/vmstat读取。
不理解的是
Div= duse+dsys+didl+diow;
  divo2= Div/2UL;
。。。
(unsigned)( (*pswpin  * unitConvert(kb_per_page) * hz + divo2) / Div ),
DIV应该是系统自BOOT以来的总的Jiff数吧,可 (x * hz + divo2) / Div是什么意思呢?
发表于 2007-11-20 23:24:57 | 显示全部楼层
pgpgin: block/ll_rw_blk.c:3308:submit_bio:
void submit_bio(int rw, struct bio *bio)
{
    int count = bio_sectors(bio);

    BIO_BUG_ON(!bio->bi_size);
    BIO_BUG_ON(!bio->bi_io_vec);
    bio->bi_rw |= rw;
    if (rw & WRITE) {
        count_vm_events(PGPGOUT, count);
    } else {
        task_io_account_read(bio->bi_size);
        count_vm_events(PGPGIN, count);
    }   

pswpin: mm/page_io.c:131:swap_readpage
int swap_readpage(struct file *file, struct page *page)
{
    struct bio *bio;
    int ret = 0;

    BUG_ON(!PageLocked(page));
    ClearPageUptodate(page);
    bio = get_swap_bio(GFP_KERNEL, page_private(page), page,
                end_swap_bio_read);
    if (bio == NULL) {
        unlock_page(page);
        ret = -ENOMEM;
        goto out;
    }           
    count_vm_event(PSWPIN);
    submit_bio(READ, bio);
out:            
    return ret;
}


注:我用的2.6.23.1的内核。自己比较一下区别。
另:pgpgin单位是KB,所以在vmstat_start (mm/vmstat.c:624)中有一个转换:
e[PGPGIN] /= 2;         /* sectors -> kbytes */
回复 支持 反对

使用道具 举报

发表于 2007-11-20 23:31:34 | 显示全部楼层
建议使用cscope工具,可以很快理清代码调用关系。使用方法见google。
ctags找代码很容易陷入到无关代码中。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2007-11-21 00:33:51 | 显示全部楼层
多谢,多谢
我就是不知道count_vm_event这个函数,所以没法搜索他们在那里被计数的

下次试试CSCOPE,我现在用在线的LXR + 本地CTAGS

另外,
Div= duse+dsys+didl+diow;
divo2= Div/2UL;

duse, dsys..等是系统启动以来的,CPU的各个时间的jiffie数吧
能解释一下这几行代码的作用马?

谢谢
回复 支持 反对

使用道具 举报

发表于 2007-11-21 22:00:04 | 显示全部楼层
我不清楚你给的代码从哪找到的。
count_vm_event是用来统计per_cpu_var的变量的,你用ctags也可以很快找到定义。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表