Perf8:Python 的性能指标

·  阅读 1523

作者:Tarek Ziadé

我们正在用 Python 构建这个简洁的服务,以从 Elasticsearch 中的各种来源(MySQL、网络驱动器、A​​WS 等)获取数据,用于企业搜索。

从第三方服务中提取数据到 Elasticsearch 通常是 I/O 密集型活动。 你的代码位于打开的套接字上,并将数据从一端传递到另一端。 这是 Python 异步应用程序的一个很好的用例,但它需要精心设计。

当数据流经该管道时,我们希望确保不会耗尽可用资源(RAM/CPU/FD)。 我们还希望在不终止 Elasticsearch 或后端服务的情况下最大化输出。

因此,这一切都是关于实施正确的节流和背压保护措施并显示正确的设置,这样你就可以根据你的网络带宽、可用 RAM 和 Elasticsearch 集群大小适当地调整服务的激进程度。

如果应用程序可以检查其执行环境并做出一些决定以自动和动态地调整其行为,则可加分。

所有这些调整和性能检查工作都需要针对每个新来源进行。 每次我们改变我们的服务时,我们都有来自不同团队的人参与代码库,我们需要标准化这种性能工作。 服务的性能可能会因为一个新的数据源阻塞事件循环或膨胀内存而下降。

这就是它变得非常有趣的地方:为了检查性能,每个开发人员都有其常用的工具,并且很难以标准化的方式共享这些知识。 Python 有许多工具可以检查你的应用程序的性能,并且没有所谓的 “完美工具”。

这让我回到了 12 年前,当时我在 QA 工具方面遇到了同样的困境并发布了 Flake8 0.1 — 我希望有一个统一的 CLI 来运行精选的 QA 工具列表。

该项目之所以流行,是因为它由了不起的人发展和维护,还因为最初的想法 — 一个 CLI 来统治他们 — 对于那些希望为他们的项目采用 QA 标准和一套良好实践的人来说非常有意义而不必深入研究他们应该运行的内容。 只是 flake8 它。

这正是我们今天要进行的性能测试。 一个统一的工具来运行性能测试,为我们的 Python 项目创建一个标准,并每次都生成相同的标准报告。

我们将其命名为 perf8 作为 flake8 参考(之所以命名为 flake8,是因为它是 pyflakes 和 pep8 的缩写),工作就在这里进行

与 12 年前可用的相比,当前 Python 中的性能工具生态系统是如此惊人。 我就像糖果店里的孩子。

我们集成了 Memray、带有 speedscope 报告的 py-spy 和其他很酷的东西,比如 gprof2dot 生成的点图。 在我们的用例中,Py-spy 优于 cProfile,因为它运行在进程之外,并且在运行应用程序时不会增加大量的速度开销。 但它不适用于最新的 macOS 版本。 所以 cProfile 在这种情况下做出了不错的回退,并且点视图通常很快就会出现热点。

它在独立的 HTML 目录中生成统一的聚合报告,因此可以压缩和传递、自动生成或在开发人员笔记本电脑上生成。 我们不想使用像 metricbeats 这样复杂的系统代理来使其极其便携且易于在所有环境中运行。

要使用它,你只需使用以下命令运行你的 Python 应用程序:$ perf8 -c /path/to/app.py。

除了 HTML 报告之外,该目录还包含所有作为工件的原始指标,因此如果有一天我们想要将我们的 CI 插入 Kibana 仪表板并享受包含历史数据的更好的 UI,我们将能够利用 Perf8。

但就目前而言,简单的静态 HTML 报告就足够了!

请参阅下面的一些屏幕截图:

我们的目标是开发一个精选的工具列表,提供我们在研究一般性能时可能需要的所有指标。

Bob:我认为你的应用程序性能问题

Joe:让我们看看吧。 你能把你的 Perf8 报告发给我吗?

你怎么看?

这是 Elastic 的一个开源项目,欢迎贡献。 如果你知道应该存在的性能工具/库或有改进它的好主意,请通过在项目的问题跟踪器中开始对话来加入乐趣。

分类:
后端
标签:
收藏成功!
已添加到「」, 点击更改