我使用 python 和 Flask 框架编写了一个 Web 应用程序,并使用 mod_wsgi 在 Apache 上设置它。今天我使用 JMeter 对这个应用程序进行一些负载测试。对于一个网址:
当我只设置1个线程发送请求时,响应时间为200ms
当我设置20个并发线程发送请求时,响应时间增加到超过4000ms(4s)。这是无法接受的!
我试图找出问题所在,所以我在烧瓶的 before_request 和 teardown_request 方法中记录了时间。事实证明,处理请求所花费的时间刚刚超过 10 毫秒。
在这个 URL 处理程序中,应用程序只是在 Mysql 数据库中执行一些 SQL 查询(大约 10 个),没什么特别的。
为了测试问题是否出在 Web 服务器或框架配置上,我在同一个烧瓶应用程序中编写了另一个方法 Hello,它只返回一个字符串。它在负载下表现完美,响应时间为 13 毫秒,20 线程并发。
在进行负载测试时,我在服务器上执行“top”,大约有 10 个 apache 线程,但 CPU 大部分是空闲的。
我现在无计可施。即使请求是串行执行的,性能也不应该如此急剧下降......我的猜测是在我不知道的地方有一些排队,除了处理请求之外,肯定还有开销。
如果您有调优 Web 应用程序性能的经验,请帮助!
编辑
关于apache的配置,我用的是MPM worker模式,配置:
<IfModule mpm_worker_module>
StartServers 4
MinSpareThreads 25
MaxSpareThreads 75
ThreadLimit 64
ThreadsPerChild 50
MaxClients 200
MaxRequestsPerChild 0
</IfModule>
至于 mod_wsgi,我尝试打开和关闭 WSGIDaemonProcess(通过注释掉以下行),性能看起来是一样的。
# WSGIDaemonProcess tqt processes=3 threads=15 display-name=TQTSERVER