为什么一个虚拟主机比其他的慢?

为什么一个虚拟主机比其他的慢?

我的 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 时的最佳结果:

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 不同的方法 - 请参阅这里

相关内容