我已经创建了一个docker容器,内容如下
操作系统:Debian 11
WebServer:httpd2.4(已启用 mpm_event)
后端:PHP-FPM
Docker 在 EC2 中运行,我为 Docker 容器提供了 10GB RAM 和 5CPU。
UI 上的一切运行正常,我的应用程序运行良好。现在我期待优化服务器以增加并发请求和性能。
所以我所做的是
httpd.conf(/usr/local/apache2/conf/httpd.conf)
启用了 mpm_event 模块,注释了 mpm_prefork 和 mpm_worker 模块,添加了以下配置
<IfModule mpm_event_module>
ServerLimit 256
StartServers 125
MinSpareThreads 100
MaxSpareThreads 150
ThreadLimit 64
ThreadsPerChild 25
MaxRequestWorkers 2000
MaxConnectionsPerChild 10000
</IfModule>
PHP-FPM 配置
pm = dynamic
pm.max_children = 256
pm.start_servers = 125
pm.min_spare_servers = 100
pm.max_spare_servers = 150
pm.max_requests = 1000
m.max_spawn_rate = 100
当我尝试使用 apache 基准测试 `ab -n 500 -c 100“http://localhost/test.php” 检查负载测试时,需要 35 秒才能加载。
在 mpm_event 模块之前,我使用 prefork,并在 16 秒内得到响应。不知道我错过了什么
答案1
对类似事件的线程 mpm 使用更正确的方法。您当然不需要也不应该使用这么多子进程。虽然我的提示不是完美的科学,但至少在疯狂分配进程之前要考虑可用的 CPU 核心数量。
这是实现 2000 名工人的更明智的方法。
StartServers 1
ServerLimit 4
MinSpareThreads 100
MaxSpareThreads 1200
ThreadsPerChild 500
ThreadLimit 500
MaxRequestWorkers 2000
MaxConnectionsPerChild 100000000