Skip to main content
 首页 » 编程设计

python之使用 Werkzeug/Flask 时如何测量 Web 请求的内存使用情况

2024年10月24日32落叶无声

有没有办法测量 Flask/Werkzeug 应用程序中任意网络请求分配的内存量?任意,我的意思是我更喜欢一种技术,它可以让我在足够高的水平上检测代码,而不必更改它来测试不同路由的内存使用情况。如果那不可能,但仍然可以通过用少量代码包装单个请求来做到这一点,那就这样吧。

在我不久前编写的一个 PHP 应用程序中,我通过在请求的开始和结束时调用 memory_get_peak_usage() 函数并取差来完成此操作。

在 Python/Flask/Werkzeug 中有模拟吗?如果重要,请使用 Python 2.7.9。

请您参考如下方法:

首先,应该了解 PHP 和 Python 请求处理之间的主要区别。粗略地说,每个 PHP worker 只接受一个请求,处理它然后死掉(或重新初始化解释器)。 PHP 是直接为它设计的,它本质上是请求处理语言。因此,测量每个请求的内存使用量非常简单。 Request 的峰值内存使用量等于 worker 的峰值内存使用量。这是一种语言功能。

同时,Python通常使用另一种方式来处理请求。有两种主要模型——同步和异步请求处理。但是,在衡量每个请求的内存使用情况时,它们都有同样的困难。原因是一个 Python worker 在他的一生中处理了大量的请求(并发或顺序)。因此,很难准确获取请求的内存使用情况。

但是,可以调整底层框架和应用程序代码来完成收集内存使用任务。一种可能的解决方案是使用某种 events .例如,可以在以下位置引发抽象的 mem_usage 事件:请求之前、 View 函数的开头、 View 函数的结尾、业务逻辑中的一些重要位置等等。然后它应该存在此类事件的订阅者,做接下来的事情:

import resource 
mem_usage = resource.getrusage(resource.RUSAGE_SELF).ru_maxrss 

此订阅者必须积累此类使用数据,并在 app_request_teardown/after_request 上将其连同有关当前 request.endpoint 或路由或其他信息的信息发送到指标收集系统。

此外,using a memory profiler是个好主意,但通常不适用于生产用途。

进一步阅读请求处理模型: