文件被那個進(jìn)程使用,寫數(shù)據(jù)不是用lsof可以找出來嗎,但現(xiàn)實情況是lsof沒找出來。
背景
centos7 在某一段時間監(jiān)控報警磁盤使用率達(dá)99%,由于監(jiān)控屬于概要形式信息,沒有快照信息的監(jiān)控(能發(fā)現(xiàn)某進(jìn)程的I/O,CPU消耗情況),所以需要在服務(wù)器上去定時執(zhí)行統(tǒng)計命令獲取快照信息。
需要通過iostat -dx -k去查看avgqu-sz、await、svctm、%util;
sar -u查看%iowait、%user;
pidstat -d 查看進(jìn)程I/O讀寫的快照信息
步驟
生成統(tǒng)計信息文件
在while循環(huán)中使用iostat的原因是要輸出date +%T時間,不然只有數(shù)據(jù),沒有時間信息也沒有什么用
使用at 命令定時執(zhí)行
at 15:14 today -f /tmp/at_task.sh
出現(xiàn)錯誤
Can't open /var/run/atd.pid to signal atd. No atd running?
重啟atd服務(wù)
service atd restart
重新開啟at定時任務(wù)
得到如下快照信息
iostat
sar
pidstat
kill 掉收集信息的命令
但ps -ef | egrep 命令沒有獲取到while循環(huán)的pid,不kill掉該while循環(huán),就會一直對/tmp/iostat_2019-03-13寫數(shù)據(jù)-_-
通過lsof 沒有定位到打開文件的進(jìn)程
通過lsof 可以定位到打開mysql-error.log的進(jìn)程
可見,某進(jìn)程只有一只持有某文件的inode,才可以通過lsof查看文件在被那些進(jìn)程使用
獲取寫文件的進(jìn)程號
安裝sysemtap
yum -y install systemtap
SystemTap 是對 Linux 內(nèi)核監(jiān)控和跟蹤的工具
利用systemtap中的inodewatch.stp工具來查找寫文件的進(jìn)程號
得到文件的inode
獲取文件所在設(shè)備的major,minor
得到寫文件的pid
根據(jù)系統(tǒng)內(nèi)核版本在kernel-devel rpm build for : Scientific Linux 7網(wǎng)站上下載相應(yīng)的kernal-devel包
再次執(zhí)行stap
安裝debuginfo kernal
再次執(zhí)行stap
添加 -v查看詳細(xì)報錯
修改
再次執(zhí)行
可見已經(jīng)得到了寫/tmp/iostat_date +%F 文件的進(jìn)程號,但進(jìn)程號一直在打印出來,因為后臺進(jìn)程iostat -dx -m 的在while循環(huán)中的,每隔sleep 2s 后就會執(zhí)行一次iostat 產(chǎn)生新的pid。
那要怎樣才能讓iostat -dx -m 停止寫/tmp/iostat_date +%F 文件了?除了重啟大法好 $_$
rm -rf 也不能終止后臺的while iostat進(jìn)程寫文件,刪除了文件后,while循環(huán)又會生成新的文件
正確做法