我如何才能找出随着时间推移写入特定磁盘的进程?
在我的特定情况下,我有一个全天候运行的小型家庭服务器,并且我在 crontab 中包含了一个脚本来关闭所有未使用的驱动器(/proc/diskstats 15 分钟内没有变化)。
但我的系统盘根本就停不下来。我怀疑是日志的问题,但可能不仅仅是日志在写入系统盘上的文件系统,我不想把日志文件全部移动到其他地方,结果却发现磁盘仍然没有停止旋转,而我对此无能为力。
答案1
我不知道,但我确实猜测你对此无能为力。我的理由如下:
当您说“系统磁盘”时,我想您指的是保存根文件系统的磁盘。
根文件系统包含多个目录和文件,它们由各种实用程序监视,包括/etc/cron.*
由 cron 监视和执行的目录和文件。您可能可以将 /etc 放在与 / 不同的文件系统上,但这几乎肯定会带来比它本身更多的麻烦,而且这肯定不是常见的设置。
/proc/diskstats
包括磁盘读取活动,而不仅仅是写入。
每次 cron 执行您的脚本来检查是否有任何磁盘活动时,这几乎肯定会导致从各个位置多次读取(即使没有写入):crontabs、命令解释器、它们使用的库等。除非您使用运行系统noatime
,否则这些读取还会导致写入以更新相关文件/inode 上的访问时间时间戳。
因此,每次执行脚本时,根据 /proc/diskstats 检查是否有任何磁盘活动,这本身就根据 /proc/diskstats 得出磁盘活动结果。因此,您的“无变化值”标准将永远无法满足,驱动器也永远不会停止旋转。
如果这对您来说是一个主要问题,我建议将根文件系统上不必要的所有内容移到其他文件系统,并从 SSD 或闪存设备运行根文件系统,甚至可以以只读方式安装。这应该允许旋转盘片驱动器在没有明确活动时关闭。但是,我想这样做可能会得不偿失。如果您只是想让驱动器旋转以消除噪音,将根文件系统上现有的内容移动到小型固态设备(SSD 或闪存)可能会以少得多的努力完成同样的目标。只需考虑到它们在出现故障之前的写入周期数有限(至少,考虑使用noatime
或使用专为 SSD 设计的文件系统运行)。
答案2
使用命令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 be/4 root 0.00 B/s 0.00 B/s 0.00 % 0.00 % [ksoftirqd/0]
4 be/4 root 0.00 B/s 0.00 B/s 0.00 % 0.00 % [kworker/0:0]
6 rt/4 root 0.00 B/s 0.00 B/s 0.00 % 0.00 % [migration/0]
7 rt/4 root 0.00 B/s 0.00 B/s 0.00 % 0.00 % [watchdog/0]
8 rt/4 root 0.00 B/s 0.00 B/s 0.00 % 0.00 % [migration/1]
10 be/4 root 0.00 B/s 0.00 B/s 0.00 % 0.00 % [ksoftirqd/1]
11 be/4 root 0.00 B/s 0.00 B/s 0.00 % 0.00 % [kworker/0:1]
12 rt/4 root 0.00 B/s 0.00 B/s 0.00 % 0.00 % [watchdog/1]
13 be/0 root 0.00 B/s 0.00 B/s 0.00 % 0.00 % [cpuset]
14 be/0 root 0.00 B/s 0.00 B/s 0.00 % 0.00 % [khelper]
15 be/4 root 0.00 B/s 0.00 B/s 0.00 % 0.00 % [kdevtmpfs]
16 be/0 root 0.00 B/s 0.00 B/s 0.00 % 0.00 % [netns]
17 be/4 root 0.00 B/s 0.00 B/s 0.00 % 0.00 % [sync_supers]
18 be/4 root 0.00 B/s 0.00 B/s 0.00 % 0.00 % [bdi-default]
19 be/0 root 0.00 B/s 0.00 B/s 0.00 % 0.00 % [kintegrityd]
20 be/0 root 0.00 B/s 0.00 B/s 0.00 % 0.00 % [kblockd]
21 be/0 root 0.00 B/s 0.00 B/s 0.00 % 0.00 % [ata_sff]
22 be/4 root 0.00 B/s 0.00 B/s 0.00 % 0.00 % [khubd]
23 be/0 root 0.00 B/s 0.00 B/s 0.00 % 0.00 % [md]
24 be/4 root 0.00 B/s 0.00 B/s 0.00 % 0.00 % [kworker/1:1]
25 be/4 root 0.00 B/s 0.00 B/s 0.00 % 0.00 % [khungtaskd]
26 be/4 root 0.00 B/s 0.00 B/s 0.00 % 0.00 % [kswapd0]
27 be/5 root 0.00 B/s 0.00 B/s 0.00 % 0.00 % [ksmd]
另外使用命令iostat
,其示例输出如下所示:
Linux 3.2.6 (z) 10/03/2012 _i686_ (2 CPU)
avg-cpu: %user %nice %system %iowait %steal %idle
0.14 0.01 0.26 0.01 0.00 99.59
Device: tps Blk_read/s Blk_wrtn/s Blk_read Blk_wrtn
sda 0.81 13.67 9.14 8968739 5996546
答案3
lsofunix中的命令可以帮助您找到文件系统中正在使用和写入的打开文件的列表。
根据您的要求,此命令有多个选项,请通过 Google 搜索更多信息。