【发布时间】:2014-09-12 00:08:13
【问题描述】:
要正确测试我一直在开发的软件(用 C 语言编写),我必须运行大量测试。我一直在使用 python 脚本执行此操作,该脚本一个接一个地执行我的软件给定次数(通常在 1000 到 10000 次重复的范围内)。我正在开发一个 debian 虚拟机(500mb ram)。我一直注意到,随着时间的推移,该程序的性能显着下降。通常我必须重新启动虚拟机才能恢复正常的性能水平。
我的第一个想法是内存泄漏,但 valgrind 在我的 C 程序中没有发现任何问题。此外,我原以为操作系统会在程序终止后以任何一种方式处理这个问题。当我运行 top 或 free -m 时,我看到空闲 ram 相当低(20-70mb),但在运行我的脚本时并没有下降太多,而是在它开始的地方上下波动。
编辑:我的文件在做什么的完整纲要如下:
C 软件
- 许多文件,由不同的人开发
- 具有一直持续到发现给定目标 IP 的循环
- 根据给定的目的地和从先前发送的数据包中接收到的信息构造数据包
- 发送数据包
- 等待数据包回复
模拟网络拓扑的 Python 脚本
- 存储虚假网络
- 拦截传出数据包并根据所述拓扑发送回复
Python 测试脚本
- 对于给定的重复次数,
- 启动网络模拟器
- 启动 C 软件(等到终止 - 进程启动实际上是使用 bash 脚本完成的)
- 退出网络模拟器
模拟器和 c 软件的输出都转储到日志文件中,这些文件在每次执行时都会被覆盖(因此它们应该保持适当的简短)。
谁能给我一些关于这可能是什么的指示?
【问题讨论】:
-
您可能有资源泄漏。你释放你分配的所有内存吗?关闭您打开的所有文件或网络连接?
-
C 代码在做什么?是否涉及任何外部资源?我同意@JoachimPileborg 的观点,它似乎很可能是资源泄漏。也有可能即使没有泄漏,您也可能拥有有限的资源,在释放后恢复缓慢。
-
可用内存应该很低。它用作磁盘缓存。检查系统范围的限制,如否。进程和打开的文件。
-
@TRKemp 我喜欢这可能是恢复缓慢的想法。什么样的情况会导致这种情况,我应该如何正确确认是这种情况?
-
这真的取决于你使用什么资源。某些网络连接即使正确关闭也需要一段时间才能超时。还有其他资源也可以延长恢复时间。例如,文件系统可能需要刷新缓存,这可能需要一段时间。另一件需要考虑的事情是,如果您正在通过分配和解除分配来冲击有限的资源并且它压力很大,一些资源会临时更改计时器以防止系统过载。
标签: python c performance testing memory-leaks