测量进程的峰值磁盘使用
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"
不幸的是,我 运行 遇到两个问题:
- 首先是我将此脚本的输出与我想对文件进行基准测试的工具的输出一起管道化,似乎这些流偶尔会干扰,导致我看到磁盘使用率为 0 或太低报告在此文件的底部。
- 第二个问题是我不知道如何处理删除临时文件作为其进程一部分的进程。在这种情况下,我认为公平的基准是记录最大 net 磁盘使用(即写入的字节数峰值 - 删除的字节数),但我不知道第二部分在哪里可以找到这种差异。
如何解决这些问题?
我最终找到了这个类似的问题: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。
我正在尝试在时间、内存和磁盘使用方面对我正在开发的工具进行基准测试。我知道 /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"
不幸的是,我 运行 遇到两个问题:
- 首先是我将此脚本的输出与我想对文件进行基准测试的工具的输出一起管道化,似乎这些流偶尔会干扰,导致我看到磁盘使用率为 0 或太低报告在此文件的底部。
- 第二个问题是我不知道如何处理删除临时文件作为其进程一部分的进程。在这种情况下,我认为公平的基准是记录最大 net 磁盘使用(即写入的字节数峰值 - 删除的字节数),但我不知道第二部分在哪里可以找到这种差异。
如何解决这些问题?
我最终找到了这个类似的问题: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()
andvfs_write()
functions using kernel dynamic tracing, which instruments explicit read and write calls. If files are read or written using another means (eg, viammap()
), 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。