最近给客户交付新系统,然后客户反应服务器硬盘使用的增量有点异常,5天用掉了3个G,由于我们做的是一个采集系统,服务器每隔几分钟就会接收上千台终端的数据,但是以前没有遇到过增值量那么大的情况。简单检查了一下数据库,发现数据量增长没有异常。于是挨个检查是不是有服务拼命的输出日志,也没有异常。最后打算监控到底是哪个进程在进行大量的IO操作,决定把这个过程中用到的一些指令记录下来。
查看线程IO状态
pidstat -d 1
1
表示每隔1秒打印一次
控制台输出的结果:
Average: UID PID kB_rd/s kB_wr/s kB_ccwr/s Command
Average: 0 406 0.00 17.00 0.00 jbd2/vda1-8
Average: 0 857 0.00 2.00 0.00 exe
Average: 0 4115 1.00 0.00 0.00 kworker/u8:0
Average: 0 4658 601.00 0.00 0.00 sshd
Average: 0 5155 0.00 44.00 0.00 java
Average: 0 6019 0.00 16.00 0.00 java
Average: 0 6569 0.00 18.00 0.00 java
Average: 0 8958 0.00 20.00 0.00 java
Average: 0 11407 35.00 18.00 0.00 java
Average: 0 15302 0.00 16.00 0.00 java
Average: 0 15771 13.00 19.00 0.00 java
Average: 0 17422 20.00 21.00 0.00 java
Average: 0 20389 0.00 18.00 0.00 java
Average: 0 20713 1.00 18.00 0.00 java
Average: 0 20785 12.00 20.00 0.00 java
Average: 0 23573 7.00 20.00 0.00 java
Average: 0 25532 1301.00 0.00 0.00 AliYunDun
Average: 0 27592 0.00 1.00 0.00 pidstat
Average: 0 28715 0.00 29.00 0.00 java
但是我需要记录一段时间的信息,不可能一直在控制台打印,于是使用重定向
来将控制台信息打印到文件中:
1> yourfile.log
"1>"代表重定向,后面跟你需要记录的文件名(没有则会自动创建),会覆盖原有文件的内容。
1>> yourfile.log
与上面的用法一样,但是是在文件末尾进行追加,不会覆盖原有文件的内容。
查看磁盘IO情况
iostat -x -k -d 1
同样1
代表时间间隔,单位是秒。
输出:
Device: rrqm/s wrqm/s r/s w/s rkB/s wkB/s avgrq-sz avgqu-sz await r_await w_await svctm %util
vda 0.00 0.00 0.00 143.00 0.00 584.00 8.17 0.10 0.69 0.00 0.69 0.16 2.30
vdb 4.00 0.00 15.00 14.00 76.00 68.00 9.93 0.01 0.45 0.60 0.29 0.31 0.90
完整的shell
脚本:
#!/bin/sh
CURRENT_DIR=`pwd`
PIDFILE="$CURRENT_DIR/disk.pid"
iostat -x -k -d 1 1>> io-disk.log &
pidstat -d 1 1>> io-thread.log &
pid=$!
echo $pid > $PIDFILE
echo 'io-logs started !'
运行此脚本后过一段时间分析io-disk.log
和io-thread.log
就可以了。