测量特定过程随时间变化的资源利用率

goeffel的Python项目详细描述


概述

测量特定进程随时间变化的资源利用率。

还可以测量系统范围内资源的利用率/饱和度:这有助于将特定于流程的指标放到上下文中。

为Linux构建。Windows和Mac OS支持可能会出现。

有关当前支持的度量的列表,请参见下面的

名称是德语,表示spork

一个spork的图像

方便,对吧?

亮点

cli教程

戈菲尔:数据采集

如果目标进程的进程ID已知,则使用--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 ...]

在此模式下,goeffel将一直运行,直到通过sigintsigterm手动终止。 通过定期运行discovery命令来检测进程id的更改,直到它在stdout上返回有效的进程id为止。 这对于被监视的进程偶尔重新启动(例如故障转移场景)的寿命实验非常有用。

Goeffel分析:数据检查和可视化

注意Goeffel分析为可视化数据提供了一种固执己见且有限的方法。对于高级和彻底的数据分析,我建议构建一个自定义(甚至可能是临时的!)使用pandasmatplotlib或使用您选择的工具进行数据分析管道。

另请注意:goeffel analysis提供的命令行界面, 特别是对于plot命令,将来可能会发生变化。建议 当然,我们欢迎改进。

戈菲尔分析检验

使用goeffel analysis inspect<;path-to-hdf5-file>;检查内容 一个Goeffel输出文件。例子:

αα次级方案3

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 magic example output image

戈菲尔分析图:通用绘图命令

例如,可用于比较多个时间序列。说你有 在分布式系统中跨多个副本监视同一程序,并 希望比较某个度量在这些方面的时间演变 复制品。然后,这里的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'

示例输出图: goeffel analysis plot example output image

背景和细节

现有技术

这是因为需要坚固的工具。我们从pidstat开始 sysstat,启动时为 pidstat-hud-p$pid 11。我们发现它不能正确解释 在同一进程中运行的多个线程,其中的各种问题 此程序中存在各种版本的注意事项(请参见 这里此处,以及 这里)。

该程序由 Uber有一个关于通用测量方法和 总的来说似乎是一个很好的工具。然而,它似乎是为 交互式使用(而我们正在寻找一个强大的测量程序 它可以指向一个进程,然后在一个重要的 虽然)而且似乎没有一个完整的方法 将收集到的时间序列数据保存在磁盘上,以便日后检查。

程序psrecord(有效地 包装具有类似的功能 作为歌菲尔的基本方法;但仅限于 在将数据持久化到 磁盘,执行测量本身,并分析/绘制数据。

技术说明

  • 核心采样环路除了测量本身之外几乎不起作用:它 将每个样本写入队列。一个单独的进程使用这个队列 将时间序列数据保存到磁盘,以备以后检查。这使 采样率可根据磁盘写入延迟峰值预测,或通常根据 背压。这一点尤其重要,在云环境中,我们有时 请参阅fsync多秒延迟。

  • 采样循环(应该是,欢迎反馈)的构建是为了 时间相关的系统测量误差最小化。

  • 戈菲尔试图不不对称地隐藏测量不确定性。例如, 您可能会看到它测量单线程进程的CPU利用率 略大于100%。这只是测量误差。在其他 像sysstat这样的工具似乎是常见的做法不对称地 当已知测量值在 理论不超过某一限度 (示例)。

  • goeffel必须以root权限运行。

  • -1对于某些度量有特殊意义 (nan,不能表示 在HDF5中正确)。示例:磁盘写入延迟-1 ms表示 在相应的时间间隔内写入。

  • 最高有意义的采样率受内核计时器和 簿记系统。

测量值

度量值是一个词!本节 尝试描述各个数据列("度量"),它们的单位,以及 他们的意思。主要有四类:

时间戳

unixtimeisotime\u localmonotime

与采样时间的边界对应的时间戳 间隔。

过程特定指标

过程PID

被监视进程的进程ID。如果调用了goeffel,它可能会改变 使用--pid命令选项。

采样时的瞬时状态。

过程CPU利用率合计

进程的CPU利用率,百分比

过去采样间隔的平均值。

如果已知被检查的进程仅包含一个线程,则可以 测量误差有时仍大于100%。如果这个过程 运行多个线程,则这可以远远超过100%。

这是基于在用户空间和内核空间花费的时间之和。 要获得更细粒度的图片,请执行以下操作还提供两个指标: proc_cpu_util_percent_userproc_cpu_util_percent_system

进程CPU ID

当前运行此进程的CPU的ID。

采样时的瞬时状态。

过程CTX开关频率Hz

自愿和 非自愿的上下文切换

过去采样间隔的平均值。

进程数线程

进程中的线程数。

采样时的瞬时状态。

过程IP插槽打开

当前打开的套接字数。这包括ipv4和ipv6 不区分TCP和UDP,连接状态也不区分 物质.

采样时的瞬时状态。

过程数FDS

此进程当前打开的文件描述符数。

采样时的瞬时状态。

proc磁盘读取吞吐量mibpsproc磁盘写入吞吐量mibps

mib/s

基于linux'/proc/<;pid>;/iorcharwchar。相关的 Linux内核文档(强调我的):https://github.com/torvalds/linux/blob/33920f1ec5bf47c5c0a1d21139bdd9dfb3fae9/documentation/filesystems/proc.txt < Buff行情>

rchar:此任务导致读取的字节数 存储。这只是此进程传递给read()的字节总数 和pread()。它包括诸如tty io之类的内容,并且不受是否 或者不需要实际的物理磁盘IO(读取可能是 对pagecache满意)。

< Buff行情>

wcar:此任务已导致或将导致的字节数 写入磁盘。与rchar一样,这里也有类似的注意事项。

过去采样间隔的平均值。

proc磁盘读取速率hzproc磁盘写入速率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 msdisk\lt;dev>;\u read\u latency\u ms

这实现了iostat的w廑await,它记录在

< Buff行情>

向设备发出写入请求的平均时间(毫秒) 服侍。这包括队列中的请求花费的时间和 花费在维修上。

在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_hzdisk_lt;dev>;_merged_write_rate_hz

合并了读写请求速率。

Linux内核在传递之前尝试合并单个用户空间请求 把它们放到存储硬件上。对于非随机I/O模式,这将大大减少 向磁盘发出单个读写操作的速率。

使用/proc/diskstats文档中的字段2和6构建 此处

这是整个采样间隔的平均值。

disk\lt;dev>;\u用户空间读取速率hzdisk\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 terminated
0

或者,让我们看看在 整个观察期:

$ 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
1

如何将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 terminated
2

有价值的参考资料

关于这个主题的外部参考,我在 开发。

关于系统性能度量和内核时间记帐:

关于磁盘I/O统计:

其他:

有关HDF5的音乐:

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
构造函数的java条件调用   类Dog中的java构造函数Dog不能应用于给定类型   java jsch和运行“sudo su”   java将队列和堆栈相互复制   java如何在netbeans项目的文件夹中添加库   java While循环在我的代码中不存在   如何在XML中使用java方法的返回值   java是否可以在不写入文件的情况下将字符串/字节数组作为文件发布?   java为什么这些字符串不相等?   sockets客户机-服务器java编程,用户可选择   java如何在SpringMVC和hibernate中保存模型返回视图的列表   java如何修复组织。openqa。硒。WebDriverException:未知错误   Java,Ant错误:编码Cp1252的不可映射字符   JAVAlang.ClassCastException:[Ljava.lang.String;与java.lang.String不兼容   java如何使用JDK8(可选)为空字段创建自定义IntelliJ getter模板   java Tomcat6响应。sendRedirect()404错误