3

我正在尝试在时间、内存和磁盘使用方面对我正在开发的工具进行基准测试。我知道/usr/bin/time基本上给了我前两个想要的东西,但是对于磁盘使用,我得出的结论是我必须推出自己的 bash 脚本,该脚本会定期从/proc/<my_pid>/io. 基于这个脚本,这就是我想出的:

"$@" &
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 或过低这个文件。
  • 第二个问题是我不知道如何处理将临时文件作为其进程的一部分删除的进程。在这种情况下,我认为公平的基准是记录最大的磁盘使用量(即写入的字节数峰值 - 擦除的字节数),但我不知道在哪里可以找到这种差异的第二部分。

我该如何解决这些问题?

4

3 回答 3

1

你可能想看看BCC - 基于 BPF 的 Linux IO 分析、网络、监控等filetop工具:

tools/filetop:按文件名和进程读写文件。顶部的文件。

该脚本通过使用内核动态跟踪来跟踪vfs_read()vfs_write()函数来工作,该跟踪检测显式读写调用。如果使用其他方式(例如,通过mmap())读取或写入文件,则使用此工具将看不到它们。

Brendan Gregg 就Linux 性能工具进行了很好的演讲和演示,它们很有启发性。

于 2017-01-10T16:06:53.680 回答
0

我最终发现了这个类似的问题:如何测量由于 Linux 中给定进程的活动而导致的净使用磁盘空间变化?.

根据那里的答案,由于难以跟踪可能由给定流程启动的所有不同类型的更改,这似乎是一个棘手的问题。

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

于 2017-01-10T13:26:46.580 回答
0

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

  • 磁盘随时间写入增量。例如 8 GB/天。如果全部都到/tmp 也没关系。每次运行时,都会使用计数器将新平均值保存到磁盘中,以保持滚动平均值。因此,如果您错误的进程每小时执行 2 GB,然后是 1 GB,然后是 0 GB,每小时,那就是 1 GB/小时(对于该时间段)
  • 对于每个快照,您选择最高的,记录下来,在这种情况下,操作的第一个小时为 2 GB。如果您每小时运行该脚本并且它始终为 0 GB,则它将在第一个小时内报告 2 GB。然后,如果它启动并降低 5 GB,则“峰值”将显示在凌晨 3 点,平均为 333 MB/小时。
于 2018-04-17T05:47:20.200 回答