测量特定过程随时间变化的资源利用率
goeffel的Python项目详细描述
概述
测量特定进程随时间变化的资源利用率。
还可以测量系统范围内资源的利用率/饱和度:这有助于将特定于流程的指标放到上下文中。
为Linux构建。Windows和Mac OS支持可能会出现。
名称是德语,表示spork 方便,对吧? 如果目标进程的进程ID已知,则使用 对于超出过程寿命的测量,请使用 在此模式下,goeffel将一直运行,直到通过 注意: 另请注意:goeffel analysis提供的命令行界面,
特别是对于plot命令,将来可能会发生变化。建议
当然,我们欢迎改进。 使用 示例输出图:
例如,可用于比较多个时间序列。说你有
在分布式系统中跨多个副本监视同一程序,并
希望比较某个度量在这些方面的时间演变
复制品。然后,这里的 示例输出图:
这是因为需要坚固的工具。我们从pidstat开始
sysstat亮点
0.5s
使窄峰值可见。cli教程
戈菲尔
:数据采集--pid<;pid>;
参数调用goeffel。
在这种模式下,goeffel停止测量,并在具有给定id的进程消失后自行终止。例子:$ goeffel --pid 29019
[... snip ...]
190809-15:46:57.914 INFO: Updated HDF5 file: wrote 20 sample(s) in 0.01805 s
[... snip ...]
190809-15:56:13.842 INFO: Cannot inspect process: process no longer exists (pid=29019)
190809-15:56:13.843 INFO: Wait for producer buffer to become empty
190809-15:56:13.843 INFO: Wait for consumer process to terminate
190809-15:56:13.854 INFO: Updated HDF5 file: wrote 13 sample(s) in 0.01077 s
190809-15:56:13.856 INFO: Sample consumer process terminated
--pid command<;command>;
。
在下面的示例中,我使用pgrep实用程序来发现最新的压力进程:$ goeffel --pid-command 'pgrep stress --newest'
[... snip ...]
190809-15:47:47.337 INFO: New process ID from PID command: 25890
[... snip ...]
190809-15:47:57.863 INFO: Updated HDF5 file: wrote 20 sample(s) in 0.01805 s
190809-15:48:06.850 INFO: Cannot inspect process: process no longer exists (pid=25890)
190809-15:48:06.859 INFO: PID command returned non-zero
[... snip ...]
190809-15:48:09.916 INFO: PID command returned non-zero
190809-15:48:10.926 INFO: New process ID from PID command: 28086
190809-15:48:12.438 INFO: Updated HDF5 file: wrote 20 sample(s) in 0.01013 s
190809-15:48:22.446 INFO: Updated HDF5 file: wrote 20 sample(s) in 0.01062 s
[... snip ...]
sigint
或sigterm
手动终止。
通过定期运行discovery命令来检测进程id的更改,直到它在stdout上返回有效的进程id为止。
这对于被监视的进程偶尔重新启动(例如故障转移场景)的寿命实验非常有用。Goeffel分析
:数据检查和可视化Goeffel分析
为可视化数据提供了一种固执己见且有限的方法。对于高级和彻底的数据分析,我建议构建一个自定义(甚至可能是临时的!)使用pandas
和matplotlib
或使用您选择的工具进行数据分析管道。
,启动时为
戈菲尔分析检验
goeffel analysis inspect<;path-to-hdf5-file>;
检查内容
一个Goeffel输出文件。例子:goeffel analysis magic
:快速绘制单个时间序列文件中的数据
goeffel analysis magic<;path-to-hdf5-file>;
命令绘制预先选定的
以自以为是的方式设置度量。可以使用
--metric<;metric name>;
选项。命令示例:goeffel-analysis magic \
mwst18-master2-mesosmaster_20190801_112136.hdf5 \
--metric proc_num_ip_sockets_open
戈菲尔分析图
:通用绘图命令goeffel analysis plot
命令将提供帮助,并使用
多个--系列
参数:
$ goeffel-analysis plot \
--series mwst18-master1-journal_20190801_111952.hdf5 master1 \
--series mwst18-master2-journal_20190801_112136.hdf5 master2 \
--series mwst18-master3-journal_20190801_112141.hdf5 master3 \
--series mwst18-master4-journal_20190801_112151.hdf5 master4 \
--series mwst18-master5-journal_20190801_112157.hdf5 master5 \
--column proc_cpu_util_percent_total \'CPU util (total) / %'\'systemd journal CPU utilization '15\
--subtitle 'MWST18, measured with Goeffel'\
--legend-loc 'upper center'
背景和细节
现有技术
pidstat-hud-p$pid 11
。我们发现它不能正确解释
在同一进程中运行的多个线程,其中的各种问题
此程序中存在各种版本的注意事项(请参见
这里,
此处,以及
这里)。
该程序由 Uber有一个关于通用测量方法和 总的来说似乎是一个很好的工具。然而,它似乎是为 交互式使用(而我们正在寻找一个强大的测量程序 它可以指向一个进程,然后在一个重要的 虽然)而且似乎没有一个完整的方法 将收集到的时间序列数据保存在磁盘上,以便日后检查。
程序psrecord(有效地 包装具有类似的功能 作为歌菲尔的基本方法;但仅限于 在将数据持久化到 磁盘,执行测量本身,并分析/绘制数据。
技术说明
核心采样环路除了测量本身之外几乎不起作用:它 将每个样本写入队列。一个单独的进程使用这个队列 将时间序列数据保存到磁盘,以备以后检查。这使 采样率可根据磁盘写入延迟峰值预测,或通常根据 背压。这一点尤其重要,在云环境中,我们有时 请参阅fsync多秒延迟。
采样循环(应该是,欢迎反馈)的构建是为了 时间相关的系统测量误差最小化。
戈菲尔试图不不对称地隐藏测量不确定性。例如, 您可能会看到它测量单线程进程的CPU利用率 略大于100%。这只是测量误差。在其他 像sysstat这样的工具似乎是常见的做法不对称地 当已知测量值在 理论不超过某一限度 (示例)。
goeffel
必须以root
权限运行。值
-1
对于某些度量有特殊意义 (nan,不能表示 在HDF5中正确)。示例:磁盘写入延迟-1 ms
表示 在相应的时间间隔内写入。最高有意义的采样率受内核计时器和 簿记系统。
测量值
度量值是一个词!本节 尝试描述各个数据列("度量"),它们的单位,以及 他们的意思。主要有四类:
时间戳
unixtime
,isotime\u local
,monotime
与采样时间的右边界对应的时间戳 间隔。
unixtime
编码墙时间。它是一个规范的unix时间戳(秒 自纪元起,双精度浮点数);带次秒 精确无时区信息。这与 工具,因此时间序列的通用时间戳列 分析(另请参见如何将unixtime列转换为a-pandasdatetimeindex" rel="nofollow">如何将unixtime
列转换为apandas.datetimeindex
)。 注意:这受系统时钟漂移的影响。在极端情况下,这可能 后退,跳跃,成为无用的度量。在这种情况下,单次公制帮助(见下文)。
isotime_local
是与存储在unixtime
。它是本地时间的26个字符的文本表示 使用ISO 8601符号(因此也是机器可读的)。喜欢unixtime
此度量值受系统时钟漂移的影响,可能会 在极端情况下相当无用。monotime
是基于所谓的 单调的时钟源 是否不受到(意外的或有意的)系统时钟漂移的影响。这个 列最准确地编码任意两个之间的相对时间差 时间序列中的样本。此列中编码的时间戳仅使 彼此相对的感觉;这两个值之间的差别 列是以秒为单位的墙时间差,精度低于秒。
过程特定指标
过程PID
被监视进程的进程ID。如果调用了goeffel,它可能会改变
使用--pid命令
选项。
采样时的瞬时状态。
过程CPU利用率合计
进程的CPU利用率,百分比
过去采样间隔的平均值。
如果已知被检查的进程仅包含一个线程,则可以 测量误差有时仍大于100%。如果这个过程 运行多个线程,则这可以远远超过100%。
这是基于在用户空间和内核空间花费的时间之和。
要获得更细粒度的图片,请执行以下操作还提供两个指标:
proc_cpu_util_percent_user
和proc_cpu_util_percent_system
进程CPU ID
当前运行此进程的CPU的ID。
采样时的瞬时状态。
过程CTX开关频率Hz
自愿和 非自愿的上下文切换
过去采样间隔的平均值。
进程数线程
进程中的线程数。
采样时的瞬时状态。
过程IP插槽打开
当前打开的套接字数。这包括ipv4和ipv6 不区分TCP和UDP,连接状态也不区分 物质.
采样时的瞬时状态。
过程数FDS
此进程当前打开的文件描述符数。
采样时的瞬时状态。
proc磁盘读取吞吐量mibps
和proc磁盘写入吞吐量mibps
在mib/s
基于linux'/proc/<;pid>;/io
rchar
和wchar
。相关的
Linux内核文档(强调我的):https://github.com/torvalds/linux/blob/33920f1ec5bf47c5c0a1d21139bdd9dfb3fae9/documentation/filesystems/proc.txt
< Buff行情>
rchar
:此任务导致读取的字节数
存储。这只是此进程传递给read()的字节总数
和pread()。它包括诸如tty io之类的内容,并且不受是否
或者不需要实际的物理磁盘IO(读取可能是
对pagecache满意)。
wcar
:此任务已导致或将导致的字节数
写入磁盘。与rchar一样,这里也有类似的注意事项。
过去采样间隔的平均值。
proc磁盘读取速率hz
和proc磁盘写入速率hz
进程发出的读/写系统调用的速率,从
Linux文件系统。相关的syscr
/syscw
计数器现在是
只记录有"读I/O操作,即像read()和
pread()"和"写I/O操作,即write()和pwrite()之类的系统调用"。
参考文献:
文档/文件系统/proc.txt
过去采样间隔的平均值。
过程内存百分比
进程的部分常驻集大小
(rss)相对于机器的物理内存大小,单位为percent
采样时的瞬时状态。
过程内存rss
,过程内存vms
。过程内存脏
监视进程的各种内存使用度量。请参阅psutil。 DOC/< A> 快速总结这些值的含义。但是,请注意,这些值需要 仔细的解释,这在下面的讨论中是很明显的 这个和 这
采样时的瞬时快照。
磁盘指标
仅当使用--diskstats<;dev>;
参数调用goeffel时才收集。这个
结果数据列名包含设备名<;dev>;
(但请注意
在构建c时删除<;dev>;
中的破折号列名)。
注意,其中一些磁盘指标的结论是有限的。我相信 这篇博文写得很好 介绍了一些基本的linux磁盘i/o概念,在阅读之前应该知道这些概念 这些数字的意义。
磁盘利用率
这实现了iostat的磁盘%util
度量。
我喜欢把它看作是 采样的时间间隔,以及相应设备的"繁忙时间" 相同时间间隔,以百分比表示。iostat文档描述 此指标用以下文字表示:
< Buff行情>向设备发出I/O请求所用时间的百分比 (设备的带宽利用率)。"
这是整个采样间隔的平均值。
注意:对于现代存储系统,利用率通常是 不表示设备已饱和。我想引用马克 布鲁克:
< Buff行情>作为一般IO繁忙度的度量,util非常方便,但是 显示系统的性能与它的性能相比 太糟糕了。
disk\lt;dev>;\u write\u latency\u ms
和disk\lt;dev>;\u read\u latency\u ms
这实现了iostat的w廑await
,它记录在
向设备发出写入请求的平均时间(毫秒) 服侍。这包括队列中的请求花费的时间和 花费在维修上。
在Linux上,这是使用记录的/proc/diskstats
构建的
此处。
具体来说,它使用字段8("写入所用的毫秒数")和
字段5("已完成的写入数")。值得注意的是,后者是而不是
合并了写入计数,但用户空间写入计数(这似乎是iostat
用于计算w_await
)。
这可能是一个有用的指标,但请注意其含义和局限性。
从这个角度来看,在一个实验中,我发现
可以在实时的一秒钟内发生(通过iostat-x 1 grep xvdh
并通过直接监视/proc/diskstats
):3093个用户空间写入请求
服务,合并为22个设备写入请求,总共产生120914个
毫秒的"写入时间",导致平均写入延迟为25毫秒。
这25毫秒到底是什么意思?平均来说,人类只有不到两个
当然是腿。当前的实现方法复制iostat输出,
这是最初的目标。欢迎提出改进建议。
这是整个采样间隔的平均值。
同样的考虑也适用于r\u await
,相应地。
disk<;dev>;_merged_read_rate_hz
和disk_lt;dev>;_merged_write_rate_hz
合并了读写请求速率。
Linux内核在传递之前尝试合并单个用户空间请求 把它们放到存储硬件上。对于非随机I/O模式,这将大大减少 向磁盘发出单个读写操作的速率。
使用/proc/diskstats
文档中的字段2和6构建
此处
这是整个采样间隔的平均值。
disk\lt;dev>;\u用户空间读取速率hz
和disk\lt;dev>;\u用户空间写入速率hz
发出的读写请求速率M用户空间视角(之前 合并)
使用/proc/diskstats
文档中的字段1和5构建
此处
这是整个采样间隔的平均值。
全系统指标
系统加载avg1
系统加载avg5
系统加载avg15
系统内存可用
系统内存总计
使用的系统内存
系统内存可用
系统内存共享
系统内存缓冲区
系统内存缓存
系统内存处于活动状态
系统内存未激活
提示和技巧
如何将Goeffel HDF5文件转换为CSV文件
我建议使用 熊猫。示例一行:
python -c 'import sys; import pandas as pd; df = pd.read_hdf(sys.argv[1], key="goeffel_timeseries"); df.to_csv(sys.argv[2], index=False)' goeffel_20190718_213115.hdf5.0001 /tmp/hdf5-as-csv.csv
请注意,这会显著增大文件大小(例如,从50 mib到300 MiB)
如何可视化和浏览HDF5文件的内容
在某个时候,您可能会觉得倾向于在由
Goeffel或进行自定义数据检查/处理。那样的话我建议
使用各种可用的开源hdf5工具之一管理和
查看HDF5文件。我经常使用的一个gui工具是
重要信息。用pip install vitables安装
然后执行例如
vitables goeffel_20190718_213115.hdf5
这将打开一个gui,允许浏览表格时间序列数据 查看文件中的元数据,将数据导出为csv,查询 数据和各种其他东西。
如何使用ipython和pandas进行快速数据分析
我建议启动ipythonrepl:
pip install ipython # if you have not done so yet ipython
将hdf5文件加载到pandas
数据帧:
In [1]: import pandas as pd
In [2]: df = pd.read_hdf('goeffel_timeseries__20190806_213704.hdf5', key='goeffel_timeseries')
从这里你可以做任何事。
例如,让我们看看实际采样间隔的平均值 用于此特定的Goeffel时间序列:
$ goeffel --pid 29019 [... snip ...] 190809-15:46:57.914 INFO: Updated HDF5 file: wrote 20 sample(s) in 0.01805 s [... snip ...] 190809-15:56:13.842 INFO: Cannot inspect process: process no longer exists (pid=29019) 190809-15:56:13.843 INFO: Wait for producer buffer to become empty 190809-15:56:13.843 INFO: Wait for consumer process to terminate 190809-15:56:13.854 INFO: Updated HDF5 file: wrote 13 sample(s) in 0.01077 s 190809-15:56:13.856 INFO: Sample consumer process terminated0
或者,让我们看看在 整个观察期:
$ goeffel --pid 29019 [... snip ...] 190809-15:46:57.914 INFO: Updated HDF5 file: wrote 20 sample(s) in 0.01805 s [... snip ...] 190809-15:56:13.842 INFO: Cannot inspect process: process no longer exists (pid=29019) 190809-15:56:13.843 INFO: Wait for producer buffer to become empty 190809-15:56:13.843 INFO: Wait for consumer process to terminate 190809-15:56:13.854 INFO: Updated HDF5 file: wrote 13 sample(s) in 0.01077 s 190809-15:56:13.856 INFO: Sample consumer process terminated1
如何将unixtime列转换为pandas.datetimeindex
hdf5文件包含一个包含规范unix的unixtime列
时间戳数据准备被大量工具使用。如果你和我一样
喜欢使用熊猫,那么很高兴知道如何将其转换为
原生pandas.datetimeindex
:
$ goeffel --pid 29019 [... snip ...] 190809-15:46:57.914 INFO: Updated HDF5 file: wrote 20 sample(s) in 0.01805 s [... snip ...] 190809-15:56:13.842 INFO: Cannot inspect process: process no longer exists (pid=29019) 190809-15:56:13.843 INFO: Wait for producer buffer to become empty 190809-15:56:13.843 INFO: Wait for consumer process to terminate 190809-15:56:13.854 INFO: Updated HDF5 file: wrote 13 sample(s) in 0.01077 s 190809-15:56:13.856 INFO: Sample consumer process terminated2
有价值的参考资料
关于这个主题的外部参考,我在 开发。
关于系统性能度量和内核时间记帐:
- http://www.brendangregg.com/usemethod.html
- https://www.livictcortex.com/blog/monitoring-and-observatability-with-use-and-red
- https://github.com/uber-common/cpustat/blob/master/readme.md
- https://elinux.org/kernel_timer_systems
- https://github.com/leo-g/devopswiki/wiki/如何计算Linux CPU使用时间和百分比
关于磁盘I/O统计:
- https://www.xaprb.com/blog/2010/01/09/how-linux-iostat-compuTES-ITS-结果/
- https://www.kernel.org/doc/documentation/iostats.txt
- https://blog.serverfault.com/2010/07/06/777852755/(解释iostat输出)
- https://unix.stackexchange.com/a/462732(什么是合并写入?)
- https://stackoverflow.com/a/8512978(iostat中的
%util
是什么?) - https://brooker.co.za/blog/2014/07/04/iostat-pct.html
- https://coderwall.com/p/utc42q/understanding-iostat
- https://www.percona.com/doc/percona-toolkit/latest/pt-diskstats.html
其他:
- https://serverfault.com/a/85481/121951(关于系统内存统计)
有关HDF5的音乐:
- https://cyrille.rossant.net/moving-away-hdf5/
- http://hdf-forum.184993.n3.nabble.com/file-corruption-and-hdf5-design-concerties-td4025305.html
- https://questibles-users.narkive.com/qh2wlyqn/corrupt-hdf5-files
- https://www.hdfgroup.org/2015/05/whats-coming-in-the-hdf5-1-10-0-release/
- https://stackoverflow.com/q/35837243/145400