我正在尝试加速一个包含大量图像的网站,这些图像由单独的子域 static.example.com(与 www. 相同的 IP)提供。
使用 pingdom 工具注意到前 5-6 个请求(在 static.example.com 上)正在建立完整的连接(DNS+SSL+Send+Wait+Receive+Connect)。
这和 prefork 配置有关系吗?
<IfModule mpm_prefork_module>
StartServers 20
MinSpareServers 20
MaxSpareServers 20
ServerLimit 150
MaxRequestWorkers 150
MaxConnectionsPerChild 10000
MaxRequestsPerChild 500
</IfModule>
这是一台 4GB 的机器,流量不大。
平均 Apache 大小:
ps aux | grep'apache2'| awk'{print $6/1024;}'| awk'{avg += ($1 - avg) / NR;} END {print avg " MB";}'
11.2921 MB
MySQL 大约 500MB
KeepAlive 开启,MaxKeepAliveRequests 100,KeepAliveTimeout 5
不确定如何解决这个问题。切换到 MPM-Event 模块有帮助吗?
答案1
是的,您应该切换到事件。
使用 prefork 时,每个连接都需要 1 个进程。除非您在启动时“预加载”它们,否则从 CPU 角度来看,生成进程比生成新线程更耗费 CPU。
但是仍然要提供静态内容和那些规格,您可以轻松地使用带有事件 mpm 的 httpd,并通过几个进程轻松允许 1000 个线程。
一个例子:
StartServers 1
ServerLimit 5
MinSpareThreads 100
MaxSpareThreads 600
ThreadsPerChild 200
ThreadLimit 200
MaxRequestWorkers 10000
MaxConnectionsPerChild 10000000
如果您被迫使用 prefork,例如使用非线程安全的 mod_php 模块,请考虑迁移到 mod_proxy_fcgi -> PHP-FPM。