<i id='je7ua'></i>

      <code id='je7ua'><strong id='je7ua'></strong></code>

      <fieldset id='je7ua'></fieldset><ins id='je7ua'></ins>
      <dl id='je7ua'></dl>

        <i id='je7ua'><div id='je7ua'><ins id='je7ua'></ins></div></i>
      1. <tr id='je7ua'><strong id='je7ua'></strong><small id='je7ua'></small><button id='je7ua'></button><li id='je7ua'><noscript id='je7ua'><big id='je7ua'></big><dt id='je7ua'></dt></noscript></li></tr><ol id='je7ua'><table id='je7ua'><blockquote id='je7ua'><tbody id='je7ua'></tbody></blockquote></table></ol><u id='je7ua'></u><kbd id='je7ua'><kbd id='je7ua'></kbd></kbd>
      2. <acronym id='je7ua'><em id='je7ua'></em><td id='je7ua'><div id='je7ua'></div></td></acronym><address id='je7ua'><big id='je7ua'><big id='je7ua'></big><legend id='je7ua'></legend></big></address>
        <span id='je7ua'></span>

          Linux进程IO状况的实时监测

          • 时间:
          • 浏览:3
          • 来源:124软件资讯网

            作为系统治理员和 VPS 服务商  ,经常会遇到服务器或者 VPS 磁盘 IO 忙碌的时间  ,VPSee 通常都市用一些工具来检测  ,其中一个常用的工具就是自己写的 iotop 剧本  ,可以很利便看到哪个历程在频仍 IO. 上周五收到一位网友的邮件和留言  ,问到这篇文章:怎样检察历程 IO 读写情形  ?里的 WRITE 为什么会泛起是 0 的情形  ,这是个好问题  ,VPSee 在这里好好诠释一下  。首先看看我们怎么样才气实时监测差别历程的 IO 运动状态 。

              block_dump

              Linux 内核里提供了一个 block_dump 参数用来把 block 读写(WRITE/READ)状态 dump 到日志里  ,这样可以通过 dmesg 下令来检察  ,详细操作步骤是:

              # sysctl vm.block_dump=1

              or

              # echo 1 > /proc/sys/vm/block_dump

              然后就可以通过 dmesg 就可以视察到各个历程 IO 运动的状态了:

              # dmesg -c

              kjournald(542): WRITE block 222528 on dm-0

              kjournald(542): WRITE block 222552 on dm-0

              bash(18498): dirtied inode 5892488 (ld-linux-x86-64.so.2) on dm-0

              bash(18498): dirtied inode 5892482 (ld-2.5.so) on dm-0

              dmesg(18498): dirtied inode 11262038 (ld.so.cache) on dm-0

              dmesg(18498): dirtied inode 5892496 (libc.so.6) on dm-0

              dmesg(18498): dirtied inode 5892489 (libc-2.5.so) on dm-0

              问题

              一位仔细的网友提到这样一个问题:为什么会有 WRITE block 0 的情形泛起呢  ?VPSee 跟踪了一段时间  ,发现确实有 WRITE 0 的情形泛起  ,好比:

              # dmesg -c

              ...

              pdflush(23123): WRITE block 0 on sdb1

              pdflush(23123): WRITE block 16 on sdb1

              pdflush(23123): WRITE block 104 on sdb1

              pdflush(23123): WRITE block 40884480 on sdb1

              ...

              谜底

              原来我们把 WRITE block 0  ,WRITE block 16, WRITE block 104 这内里包罗的数字明白错了 ,这些数字不是代表写了几多 blocks  ,是代表写到哪个 block  ,为了寻找真相  ,VPSee 追到 Linux 2.6.18 内核代码里 ,在 ll_rw_blk.c 里找到了谜底:

              $ vi linux-2.6.18/block/ll_rw_blk.c

              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

              count_vm_events(PGPGIN, count);

              if (unlikely(block_dump)) {

              char b[BDEVNAME_SIZE];

              printk(KERN_DEBUG "%s(%d): %s block %Lu on %s\n",

              current->comm, current->pid,

              (rw & WRITE) ? "WRITE" : "READ",

              (unsigned long long)bio->bi_sector,

              bdevname(bio->bi_bdev,b));

              }

              generic_make_request(bio);

              }

              很显着从上面代码可以看出 WRITE block 0 on sdb1  ,这里的 0 是 bio->bi_sector  ,是写到哪个 sector  ,不是 WRITE 了几多 blocks 的意思  。另有  ,若是 block 装备被分成多个区的话  ,这个 bi_sector(sector number)是从这个分区最先计数 ,好比 block 0 on sdb1 就是 sdb1 分区上的第0个 sector 最先  。