文件被哪个进程使用,写数据不是用lsof可以找出来吗,但现实情况是lsof没找出来T_T
背景CentOS7 在某一段时间监控报警磁盘使用率达99%,由于监控属于概要形式信息,没有快照信息的监控(能发现某进程的I/O,CPU消耗情况),所以需要在服务器上去定时执行统计命令获取快照信息。
需要通过iostat -dx -k去查看avgqu-sz、await、svctm、%util;
sar -u查看%iowait、%user;
pidstat -d 查看进程I/O读写的快照信息
生成统计信息文件
cat>/tmp/at_task.sh<<EOF pidstat -d 2 >/tmp/pidstat_\`date +%F_%T\`.log 2>& 1 & sar -u 2 >/tmp/sar_\`date +%F_%T\`.log 2>& 1 & while [ 1 ];do echo -n \`date +%T\` >>/tmp/iostat_\`date +%F\` 2>& 1 && iostat -dx -k 1 1 >>/tmp/iostat_\`date +%F\` 2>& 1; sleep 2; done & EOF在while循环中使用iostat的原因是要输出date +%T时间,不然只有数据,没有时间信息也没有什么用
使用at 命令定时执行
at 15:14 today -f /tmp/at_task.sh出现错误
Can't open /var/run/atd.pid to signal atd. No atd running?
重启atd服务
service atd restart
重新开启at定时任务
at 15:14 today -f /tmp/at_task.sh
job 2 at Wed Mar 13 15:14:00 2019
得到如下快照信息
iostat
sar
03:14:00 PM CPU %user %nice %system %iowait %steal %idle 03:14:02 PM all 0.25 0.00 0.38 0.00 0.00 99.37 03:14:04 PM all 1.25 0.13 0.63 0.00 0.00 97.99 03:14:06 PM all 0.25 0.13 0.50 0.00 0.00 99.12 03:14:08 PM all 0.50 0.00 0.50 0.63 0.00 98.37pidstat
03:14:00 PM UID PID kB_rd/s kB_wr/s kB_ccwr/s Command 03:14:02 PM 5700 9089 0.00 6.00 0.00 uxxx 03:14:02 PM 5700 9140 0.00 6.00 0.00 uxxx 03:14:02 PM 5700 9292 0.00 10.00 0.00 uxxx 03:14:02 PM 0 18084 0.00 2.00 0.00 bashkill 掉收集信息的命令
ps -ef | egrep 'iostat|sar|pidstat|while' | grep -v grep | awk '{print $2}' | xargs -l kill*但ps -ef | egrep 命令没有获取到while循环的pid,不kill掉该while循环,就会一直对/tmp/iostat_2019-03-13写数据-_-*
通过lsof 没有定位到打开文件的进程
lsof /tmp/iostat_2019-03-13 [root@ip-10-186-60-117 ~]# [root@ip-10-186-60-117 ~]#通过lsof 可以定位到打开mysql-error.log的进程
lsof /opt/mysql/data/5690/mysql-error.log COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME mysqld 12858 actiontech-universe 1w REG 253,1 6345 20083533 /opt/mysql/data/5690/mysql-error.log mysqld 12858 actiontech-universe 2w REG 253,1 6345 20083533 /opt/mysql/data/5690/mysql-error.log可见,某进程只有一只持有某文件的inode,才可以通过lsof查看文件在被那些进程使用
获取写文件的进程号安装sysemtap
yum -y install systemtap
SystemTap 是对 Linux 内核监控和跟踪的工具
利用systemtap中的inodewatch.stp工具来查找写文件的进程号
得到文件的inode
stat -c '%i' /tmp/iostat_2019-03-13 4210339获取文件所在设备的major,minor
ls -al /dev/vda1 brw-rw---- 1 root disk 253, 1 Jan 30 13:57 /dev/vda1得到写文件的pid
stap /usr/share/systemtap/examples/io/inodewatch.stp 253 1 4210339 Checking "/lib/modules/3.10.0-862.14.4.el7.x86_64/build/.config" failed with error: No such file or directory Incorrect version or missing kernel-devel package, use: yum install kernel-devel-3.10.0-862.14.4.el7.x86_64根据系统内核版本在kernel-devel rpm build for : Scientific Linux 7网站上下载相应的kernal-devel包
wget ftp://ftp.pbone.net/mirror/ftp.scientificlinux.org/linux/scientific/7.2/x86_64/updates/security/kernel-devel-3.10.0-862.14.4.el7.x86_64.rpm rpm -ivh kernel-devel-3.10.0-862.14.4.el7.x86_64.rpm再次执行stap
stap /usr/share/systemtap/examples/io/inodewatch.stp 253 1 4210339
......
Missing separate debuginfos, use: debuginfo-install kernel-3.10.0-862.14.4.el7.x86_64
Pass 2: analysis failed. [man error::pass2]
Number of similar error messages suppressed: 2.
安装debuginfo kernal
debuginfo-install kernel-3.10.0-862.14.4.el7.x86_64 Verifying : kernel-debuginfo-common-x86_64-3.10.0-862.14.4.el7.x86_64 1/3 Verifying : yum-plugin-auto-update-debug-info-1.1.31-50.el7.noarch 2/3 Verifying : kernel-debuginfo-3.10.0-862.14.4.el7.x86_64 3/3 Installed: kernel-debuginfo.x86_64 0:3.10.0-862.14.4.el7 yum-plugin-auto-update-debug-info.noarch 0:1.1.31-50.el7 Dependency Installed: kernel-debuginfo-common-x86_64.x86_64 0:3.10.0-862.14.4.el7