iotop命令是一个用来监视磁盘I/O使用状况的top类工具,iotop具有与top相似的UI,其中包括pid、user、I/O、进程等相关信息等;
//iotop安装: yum -y install iotop //或者编译安装 wget http://guichaz.free.fr/iotop/files/iotop-0.6.tar.gz tar zxf iotop-0.4.4.tar.g python setup.py build python setup.py install
执行iotop显示:
Total DISK READ: 0.00 B/s | Total DISK WRITE: 0.00 B/s TID PRIO USER DISK READ DISK WRITE SWAPIN IO> COMMAND 1 be/4 root 0.00 B/s 0.00 B/s 0.00 % 0.00 % init 2 be/4 root 0.00 B/s 0.00 B/s 0.00 % 0.00 % [kthreadd] 3 rt/4 root 0.00 B/s 0.00 B/s 0.00 % 0.00 % [migration/0] 4 be/4 root 0.00 B/s 0.00 B/s 0.00 % 0.00 % [ksoftirqd/0] 第一行READ和WRITE速率总计; 第二行: tid:线程id,按p可转换进程pid PRIO:优先级 DISK READ:磁盘读取速率 DISK WRITE:磁盘写取速率 SWAPIN:swap交换百分比 IO>:IO等待所占用百分比 COMMAND:线程/进程详细信息
命令格式:
iotop -[选项]
--version://显示程序的版本号并退出
-h, --help://显示此帮助消息并退出
-o, --only://仅显示实际执行I / O的进程或线程,只显示在划硬盘的程序
-b, --batch://非交互模式,批量处理 用来记录日志的
-n NUM, --iter=NUM://设定循环几次
-d SEC, --delay=SEC://设定显示时间间隔[秒]
-p PID, --pid=PID://要监控的进程/线程[全部]
-u USER, --user=USER://用户监控[全部]
-P, --processes://只显示进程,而不是所有线程
-a, --accumulated://显示累积的I / O而不是带宽
-k, --kilobytes://使用千字节而不是人性化的单位
-t, --time://在每一行上添加一个时间戳(暗示--batch)
-q, --quiet://抑制一些标题行(暗示--batch)
怎么获取该程序正在读的什么文件;
这个问题其实很简单,通过 lsof 命令我们就可以达到目的:lsof -c APPname
同样,如果我们知道了被频繁读取的文件是哪个,也可以反查程序:
iotop查看用户进程,lsof -p pid在按该用户进程 pid 查看所打开的文件,lsof -u username按用户名查看打开的文件,
列出某用户的某进程打开的文件lsof -u USERNAME -c APPNAME;
也是可以根据目录进行查询:lsof | grep path;
结论:
1.我们给服务器做压力测试时,有的时候很容易碰到磁盘IO读取瓶颈,持续高的IO会导致磁盘读取密集读写磁盘IO成为短板,程序运行过慢;常见的IO服务器例如:数据库服务器,文件服务器,视频服务器等;
2.使用top命令查看%wa指标,该项阈值表示io waiting等待磁盘磁盘写入完成的时间,一般不能高于30%,假如该值过大且持续很久,就证明遇到了I/O瓶颈,需要对软件进行优化,或对硬件进行升级;
3.iostat -d -x 1输出磁盘相关统计信息;
4.iotop定位负载来源于那个进程/线程
5.可以使用pt-ioprofile工具定位IO文件信息;(是Percona公司开发用于管理MySQL的工具)
或者使用下列命令进行IO文件定位:
1.lsof -c oracle //
2.lsof | grep path /oracle/app/oracle.........................
3.iotop //查看用户进程
4.lsof -p pid //查看该用户下打开的文件
5.lsof -u oracle -c oracle
lsof命令输出属性字段说明: COMMAND:进程的名称 PID:进程标识符 USER:进程所有者 FD:文件描述符,应用程序通过文件描述符识别该文件。如cwd、txt等 TYPE:文件类型,如DIR、REG等 DEVICE:指定磁盘的名称 SIZE:文件的大小 NODE:索引节点(文件在磁盘上的标识) NAME:打开文件的确切名称
补充:如何进行 io 瓶颈测试?
如何进行大文件IO测试: 1.生成 5g 大小的文件并输出时间,执行速度等信息 time dd if=/dev/zero of=test.file bs=1G count=5 2.测试写入20G数据,数据量越大,测试值应该更精确 sync;/usr/bin/time -p bash -c "(dd if=/dev/zero of=test.dd bs=1M count=20000)" sync;/usr/bin/time -p bash -c "(dd if=/dev/zero of=test.dd bs=1000K count=20000;sync)" dd bs=1M count=20000 if=/dev/zero of=test.dd conv=fdatasync dd命令测试是IO的顺序写和读方
另附查看进程工具iopp:http://haibing.org/?p=235