如何查找定期将哪个进程写入磁盘?


40

我如何找到哪个进程正在不断写入磁盘?

我希望自己的工作站接近无声,我只是用安静的风扇等来构建一个新系统(P8B75-M + Core i5 3450s-之所以因为它的最大TDP较低)而安装了Debian Wheezy 64位在上面。

而且有些事情让我紧张:我可以听到某种模式,例如硬盘正在写入或正在寻找某种东西(滴答……滴答……滴答……trrrrrr冲洗并每秒重复一次)。

过去(很多年以前),我也遇到过类似的问题,事实证明这是一些CUPS日志或类似的东西,我只是将一个(不重要)日志记录重定向到了一个(实际的)RAM磁盘。

但是在这里我不确定。

我尝试了以下方法:

ls -lR /var/log > /tmp/a.tmp && sleep 5 && ls -lR /var/log > /tmp/b.tmp && diff /tmp/?.tmp

但那里什么都没有改变。

现在,奇怪的是,当提示我输入我的LVM解密密码的提示出现时,我也听到了模式。

可能是我刚安装的内核/系统中的某物,还是硬盘有故障?

hdparm -tT /dev/sda 报告正确的HD速度(非高速缓存130 GB / s,sata 6GB),并且我已经从大型资源(Emacs)进行安装和编译而没有问题,因此我认为系统不是很糟糕。

(HD是Seagate Barracude 500GB)


您确定这是硬盘发出的噪音吗?(检查风扇,包括PSU风扇。当一根很细的电缆太靠近风扇时会产生非常奇怪的咔嗒声,有时会非常轻微地触摸叶片并弹起几次“咔嗒”声。)
Mat

@Mat:我将硬盘驱动器放在盒子外面(连接器应该足够长),以便确定,我会报告;)
塞德里克·马丁

2
确保您的磁盘文件系统是relatime或noatime挂载的。文件读取可能导致对inode的写入来记录访问时间。
camh 2012年

Answers:


42

您是否尝试检查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]
    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]
 1033 be/4 root        0.00 B/s    0.00 B/s  0.00 %  0.00 % [flush-8:0]
   10 be/4 root        0.00 B/s    0.00 B/s  0.00 %  0.00 % [ksoftirqd/1]

1
感谢您的提示。我不了解iotop。在Debian上,我进行了apt-cache搜索iotop来发现我必须apt-get iotop。很酷的命令!
塞德里克·马丁

3
我使用iotop -o -b -d 10每10秒打印一次读取/写入磁盘的进程列表以及使用的IO带宽量。
ndemou

15

您可以通过启用IO调试echo 1 > /proc/sys/vm/block_dump,然后在/ var / log / syslog中查看调试消息。这样的好处是可以获得具有过去活动的某种类型的日志文件,而iotop只显示当前活动。


3
当block_dump处于活动状态时,启用系统日志记录绝对是疯狂的。日志记录会导致磁盘活动,从而导致日志记录,从而导致磁盘活动等。最好在启用此功能之前停止syslog(并使用dmesg读取消息)
dan3 2013年

您的看法是正确的,尽管效果并不像您描述的那样引人注目。如果您只想看一下磁盘活动,则无需停止syslog守护程序。
scai

我已经尝试了大约2年,但它使我的机器停顿了。这些天之一,如果我没有什么重要的事情
要跑,

我尝试过,什么都没有发生。特别是由于文件系统缓冲。写入syslog不会立即触发写入磁盘。
scai

1
我假设日志消息具有适当的速率一般速率限制,也可以处理这种情况(?)
Volker Siegel 2014年

5

假设磁盘噪音是由于导致写入的过程而不是某些磁盘旋转下降问题所致,则可以使用审核子系统(安装auditd软件包)。监视sync电话及其朋友:

auditctl -S sync -S fsync -S fdatasync -a exit,always

观看日志/var/log/audit/audit.log。如果审核日志本身已刷新,请注意不要这样做!检查/etc/auditd.confflush选项是否设置为none

如果经常刷新文件,则可能是系统日志的罪魁祸首。例如,如果您记录了失败的传入连接尝试,并且有人正在探测您的计算机,则将生成很多条目;例如,这会导致磁盘发出机枪声。使用基本的日志守护程序sysklogd,检查/etc/syslog.conf:如果日志文件名前面没有-,则在每次写操作后将该日志刷新到磁盘。


@StephenKitt呵呵。不。询问者提到了Debian,所以我将其更改为Debian软件包的链接。
吉尔(Gilles)'所以

3

这些天可能是您的驱动器自动旋转,许多消费者级别的驱动器都这样做。不幸的是,即使在负载很轻的系统上,这也会导致驱动器不断旋转,然后再次旋转,特别是在您运行hddtemp或类似的程序来监视驱动器温度的情况下(大多数驱动器愚蠢地不允许您查询SMART温度值无需旋转驱动器-令人难以置信!)。

这不仅令人烦恼,而且由于许多驱动器仅具有有限的停放次数,因此会使驱动器更快地磨损。例如,有关问题的说明,请参见https://bugs.launchpad.net/ubuntu/+source/hdparm/+bug/952556

我使用下面的Shell代码在所有驱动器上禁用了闲置停止。您可以将其放在/etc/rc.boot脚本或/etc/rc.local或类似文件中。

/ dev / sd中的磁盘?; 做
  / sbin / hdparm -q -S 0“ $ disk”
做完了

2
您无法在不旋转驱动器的情况下无法查询SMART读数,这使我无语:-/现在,显然,“旋转”问题可能变得非常复杂。关于禁用旋转:这本身不会导致HD磨损更快吗?我的意思是:只要系统处于启动状态,它就永远不会“停止”吗?
Cedric Martin

在IIRC中,您可以查询一些SMART值而不会导致驱动器旋转,但是在我测试过的任何驱动器(包括WD,Seagate,Samsung,Hitachi的型号)中,温度都不是其中之一。当然,这是疯狂的,因为对温度的担心是使驱动器空转的原因之一。关于:磨损:AIUI 1.恒定速度的磨损小于改变速度的磨损。2.驱动器必须将磁头停在安全区域,并且驱动器只能这样做多次(IIRC可达数十万-如果驱动器空转并每隔几秒钟旋转就很容易超过)
cas

关于让驱动器运行还是降低驱动器更好是一个长期的争论。就我个人而言,我认为最好让它们继续运行-我在晚上和外出时关闭计算机,但除此之外,我永远不会降低驱动器的速度。有些人喜欢在晚上将其降下来,例如,如果他们将计算机保持开机状态或计算机长时间闲置,那么在这种情况下,将它们旋转几个小时相对于使其保持运行的优势值得商is 。但是,永远不会好过的是,硬盘驱动器在短时间内反复上下旋转。
米歇尔·约翰逊

还请注意,驱动器空闲数小时后将其旋转下来是很愚蠢的,因为如果空闲数小时,则可能在一小时内再次使用它。在这种情况下,如果驱动器处于空闲状态(例如,在10分钟之内),则最好迅速将其旋转下来,但是当有人使用计算机并且可能需要使用驱动器时,驱动器也有可能空闲几分钟。该驱动器很快。
米歇尔·约翰逊

我以为这可以解决我的问题,因为即使驱动器未安装,我也会听到驱动器发出周期性的敲击声(3-4次/秒),就像写的一样!但是运行此命令后,我仍然听到噪音。令人担忧的是,这是我用来备份内部SSD的驱动器...
Michael

1

我刚刚发现,smart导致外部USB磁盘在树莓派上反复旋转。尽管SMART通常是一件好事,但我还是决定再次将其禁用,此后看来不必要的磁盘活动已停止


您可以将智能守护程序配置为不扫描USB磁盘,大多数优秀的linux发行版默认都执行此操作。
lzap

1

您可以对此有所了解。大多数情况下应该缩小范围。

find / -mount -newer /proc -print

提供自启动以来在/文件系统的物理设备上修改的文件。了解文件可能会有助于识别作者。


1

如果需要将其范围缩小到一个精确的磁盘,请使用以下命令:

运行lsblk并查找设备号。在下面的情况下是9:126

NAME        MAJ:MIN RM   SIZE RO TYPE  MOUNTPOINT
sda           8:0    0   7.3T  0 disk  
└─md126       9:126  0  13.8T  0 raid0 /mnt/InternalPhase
sdb           8:16   0   7.3T  0 disk  
└─md126       9:126  0  13.8T  0 raid0 /mnt/InternalPhase
sdc           8:32   0   7.3T  0 disk  
└─sdc1        8:33   0   7.3T  0 part  /mnt/InternalFBE

lsof | grep '9,126'与上面的磁盘号相比,使用:replace和运行,。就我而言,这显示为:

bash      389162            root  cwd       DIR              9,126      4096  449183796 /mnt/InternalPhase/0000000001/CHANNEL01/LIVE/PHASE/DATA/2018/10/04

使用以下命令389162杀死PID :

kill -9 389162

-1

问题在于,默认情况下,系统需要每隔5秒左右将数据从磁盘缓冲区刷新到磁盘一次。因此,如果磁盘确实旋转了,那么除了需要刷新时再次旋转回去,别无选择。因此,除了完全禁用旋转降速或完全禁用磁盘电源管理功能以外,实际上无法避免该问题hdparm -B 255 /dev/hdax。这可能是一个更好的选择,因为经常重启绝对会比仅仅一直保持重启更为有害。


1
仅当有任何要刷新的数据时才刷新数据。如果确实没有使用磁盘,则不会有任何缓冲数据要刷新。
米歇尔·约翰逊
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.