测量进程的峰值磁盘使用情况

时间:2017-01-08 12:13:56

标签: linux bash io diskspace data-profiling

我正在尝试对我在时间,内存和磁盘使用方面开发的工具进行基准测试。我知道/usr/bin/time基本上给了我前两个我想要的东西,但是对于磁盘使用我得出结论我必须滚动我自己的bash脚本,定期提取写入的&#39;字节&#39;来自/proc/<my_pid>/io的内容。根据这个script,我在这里提出了:

"$@" &
pid=$!
status=$(ps -o rss -o vsz -o pid | grep $pid)
maxdisk=0
while [ "${#status}" -gt "0" ];
do
    sleep 0.05
    delta=false
    disk=$(cat /proc/$pid/io | grep -P '^write_bytes:' | awk '{print $2}')
    disk=$(disk/1024)
    if [ "0$disk" -gt "0$maxdisk" ] 2>/dev/null; then
        maxdisk=$disk
        delta=true
    fi
    if $delta; then
        echo disk: $disk
    fi
    status=$(ps -o rss -o vsz -o pid | grep $pid)
done
wait $pid
ret=$?
echo "maximal disk used: $maxdisk KB"

不幸的是,我遇到了两个问题:

  • 首先是我将此脚本的输出与我想要对文件进行基准测试的工具的输出进行管道化,并且似乎偶尔这些流会干扰,导致我看到0或过低的磁盘使用报告这个文件的底部。
  • 第二个问题是,我不知道如何处理删除临时文件作为其过程一部分的过程。在这种情况下,我认为公平基准将记录最大 net 磁盘使用(即写入的字节峰值 - 字节擦除),但我不知道第二部分可以找到这种差异。

如何解决这些问题?

3 个答案:

答案 0 :(得分:1)

您可能希望查看filetop中的BCC - Tools for BPF-based Linux IO analysis, networking, monitoring, and more

  

tools / filetop:文件通过文件名和进程读写。文件顶部。

     

此脚本的工作原理是使用内核动态跟踪来跟踪vfs_read()vfs_write()函数,这些函数用于显式读写调用。如果使用其他方式(例如,通过mmap())读取或写入文件,则使用此工具将无法看到它们。

Brendan Gregg就Linux Performance Tools, 提供了很好的演讲和演示,他们非常有启发性。

答案 1 :(得分:0)

我最终发现了类似的问题:How do I measure net used disk space change due to activity by a given process in Linux?

基于那里的答案,由于难以跟踪可能由给定过程发起的所有不同类型的变化,因此接缝成为棘手的问题。

在那里也提到了Dtrace,但据我所知,它是Sun专有的(或者我现在认为是Oracle?)因此默认只在Solaris上提供。最终我找到了这个Github repo,旨在缩小Linux用户的差距。

答案 2 :(得分:0)

您可以通过在记录中使用多个时间戳,以不同的方式考虑它,而不用担心已删除的文件,为您提供:

  • 磁盘随着时间的推移写入增量。例如8 GB /天。如果全部都是/ tmp并不重要。每次运行一个新的平均值,保存到光盘,带有计数器,以保持滚动平均值。因此,如果错误进程每小时执行2 GB,则1 GB,然后每小时0 GB,即1 GB /小时(对于时间段)
  • 对于每个快照,您选择最高的记录,在这种情况下,操作的第一个小时为2 GB。如果您每小时运行一次脚本并且始终为0 GB,则它将在第一个小时内报告2 GB。然后,如果在小小的情况下它开始并放下5 GB,那么“峰值”将显示在凌晨3点,平均为333 MB /小时。