饱受服务器overload之苦,排除了CPU的瓶颈之后,剩下就是排查IO的问题了。
用iostat -x 5 发现IO确实很大, %util基本上在100%左右,说明有问题;但具体是什么进程在作怪呢?
找了两个工具:
iotop用python写的,要求python2.5以上,而且系统内核在2.6.20以上,而我的centos只是2.6.18无法使用
dstat还不错
下载
wget http://dstat.sourcearchive.com/downloads/0.7.2-2/dstat_0.7.2.orig.tar.gz
解压后可用
先看看包含那些modules 使用命令:
/dstat --list
internal:
aio, cpu, cpu24, disk, disk24, disk24old, epoch, fs, int, int24, io, ipc, load, lock, mem, net, page, page24, proc, raw, socket,
swap, swapold, sys, tcp, time, udp, unix, vm
/usr/sky/soft/dstat/dstat/plugins:
battery, battery-remain, cpufreq, dbus, disk-tps, disk-util, dstat, dstat-cpu,dstat-ctxt, dstat-mem, fan, freespace, gpfs, gpfs-ops, helloworld, innodb-buffer, innodb-io, innodb-ops, lustre, memcache-hits, mysql-io, mysql-keys, mysql5-cmds, mysql5-conn,
mysql5-io, mysql5-keys, net-packets, nfs3, nfs3-ops, nfsd3, nfsd3-ops, ntp, postfix, power, proc-count, qmail, rpc, rpcd, sendmail, snooze, squid, test, thermal, top-bio, top-bio-adv, top-childwait, top-cpu, top-cpu-adv, top-cputime, top-cputime-avg, top-int,top-io, top-io-adv, top-latency, top-latency-avg, top-mem, top-oom, utmp, vm-memctl, vmk-hba, vmk-int, vmk-nic, vz-cpu, vz-io, vz-ubc, wifi
内容很多
我们这里只用到top-io top-bio
dstat --top-io -d --top-bio -l
i/o process | read writ| block i/o process | 1m 5m 15m
nginx: work1407k 1718k| 0 1980k|syslogd 0 200k|4.99 4.97 5.04
nginx: work 603k 878k| 0 1644k|syslogd 0 212k|4.99 4.97 5.04
java 14M 14M| 0 1876k|java 0 14M|5.55 5.09 5.08
java 15M 15M| 0 18M|java 0 15M|5.55 5.09 5.08
java 15M 16M| 0 23M|java 0 16M|5.55 5.09 5.08
java 4216k 4272k| 0 13M|java 0 4272k|5.55 5.09 5.08
java 15M 16M| 0 12M|java 0 16M|5.55 5.09 5.08
java 17M 17M| 0 16M|java 0 17M|5.59 5.10 5.08
可以看出是java的进程有些问题,但是那个进程号还得查资料。
使用命令:
dstat --top-io-adv
./dstat -t --top-io-adv -d -l
09-02 14:32:00|java 13863 19M 19M2.2%| 0 15M|6.34 6.05 6.02
09-02 14:32:01|java 13863 16M 18M3.2%| 0 20M|6.34 6.05 6.02
09-02 14:32:02|java 13863 20M 16M3.4%| 0 13M|6.34 6.05 6.02
09-02 14:32:03|java 13863 14M 15M5.9%| 0 1724k|6.34 6.05 6.02
09-02 14:32:04|java 13863 17M 18M2.7%| 0 30M|6.34 6.05 6.02
09-02 14:32:05|java 13863 14M 14M2.0%| 0 21M|6.32 6.05 6.02
09-02 14:32:06|java 138636840k3726k0.8%| 0 10M|6.32 6.05 6.02
09-02 14:32:07|nginx: worker process1538 1120k1490k0.2%| 0 1748k|6.32 6.05 6.02
例1、复制某个文件夹下所有的文件和目录到指定文件夹下。
错误用法:cp $src/* $dst/
现象:隐藏文件和文件夹不会被拷贝
正确用法: cp $src/. $dst/
例2、解压压缩包中的指定文件到指定目录
tar a.tgz -C $dst a/b/c.txt
其中c.txt在压缩包中。
可以使用tar tzf a.tgz 查看文件列表,其中应该有a/b/c.txt
介绍:
在linux下修改当前磁盘的一些信息,如磁盘的卷标,日志参数等,可能用到下面的一些参数。
这里为大家介绍几个修改磁盘参数的命令,感兴趣的朋友参考下。
1. mknod
用法:mknod 设备名称 【bcp】【Major】【Minor】
设备种类,
b : 设置设备名称为外部的外部的存储设备文件 eg:硬盘
c : 设置设备名称为外部输入设备文件 eg:键盘/鼠标
P : 设置设备名称为FIFO文件
Major:主要设备名称代码
Minor:次要设备代码
例子:#mknod /dev/hda10 3 10
注:3 和10 只有特殊意义的,不可随意的设置
在linux系统中,所有的设备都是以文件的形式来表示的,也就是通过文件的主 与 次 来表示的,硬盘的主与次如下所示:
硬盘代号 主【Major】 次【Minor】
/dev/sda 3 0~63
/dev/sdb 3 64~127
/dev/sdc 22 0~63
/dev/sdd 2264~127
2.e2label
#e2label 设备名称 新的Label名称
#e2label /dev/sda1 sda1
#dumpe2fs -h /dev/sda1
该命令的主要的主要作用是用来修改“磁盘的表头数据”,即磁盘的卷标。
注意:如果你刚好有两个硬盘,如果你修改了卷标,刚好和另外的有个分区有相同的卷标,系统就无法判断哪个分区是正确的。
3.tune2fs
#tune2fs 【-jlL】 设备号
-j:将ext2的文件系统转换为ext3的文件系统
-l:将超级快内的数据度出来,该功能类似于dumpe2fs -h的功能
-L:修改文件系统的卷标,类似于e2label的功能
例子:#tune2fs -l /dev/sda1
更多的功能请参考man tune2fs
4.hdparm
如果硬盘有DMA模式的功能,系统却没有启动它,那么,硬盘的读取性能可能会降低一半以上,就可以使用该命令来启动DMA模式的功能。该命令有很多的高级的参数设置值,所以不建议随便的修改,否则容易造成硬盘崩溃,使用这个命令,最多的就是启动DMA功能,并测试硬盘的访问性能就可以了。
#hdparm 【-icdmXTt】 设备名称
-i:将系统启动过程中使用的本身的核心的驱动程序来测试硬盘的测试值取出来,但是这些值不一定是正确的
-d:设置是否启用dma模式,-d1为启动,-d0为取消。