如何在 Linux 上监控硬盘负载?

Pie*_*ter 115 linux hard-drive load-testing

是否有一个很好的命令行实用程序来监视 linux 上的硬盘负载?类似于top但随后监视磁盘活动 iso cpu 使用情况。

更具体地说,我怀疑对于某些(重负载)服务器,在对其上运行的程序的各个部分进行了多次优化之后,现在的瓶颈只是记录到磁盘上的文件。但是我发现很难评估服务器可以处理多少流量。

我的理想工具是打印“您现在使用了 35% 的磁盘带宽”的工具。有任何想法吗?

Dav*_*ney 93

您可以使用该iostat工具对此进行很好的衡量。

% iostat -dx /dev/sda 5

Device:         rrqm/s   wrqm/s     r/s     w/s   rsec/s   wsec/s avgrq-sz avgqu-sz   await  svctm  %util
sda               0.78    11.03    1.19    2.82    72.98   111.07    45.80     0.13   32.78   1.60   0.64
Run Code Online (Sandbox Code Playgroud)

磁盘利用率列在最后一列。这被定义为

向设备发出 I/O 请求的 CPU 时间百分比(设备的带宽利用率)。当该值接近 100% 时,会发生器件饱和。

  • @Brian:它在 sysstat 包中(无论如何通过 yum ......) (11认同)
  • 如果有的话,它驻留在 Debian 中的哪个软件包中?`apt-cache dump` 没有为 iostat 提供任何信息 (3认同)

Tim*_*and 86

iotop是 top 的一个版本,它查看每个进程使用了​​多少 IO。它位于标准的 ubuntu 存储库中;我不知道它是在 RHEL 还是 Fedora 中,但应该是。

在此处输入图片说明

对于老版本的内核(CentOS的说5.x或RHEL 5.x的)不支持iotop,利用Topio公司代替(这里记载:http://yong321.freeshell.org/freeware/pio.html#linux,它依靠/ proc//io 用于 io 统计并提供与 iotop 类似的功能。有关更多详细信息,请参阅链接。

  • 从 RedHat 5.4 开始,使 iotop 工作所需的位已向后移植。享受! (2认同)

Ski*_*rou 16

正如 sastanin 在评论中所建议的那样,您可以直接处理/sys/block/sda/stat或 中给出的值/proc/diskstats。当没有提到的其他工具可用并且您无法轻松安装它们时,这可能会有所帮助。

例如(IIUC)这样的东西(在bash中)应该给出每秒读取次数:

OLD=`awk '{print $1}' /sys/block/sda/stat` # First field is number of read I/Os processed
DT=1
for ii in `seq 1 10`
do
    sleep $DT
    NEW=`awk '{print $1}' /sys/block/sda/stat`
    echo $((($NEW-$OLD)/$DT))
    OLD=$NEW
done
Run Code Online (Sandbox Code Playgroud)

有关文档,请参阅https://www.kernel.org/doc/Documentation/iostats.txthttps://www.kernel.org/doc/Documentation/block/stat.txt


Yva*_*van 11

您应该看看atop,它将 iotop/top/iftop 的强大功能集于一身,并突出显示了系统上的关键部分。


Mik*_*eyB 6

我建议看看 nmon 工具。它将向您显示许多系统参数的实时负载以及将数据记录到文件中以供日后阅读。这是一个免费工具,可在此处获得


Aln*_*tak 5

显示硬盘负载的标准工具是iostat.

它不会告诉您正在使用多少%age磁盘带宽,因为它不知道您的磁盘有多少带宽。无论如何,您的磁盘仅具有制造商引用的用于大量连续数据传输的数据。


小智 5

找出您的总带宽是多少,您可能会使用它 hdparm -T /dev/sda来测试缓冲区缓存 (fileio) 性能 hdparm -t /dev/sda以测试设备读取性能

示例:我的笔记本电脑从 SATA 磁盘获取 82MB/秒,从缓存获取 2GB/秒。我的桌面从缓存获得 12GB/秒,从硬件 RAID 阵列获得 500MB/秒。我怀疑那些最后的数字在服务器级硬件上可能会翻倍。

将预读设置为高于 256,4096 最适合我

for i in 128 256 512 1024 2048 4096 8192 16384 32768  
do  
hdparm --setra $i  
  for j in 1 2 4 8 16 32  
  do  
  time dd if=/dev/sda of=/dev/null bs="$j"k  count=<fixthis> 1GB / blocksize  
  done  
done  
Run Code Online (Sandbox Code Playgroud)

以不同的块大小和不同的预读读取 1GB 的次数