使用你的测试套件捕获内存泄漏

主要观点:资源泄漏是一种令人讨厌的 bug,会导致程序逐渐使用更多内存或其他资源,最终可能导致程序死机。可以通过调整测试套件提前发现这类 bug,文章涵盖了内存泄漏的示例、测试套件识别泄漏原因的情况、使用pytest捕获泄漏以及其他类型的泄漏等内容。

关键信息

  • 在 Python 中,对象不再有引用时内存会自动释放,而编译语言可能需要手动释放内存。
  • 可使用内存分析器如 Memray、Fil 或 Sciagraph 识别内存泄漏,但可能受运行环境和程序类型限制,用测试套件识别内存泄漏需满足测试套件覆盖良好、泄漏易重现且足够大等条件。
  • 使用pytestfixture来实现资源泄漏检测,通过在测试前后测量内存使用情况来判断是否有泄漏,示例中通过tracemalloc测量内存。
  • 除内存外,其他资源如文件描述符、GPU 内存等也可能泄漏,可通过类似的fixture在测试中进行检测。

重要细节

  • 示例中运行 Python 程序后因使用过多内存被操作系统杀死,Linux 内核日志显示相关信息。
  • mypackage的测试中,通过设置环境变量CHECK_LEAKS来启用内存泄漏检测fixture,在conftest.py中定义check_for_memory_leaks`fixture`,在测试前后测量内存使用并判断是否泄漏。
  • 发现导致内存泄漏的是被functools.cache装饰的函数make_list_range,其结果会缓存导致内存无限增长,可考虑使用functools.lru_cache或禁用缓存。
阅读 7
0 条评论