我对Linux下存储管理和监控工具的缺乏感到非常不满,虽然如此,我还是积极在寻找适合的工具,除了等待更好的工具出现(或自己开发一款)外,我们必须好好利用现有工具的功能。
sysstat监控工具家族中的一员
在以前的文章中,我曾经介绍过iostat,它是sysstat监控工具家族中的一员,允许你监控分区或设备的性能,甚至可以监控CPU使用情况,它可以测量下面的指标:
? %user:执行发生在用户层时的CPU利用率百分比(它是应用程序使用的)
? %nice:执行发生在用户层,优先级为“nice”的CPU利用率百分比。
? %system:执行发生在系统层(内核)时的CPU利用率百分比。
? %iowait:系统处理未决的磁盘I/O请求期间,CPU空闲时间的百分比。
? %steal:hypervisor 为其它虚拟处理器服务时,虚拟CPU或CPU非自愿等待所花时间的百分比。
? %idle:CPU空闲时间的百分比。
? rrqm/s:每秒进入设备队列的读取请求数量。
? wrqm/s:每秒进入设备队列的写入请求数量。
? r/s:每秒发向设备的读取请求数量。
? w/s:每秒发向设备的写入请求数量。
? rMB/s:每秒从设备读取的MB数量。
? wMB/s:每秒写入设备的MB数量。
? avgrq-sz:发向设备的请求的平均大小。
? avgqu-sz:发向设备的请求的平均队列长度。
? await:发向设备的I/O请求的平均时间(ms),包括请求在队列中花的时间和处理队列的时间。
? svctm:发向设备的I/O请求的平均服务时间(ms)。
? %util:I/O请求发向设备期间的CPU时间百分比(设备带宽利用率),这个值接近100%时,设备就处于饱和状态。
正如你所看到的,使用iostat可以监控大量的指标,加上它可以监控CPU使用情况,因此它已成为我工具箱中的一员。
如果你使用了NFS服务器,iostat允许你监控服务器上发生的许多事情,如负载情况,此外,我们还要监控NFS客户端,如客户端挂在NFS文件系统时发生的事情,幸运的是,sysstat家族有一个类似于iostat的工具可以做到这一点,它就是nfsiostat。
nfsiostat介绍
Sysstat家族包括一个名叫nfsiostat的实用程序,它和iostat有诸多类似之处,它允许你监控NFS文件系统上的读写情况,其用法也和iostat类似,最基本的命令用法是跟上几个参数和两个数字,这两个数字分别表示:(1)nfsiostat输出的间隔时间,(2)运行nfsiostat的次数,如果第二个数字留空,nfsiostat会一直执行下去,直到你按下^c停止它。
下面是一个在NFS客户端上运行nfsiostat的简单示例。
[root@home8 etc]# /usr/local/bin/nfsiostat -k 1
Linux 2.6.18-194.el5 (home8) 12/04/2010 _i686_ (1 CPU
Filesystem: rkB_nor/s wkB_nor/s rkB_dir/s wkB_dir/s rkB_svr/s wkB_svr/s ops/s rops/s wops/s
192.168.1.65:/mnt/home1 0.00 0.00 0.00 0.00 0.00 0.00 3400.00 0.00 0.00
Filesystem: rkB_nor/s wkB_nor/s rkB_dir/s wkB_dir/s rkB_svr/s wkB_svr/s ops/s rops/s wops/s
192.168.1.65:/mnt/home1 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
Filesystem: rkB_nor/s wkB_nor/s rkB_dir/s wkB_dir/s rkB_svr/s wkB_svr/s ops/s rops/s wops/s
192.168.1.65:/mnt/home1 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
Filesystem: rkB_nor/s wkB_nor/s rkB_dir/s wkB_dir/s rkB_svr/s wkB_svr/s ops/s rops/s wops/s
192.168.1.65:/mnt/home1 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
Filesystem: rkB_nor/s wkB_nor/s rkB_dir/s wkB_dir/s rkB_svr/s wkB_svr/s ops/s rops/s wops/s
192.168.1.65:/mnt/home1 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
Filesystem: rkB_nor/s wkB_nor/s rkB_dir/s wkB_dir/s rkB_svr/s wkB_svr/s ops/s rops/s wops/s
192.168.1.65:/mnt/home1 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
Filesystem: rkB_nor/s wkB_nor/s rkB_dir/s wkB_dir/s rkB_svr/s wkB_svr/s ops/s rops/s wops/s
192.168.1.65:/mnt/home1 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
在这个简单的示例中,我使用了下面两个参数:
? 我选择输出以千字节(-K)为单位显示,如果省略掉这个参数,输出内容将以块为单位显示,另外,你可以使用(-m)参数以兆字节为单位显示。
? 以1秒为间隔显示命令的执行结果。
下面我们一起来看看nfsiostat都输出了什么内容,从而推断它做了哪些操作。
Nfsiostat输出了大量的内容,咋一看会有点犯晕的感觉,但事实上它和iostat非常类似,输出结果很好理解,其输出由下面几列组成:
? Filesystem:NFS文件系统的名字,前面是NFS服务器名,紧跟着的是NFS客户端上的挂在点。
? rBlk_nor/s (rkB_nor/s, rMB_nor):应用程序使用read(2)系统调用读取的块数量(KB,MB),记住,1块=512字节。
? wBlk_nor/s (wkB_nor/s, wMB_nor/s):应用程序使用write(2)系统调用写入的块数量(KB,MB)。
? rBlk_dir/s (rkB_dir/s, rMB_dir/s):从文件读出,用0_DIRECT标记的块数量。
? wBlk_dir/s (wkB_dir/s, wMB_dir/s):写入文件,用0_DIRECT标记的块数量。
? rBlk_svr/s (rkB_svr/s, rMB_svr/s):NFS客户端通过NFS READ请求从NFS服务器读取的块数量。
? wBlk_svr/s (wkB_svr/s, wMB_svr/s):NFS客户端通过NFS WRITE请求写入NFS服务器的块数量。
? ops/s:每秒发向文件系统的操作数量。
? rops/s:每秒发向文件系统的读操作数量。
? wops/s:每秒发向文件系统的写操作数量。
和iostat一样,nfsiostat生成的第一个报告提供了自系统启动以来的时间间隔统计信息,所有后续的报告使用你指定的时间间隔,基本上,你可以忽略输出结果的第一行,后面的内容才是重点。
上面的示例是单调乏味的,因为它所有测量指标对应的结果都是0,下面来看一个更有趣的东西,在NFS上运行IOzone。
Nfsiostat结合使用IOzone
为了避免nfsiostat的输出结果全部为0,我们需要在NFS客户端上运行iozone,具体怎么配置不重要,我们主要目的是看nfsiostat在NFS客户端上的输出。
运行iozone之前,我使用下面的命令先启动nfsiostat:
[laytonjb@home8 laytonj]$ nfsiostat -k 1
我使用的参数非常简单:
? 我希望以千字节为单位输出(-K)。
? 后面的“1”告诉nfsiostat我希望每秒报告一次,直到我人为中断为止。
由于我还没有启动iozone,第一个输出结果非常无聊。
[laytonj@home8 laytonj]$ nfsiostat -k 1
Linux 2.6.18-194.el5 (home8) 12/04/2010 _i686_ (1 CPU)
Filesystem: rkB_nor/s wkB_nor/s rkB_dir/s wkB_dir/s rkB_svr/s wkB_svr/s ops/s rops/s wops/s
192.168.1.65:/mnt/home1 31077.64 6615356.45 0.00 0.00 29558.11 6614815.04 56400.00 600.00 20100.00
Filesystem: rkB_nor/s wkB_nor/s rkB_dir/s wkB_dir/s rkB_svr/s wkB_svr/s ops/s rops/s wops/s
192.168.1.65:/mnt/home1 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
注意,所有测量指标的值全部为0意味着NFS客户端上挂在的NFS文件系统没有使用活动。
下面是运行iozone后nfsiostat的输出结果。
…
Filesystem: rkB_nor/s wkB_nor/s rkB_dir/s wkB_dir/s rkB_svr/s wkB_svr/s ops/s rops/s wops/s
192.168.1.65:/mnt/home1 82.62 9830530.47 0.00 0.00 0.00 51328.12 15500.00 0.00 12900.00
Filesystem: rkB_nor/s wkB_nor/s rkB_dir/s wkB_dir/s rkB_svr/s wkB_svr/s ops/s rops/s wops/s
192.168.1.65:/mnt/home1 0.00 13107200.00 0.00 0.00 0.00 870530.47 13700.00 0.00 13700.00
Filesystem: rkB_nor/s wkB_nor/s rkB_dir/s wkB_dir/s rkB_svr/s wkB_svr/s ops/s rops/s wops/s
192.168.1.65:/mnt/home1 0.00 4915200.00 0.00 0.00 0.00 1126400.00 1200.00 0.00 1100.00
Filesystem: rkB_nor/s wkB_nor/s rkB_dir/s wkB_dir/s rkB_svr/s wkB_svr/s ops/s rops/s wops/s
192.168.1.65:/mnt/home1 0.00 24576000.00 0.00 0.00 0.00 19616400.00 21300.00 0.00 21100.00
Filesystem: rkB_nor/s wkB_nor/s rkB_dir/s wkB_dir/s rkB_svr/s wkB_svr/s ops/s rops/s wops/s
192.168.1.65:/mnt/home1 0.00 0.00 0.00 0.00 0.00 1126400.00 1100.00 0.00 1100.00
Filesystem: rkB_nor/s wkB_nor/s rkB_dir/s wkB_dir/s rkB_svr/s wkB_svr/s ops/s rops/s wops/s
192.168.1.65:/mnt/home1 0.00 0.00 0.00 0.00 0.00 1126400.00 1100.00 0.00 1100.00
Filesystem: rkB_nor/s wkB_nor/s rkB_dir/s wkB_dir/s rkB_svr/s wkB_svr/s ops/s rops/s wops/s
192.168.1.65:/mnt/home1 0.00 0.00 0.00 0.00 0.00 1126400.00 1100.00 0.00 1100.00
Filesystem: rkB_nor/s wkB_nor/s rkB_dir/s wkB_dir/s rkB_svr/s wkB_svr/s ops/s rops/s wops/s
192.168.1.65:/mnt/home1 0.00 0.00 0.00 0.00 0.00 1126400.00 1200.00 0.00 1100.00
Filesystem: rkB_nor/s wkB_nor/s rkB_dir/s wkB_dir/s rkB_svr/s wkB_svr/s ops/s rops/s wops/s
192.168.1.65:/mnt/home1 0.00 0.00 0.00 0.00 0.00 1228800.00 1100.00 0.00 1200.00
Filesystem: rkB_nor/s wkB_nor/s rkB_dir/s wkB_dir/s rkB_svr/s wkB_svr/s ops/s rops/s wops/s
192.168.1.65:/mnt/home1 0.00 0.00 0.00 0.00 0.00 1126400.00 1100.00 0.00 1100.00
Filesystem: rkB_nor/s wkB_nor/s rkB_dir/s wkB_dir/s rkB_svr/s wkB_svr/s ops/s rops/s wops/s
192.168.1.65:/mnt/home1 0.00 0.00 0.00 0.00 0.00 1126400.00 1100.00 0.00 1100.00
Filesystem: rkB_nor/s wkB_nor/s rkB_dir/s wkB_dir/s rkB_svr/s wkB_svr/s ops/s rops/s wops/s
192.168.1.65:/mnt/home1 0.00 0.00 0.00 0.00 0.00 1126400.00 1100.00 0.00 1100.00
Filesystem: rkB_nor/s wkB_nor/s rkB_dir/s wkB_dir/s rkB_svr/s wkB_svr/s ops/s rops/s wops/s
192.168.1.65:/mnt/home1 0.00 0.00 0.00 0.00 0.00 1228800.00 1200.00 0.00 1200.00
Filesystem: rkB_nor/s wkB_nor/s rkB_dir/s wkB_dir/s rkB_svr/s wkB_svr/s ops/s rops/s wops/s
192.168.1.65:/mnt/home1 0.00 0.00 0.00 0.00 0.00 1126400.00 1100.00 0.00 1100.00
Filesystem: rkB_nor/s wkB_nor/s rkB_dir/s wkB_dir/s rkB_svr/s wkB_svr/s ops/s rops/s wops/s
192.168.1.65:/mnt/home1 0.00 0.00 0.00 0.00 0.00 1126400.00 1100.00 0.00 1100.00
Filesystem: rkB_nor/s wkB_nor/s rkB_dir/s wkB_dir/s rkB_svr/s wkB_svr/s ops/s rops/s wops/s
192.168.1.65:/mnt/home1 0.00 0.00 0.00 0.00 0.00 1126400.00 1100.00 0.00 1100.00
Filesystem: rkB_nor/s wkB_nor/s rkB_dir/s wkB_dir/s rkB_svr/s wkB_svr/s ops/s rops/s wops/s
192.168.1.65:/mnt/home1 0.00 0.00 0.00 0.00 0.00 1126400.00 1100.00 0.00 1100.00
Filesystem: rkB_nor/s wkB_nor/s rkB_dir/s wkB_dir/s rkB_svr/s wkB_svr/s ops/s rops/s wops/s
192.168.1.65:/mnt/home1 0.00 0.00 0.00 0.00 0.00 1228800.00 1200.00 0.00 1200.00
Filesystem: rkB_nor/s wkB_nor/s rkB_dir/s wkB_dir/s rkB_svr/s wkB_svr/s ops/s rops/s wops/s
192.168.1.65:/mnt/home1 0.00 0.00 0.00 0.00 0.00 1126400.00 1100.00 0.00 1100.00
Filesystem: rkB_nor/s wkB_nor/s rkB_dir/s wkB_dir/s rkB_svr/s wkB_svr/s ops/s rops/s wops/s
192.168.1.65:/mnt/home1 0.00 0.00 0.00 0.00 0.00 1126400.00 1100.00 0.00 1100.00
Filesystem: rkB_nor/s wkB_nor/s rkB_dir/s wkB_dir/s rkB_svr/s wkB_svr/s ops/s rops/s wops/s
192.168.1.65:/mnt/home1 0.00 0.00 0.00 0.00 0.00 1126400.00 1100.00 0.00 1100.00
Filesystem: rkB_nor/s wkB_nor/s rkB_dir/s wkB_dir/s rkB_svr/s wkB_svr/s ops/s rops/s wops/s
192.168.1.65:/mnt/home1 0.00 0.00 0.00 0.00 0.00 1126400.00 1200.00 0.00 1100.00
Filesystem: rkB_nor/s wkB_nor/s rkB_dir/s wkB_dir/s rkB_svr/s wkB_svr/s ops/s rops/s wops/s
192.168.1.65:/mnt/home1 0.00 0.00 0.00 0.00 0.00 1228800.00 1100.00 0.00 1200.00
Filesystem: rkB_nor/s wkB_nor/s rkB_dir/s wkB_dir/s rkB_svr/s wkB_svr/s ops/s rops/s wops/s
192.168.1.65:/mnt/home1 0.00 0.00 0.00 0.00 0.00 1126400.00 1100.00 0.00 1100.00
Filesystem: rkB_nor/s wkB_nor/s rkB_dir/s wkB_dir/s rkB_svr/s wkB_svr/s ops/s rops/s wops/s
192.168.1.65:/mnt/home1 0.00 0.00 0.00 0.00 0.00 1152800.00 1300.00 0.00 1300.00
Filesystem: rkB_nor/s wkB_nor/s rkB_dir/s wkB_dir/s rkB_svr/s wkB_svr/s ops/s rops/s wops/s
192.168.1.65:/mnt/home1 0.00 0.00 0.00 0.00 0.00 1105200.00 1400.00 0.00 1100.00
Filesystem: rkB_nor/s wkB_nor/s rkB_dir/s wkB_dir/s rkB_svr/s wkB_svr/s ops/s rops/s wops/s
192.168.1.65:/mnt/home1 0.00 0.00 0.00 0.00 0.00 1208400.00 1100.00 0.00 1200.00
Filesystem: rkB_nor/s wkB_nor/s rkB_dir/s wkB_dir/s rkB_svr/s wkB_svr/s ops/s rops/s wops/s
192.168.1.65:/mnt/home1 0.00 0.00 0.00 0.00 0.00 1136000.00 1300.00 0.00 1300.00
Filesystem: rkB_nor/s wkB_nor/s rkB_dir/s wkB_dir/s rkB_svr/s wkB_svr/s ops/s rops/s wops/s
192.168.1.65:/mnt/home1 0.00 0.00 0.00 0.00 0.00 1126400.00 1100.00 0.00 1100.00
Filesystem: rkB_nor/s wkB_nor/s rkB_dir/s wkB_dir/s rkB_svr/s wkB_svr/s ops/s rops/s wops/s
192.168.1.65:/mnt/home1 0.00 0.00 0.00 0.00 0.00 968400.00 2800.00 0.00 1200.00
Filesystem: rkB_nor/s wkB_nor/s rkB_dir/s wkB_dir/s rkB_svr/s wkB_svr/s ops/s rops/s wops/s
192.168.1.65:/mnt/home1 0.00 11468800.00 0.00 0.00 0.00 229600.00 29800.00 0.00 4100.00
Filesystem: rkB_nor/s wkB_nor/s rkB_dir/s wkB_dir/s rkB_svr/s wkB_svr/s ops/s rops/s wops/s
192.168.1.65:/mnt/home1 0.00 14745600.00 0.00 0.00 0.00 1126400.00 1100.00 0.00 1100.00
Filesystem: rkB_nor/s wkB_nor/s rkB_dir/s wkB_dir/s rkB_svr/s wkB_svr/s ops/s rops/s wops/s
192.168.1.65:/mnt/home1 0.00 3276800.00 0.00 0.00 0.00 1126400.00 1100.00 0.00 1100.00
Filesystem: rkB_nor/s wkB_nor/s rkB_dir/s wkB_dir/s rkB_svr/s wkB_svr/s ops/s rops/s wops/s
192.168.1.65:/mnt/home1 0.00 0.00 0.00 0.00 0.00 1126400.00 1100.00 0.00 1100.00
Filesystem: rkB_nor/s wkB_nor/s rkB_dir/s wkB_dir/s rkB_svr/s wkB_svr/s ops/s rops/s wops/s
192.168.1.65:/mnt/home1 0.00 0.00 0.00 0.00 0.00 1126400.00 1200.00 0.00 1100.00
…
从第一行返回结果便可以看出有大量的写入操作,可通过“wKB_nor/s”和“wKB_svr/s”列观察(分别对应应用程序写入的KB数和写入到服务器的KB数),通过“ops/s”列可以得知每秒的I/O操作数,通过“wops/s”列得知每秒的写入操作数。
使用iostat和nfsiostat监控NFS
使用iostat和nfsiostat的全部意义是监控存储上发生的事情,使用NFS时,iostat允许我们监控NFS服务器和每块独立磁盘的性能,我们使用nfsiostat还可以监控NFS客户端上发生了什么,将所有监控结果结合起来便有很大的参考价值,但遗憾的是,现在只能手工处理。
你可以在NFS上运行iostat监控存储设备,例如,你可以在你的NFS服务器上运行iostat查看系统上所有可用的设备和分区。
[root@test64 ~]# iostat -hxm 5
Linux 2.6.30 (test64) 12/04/2010
avg-cpu: %user %nice %system %iowait %steal %idle
0.29 0.02 0.62 0.93 0.00 98.14
Device: rrqm/s wrqm/s r/s w/s rMB/s wMB/s avgrq-sz avgqu-sz await svctm %util
hda 3.40 0.89 4.94 0.98 0.19 0.01 67.06 0.27 45.55 4.44 2.63
hda1 0.60 0.00 0.02 0.00 0.00 0.00 47.63 0.00 10.30 9.35 0.02
hda2 0.09 0.00 0.01 0.00 0.00 0.00 67.29 0.00 10.35 9.97 0.01
hda3 2.69 0.89 4.90 0.98 0.19 0.01 67.12 0.27 45.74 4.45 2.62
sda 0.30 0.00 0.03 0.00 0.00 0.00 29.16 0.00 3.62 3.34 0.01
sda1 0.29 0.00 0.02 0.00 0.00 0.00 36.14 0.00 4.43 3.96 0.01
sdb 0.25 0.00 0.02 0.00 0.00 0.00 33.88 0.00 4.44 4.42 0.01
sdb1 0.23 0.00 0.01 0.00 0.00 0.00 54.96 0.00 3.52 3.52 0.00
sdc 0.07 0.00 0.02 0.00 0.00 0.00 33.07 0.00 5.00 5.00 0.01
sdd 0.09 247.52 0.04 2.97 0.00 0.98 666.97 0.16 52.45 1.79 0.54
sdd1 0.07 247.52 0.03 2.80 0.00 0.98 708.08 0.16 55.69 1.90 0.54
你可以看到所有分区及其性能(在这个例子中,可以看到自启动以来的情况),你可以限制只监控特定的设备/分区,让报告更具可读性。
当你看到某个分区的负载爬升得非常高时,你可以在客户端上使用nfsiostat找出攻击型NFS客户端(虽然你可能已经知道是谁了),你可以在客户端上使用ssh检查NFS负载,找出有嫌疑的客户端(如观察非常大的读或写操作),例如:
[root@test64 ~]# ssh laytonj@192.168.1.8 /usr/local/bin/nfsiostat -k 1
laytonj@192.168.1.8’s password:
Linux 2.6.18-194.el5 (home8) 12/04/2010 _i686_ (1 CPU)
Filesystem: rkB_nor/s wkB_nor/s rkB_dir/s wkB_dir/s rkB_svr/s wkB_svr/s ops/s rops/s wops/s
192.168.1.65:/mnt/home1 32133.69 1320613030.27 0.00 0.00 104036.72 1320612745.12 2500500.00 3200.00 1489400.00
Filesystem: rkB_nor/s wkB_nor/s rkB_dir/s wkB_dir/s rkB_svr/s wkB_svr/s ops/s rops/s wops/s
192.168.1.65:/mnt/home1 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
Filesystem: rkB_nor/s wkB_nor/s rkB_dir/s wkB_dir/s rkB_svr/s wkB_svr/s ops/s rops/s wops/s
192.168.1.65:/mnt/home1 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
在这个例子中看不到任何实质性的东西,但过程都是这样(只要你可以ssh登录到客户端),如果你有大量的客户端,那你不得不打开许多ssh会话。
Iostat和nfsiostat结合使用可以更好的监控NFS存储系统,虽然有些过程需要手工处理,但能同时看到服务器和客户端的情况,你可以更快速地找出那些让服务器不堪负荷的攻击性NFS客户端。