测量进程的峰值磁盘使用

Measuring peak disk use of a process

我正在尝试在时间、内存和磁盘使用方面对我正在开发的工具进行基准测试。我知道 /usr/bin/time 基本上满足了前两个的要求,但对于磁盘使用,我得出的结论是我必须推出自己的 bash 脚本,该脚本会定期提取 'bytes written' 内容来自 /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 }')
    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"

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

如何解决这些问题?

我最终找到了这个类似的问题: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 用户缩小差距。

你可能想看看filetop from BCC - Tools for BPF-based Linux IO analysis, networking, monitoring, and more:

tools/filetop: File reads and writes by filename and process. Top for files.

This script works by tracing the vfs_read() and vfs_write() functions using kernel dynamic tracing, which instruments explicit read and write calls. If files are read or written using another means (eg, via mmap()), then they will not be visible using this tool.

Brendan Gregg 提供了关于 Linux Performance Tools, 的精彩演讲和演示,它们很有启发性。

您可以有不同的想法,完全不用担心删除的文件,通过在您的记录中使用多个时间戳,给您:

  • 磁盘随时间写入增量。例如 8 GB/day。如果所有这些都到 /tmp 也没关系。每次都是 运行 一个新的平均值保存到光盘,带有一个计数器,以保持滚动平均值。因此,如果您错误的进程每小时执行 2 GB,然后是 1 GB,然后是 0 GB,那么每小时就是 1 GB/hour(对于该时间段)
  • 对于每个快照,您选择最高的并记录下来,在本例中,操作的第一个小时为 2 GB。如果您每小时 运行 脚本并且它总是 0 GB,它会在第一个小时报告 2 GB。然后,如果在很小的时候它启动并放下 5 GB,你 "peak" 将在凌晨 3 点显示,平均为 333 MB/hour。