我需要收集一些数据,了解系统上每个进程对某个磁盘的写入量。我只对一周后的总数感兴趣。我也需要一些类似的文件数据。例如,我想知道一周内写入数据最多的前 10 个文件,以及每个文件的确切写入量。
为了说明,最终结果应该是两个表/文本文件/任何可管理的文件格式,其中包含如下数据:
按工艺流程:
Process Total amount of data written to /dev/sda by that process in a week
-------- ----------
logdaemon 101 GB
gvfsd-sftp --spawner :1.19 /org/gtk/gvfs/exec_spaw/2 [pool] 30 GB
openoffice 50 GB
[jbd2/dm-0-2] 2 GB
...
按文件:
File Total amount written to that file last week
-------- --------
/var/log/some_giant_logfile.log 100 GB
/home/confus/Videos/great_big_video.mpg 16 GB
...
我怎样才能实现这个目标?
答案1
您可以编写一个 bash 脚本来执行此操作...并在 crontab 中将其设置为每周运行并将其输出写入文件
*识别特定进程已向文件写入多少内容,如下所示:
#get its pid
PID=`ps -ef | awk '/<process_name>/ {print $2}'`
#print out size and filename
lsof -p ${PID} | awk '/<file_you_want>/ {print $7"\t"$NF}' | sort -u
#find out device on which above file is located
df /path/to/file_you_want | awk '/\/dev/ {print $0}'
*计算一周内写入文件的内容量,如下所示:
#issue the below command and save the output to a file
NEW=`du /path/to/file_you_want | tee -a /path/to/store_value.txt`
#read the output one week later
OLD_VAL=`grep '/path/to/file_you_want' /path/to/store_value.txt | awk '{print $1}'`
#overwrite new value and store it in memory
NEW=`du /path/to/file_you_wan | tee -a /path/to/store_value.txt`
NEW_VAL=`echo $NEW | awk '{print $1}'`
#calculate delta
DELTA=`echo "${NEW_VAL}-${OLD_VAL}" | bc
# print the amount of bytes that have been written in 1 week
echo $DELTA
答案2
我只是在这里部分回答你的第一句话,按进程写入的数据量,将这些 IO 链接到哪个磁盘将需要更多的工作来关联进程 IO 和磁盘 IO 信息(并且很可能在高 IO 负载下中断)。
获取此信息的一个选项是使用网络数据记录应用程序对磁盘的读写操作。
您可以将其存储到时间序列数据库中,例如 infuxDB(netdata 可以原生执行此操作),然后使用 grafana 或任何其他查询工具获取每个应用程序的汇总值,或者从应用程序插件中获取灵感源代码通过进程解析 /proc 文件系统来获取所需信息的值。
如何获取所有进程的信息(交换)的示例如下这里(我链接到我自己的答案,因为它不会循环find
结果,而且速度确实提高了)
另外一个选择或许深入研究审计守护进程在 Linux 上查看 aureport 是否能为您提供所需的信息。我从未为此配置过 auditd,Google 上有很多关于它的教程,涵盖了各个方面,但这个教程听起来您需要深入研究手册页并进行大量测试。
答案3
为了获得“按流程”的实时视图,我建议:
sudo iotop -a -o -P
'-a' 累积读取/写入的数据
'-o' 仅显示具有 I/O 的进程
'-P' 仅显示进程而不是所有正在运行的线程
缺点:如果进程每次运行后都完成,iotop 就看不到它。
为了查找经常更改的文件,我使用此命令:
sudo inotifywait -e modify -e attrib -e move -e create -e delete -m -r /var /home
您可能需要增加监视的数量:
sudo sh -c "echo 180000 > /proc/sys/fs/inotify/max_user_watches"
这不会显示写入的数据量,但它将有助于追踪正在更改的文件及其更改频率。