我的 Ubuntu 服务器上有多个虚拟主机。我运行的是 Apache 2.4 和 mod_php。目前,一个网站正在接收大量流量 - 并且需要花费一些时间来响应(有时需要 6 秒以上)。但是 - 此服务器上的其他网站都立即响应。服务器负载不高:
我有 16 个 CPU,当前负载为:2.27 我还远未达到最大内存,因为有 48GB 而我只使用了大约 10GB。
我所讨论站点的虚拟主机配置文件非常简单:
<VirtualHost 0.0.0.0:8080>
ServerName MySite.com
ServerAlias *.MySite.com
ServerAdmin [email protected]
DocumentRoot /var/www/html/MySite.com
ErrorLog ${APACHE_LOG_DIR}/error.log
<Directory /var/www/>
Options Indexes FollowSymLinks MultiViews
AllowOverride All
Order allow,deny
allow from all
</Directory>
</VirtualHost>
请注意,我正在使用 Varnish - 它解释了端口 8080。
服务器的最新 mod_status 输出:
Server uptime: 1 hour 49 minutes 21 seconds
Server load: 2.70 2.69 2.63
Total accesses: 943706 - Total Traffic: 17.8 GB
CPU Usage: u717.5 s40.96 cu0 cs0 - 11.6% CPU load
144 requests/sec - 2.8 MB/second - 19.8 kB/request
91 requests currently being processed, 24 idle workers
因为这个特定的站点使用了会话,而 varnish 对它没有任何实际用处,所以我在 default.vcl 文件中使用以下内容来完全“绕过”varnish:
if (req.http.host ~ "(www)?(mysite).com") {
set req.http.connection = "close";
return (pipe);
}
我的 mpm_prefork.conf 文件,适用于服务器上的所有站点:
<IfModule mpm_prefork_module>
ServerLimit 4000
StartServers 2
MinSpareServers 2
MaxSpareServers 5
MaxRequestWorkers 4000
MaxConnectionsPerChild 0
</IfModule>
你知道为什么会发生这种情况吗?
我使用以下 mpm_worker 设置切换到 PHP-FPM:
<IfModule mpm_worker_module>
ServerLimit 250
StartServers 10
MinSpareThreads 75
MaxSpareThreads 250
ThreadLimit 64
ThreadsPerChild 32
MaxClients 8000
MaxRequestsPerChild 10000
</IfModule>
网站仍需一段时间才能加载 - 而其他网站则立即响应。使用 PHP-FPM 时的最佳结果:
我的 /etc/php5/fpm/pool.d/www.conf 设置:
pm = static
pm.max_children = 1200
pm.start_servers = 16
pm.min_spare_servers = 1
pm.max_spare_servers = 36
pm.max_requests = 800
答案1
mod_php 仅在一个线程中运行您的应用程序,因为这就是它所能做的一切 - 应用程序只能在 16 个 CPU 核心中的一个上运行(在 中确认,top
一个进程可能占用一个核心的 100%)
您需要使用与 mod_php 不同的方法 - 请参阅这里。