用于内存消耗测量的python睡眠不准确

Posted

技术标签:

【中文标题】用于内存消耗测量的python睡眠不准确【英文标题】:python sleep for memory consumption measurement not accurate 【发布时间】:2015-06-12 00:59:22 【问题描述】:

我有一个 python 脚本 (runner.py),它定期测量进程的内存消耗。为了监控内存消耗,我使用了一个名为 ProcessTimer.py 的辅助类。 processtimer是基于here给出的解决方案实现的。

解决方案基于轮询。所以有一个while-loop。在这个while-loop 中测量内存消耗,然后线程休眠一段时间以确保定期测量。在我的情况下,睡眠完成了 500 毫秒。但是,我的问题是测量不是每 500 毫秒完成一次。测量之间的时间似乎是任意的,我不知道为什么不是每 500 毫秒完成一次(根据time.sleep(.500))。

您可以在此处查看我的测量结果的 CSV 输出。第一列是时间(以秒为单位),第二列是内存消耗:

time,rss_mem
0.0,12.38
1.1,101.89
2.3,110.74
3.4,110.79
4.5,113.61
5.7,101.6
6.8,102.44
8.0,104.28
9.1,104.48
10.3,108.13
11.4,102.64
12.6,102.83
13.7,102.86
14.9,102.86

正如您所见,每次测量之间总是有 ~1.1 秒的间隔,即使 while-loop(用于测量另一个进程的内存消耗)应该每 500 毫秒执行一次。这是为什么呢?

runner.py的相关代码可见here。 辅助类 ProcessTimer.py 可见here。

【问题讨论】:

我刚刚做了time.sleep(.500)前后时间的日志输出。差值正好是 500 毫秒。到ptimer.poll() 实际上需要这么长时间。但是,我不知道为什么需要这么长时间。任何建议表示赞赏。 【参考方案1】:

time.sleep(.5) 不能确保你的循环每秒执行两次;它只睡半秒钟。如果其余代码的执行时间为 1 秒,则每次迭代将需要 0.5 + 1 = 1.5 秒。

如果您想以更精确的间隔进行测量,则需要测量调用 ptimer.poll() 所需的时间,然后从 0.5 秒中减去该时间。

但从上面的数据来看,ptimer.poll() 似乎需要大量的时间。您可能必须先优化内存测量代码,才能尽可能快地进行测量。

【讨论】:

是的,ptimer.poll() 现在花费的时间太长。我必须弄清楚如何优化它。如果有人知道该怎么做,我很乐意阅读建议。当然感谢您的回复。 请查看poll() 的代码,提出一些想法并提出一个新的具体问题。我们在这里尽量避免“大”问题(大 = 涉及多个主题)。 好的。问题如下:为了测量 CPU 使用率,我使用了pp.cpu_percent(interval=1.0)。所以它等待了1秒。对不起,那是我的错。 pp.cpu_percent() 的用法在这里解释:code.google.com/p/psutil/wiki/Documentation

以上是关于用于内存消耗测量的python睡眠不准确的主要内容,如果未能解决你的问题,请参考以下文章

测量执行时间和使用的内存

在cpp中测量函数内存使用情况[关闭]

Windows 上的 Java 准确睡眠

这是测量对象内存大小的有效方法吗?

使用 Requests HTTP 库了解 python 中的内存消耗增加

笔记本睡眠是啥意思?有啥用?