即使在本地网络上,Linux / Apache 的性能也很慢

即使在本地网络上,Linux / Apache 的性能也很慢

我有一台运行 Apache 和 MYSQL 的 Ubuntu 服务器。系统和版本信息如下:Linux kernel 3.0.0.-12 Apache/2.2.20 MySQL Ver 14.14.Distrib 5.1.58

我在这个服务器上运行了几个网站,有些是 HTML,有些是 PHP/MySQL。问题是响应时间非常慢,无论是静态网站还是动态网站。有时需要超过 10 秒才能得到响应,这使得网站非常慢,几乎无法使用。
即使从本地网络请求也会出现此问题。我已将所涉及的子域添加到我的 /etc/hosts 文件中,并且使用 IP 号代替 URL 并不能解决所有问题。因此不存在 DNS 查找问题。
我已通过显示响应时间修改了日志格式,有时文件需要 12 秒才能被提供,请参阅示例屏幕截图中的 jquery~.js 文件。
我无法解释这个极长的响应时间,但这甚至不是这里唯一的问题,其他一些文件也需要很长时间才能被提供,但在日志文件中没有显示较长的响应时间。
所以这里可能涉及不同的组织。我到现在都找不到解决方案,有什么建议吗?提前谢谢,Klaas

访问日志文件的屏幕截图链接

一些额外的配置信息:

apache2.conf(注释已删除)

LockFile ${APACHE_LOCK_DIR}/accept.lock
PidFile ${APACHE_PID_FILE}
Timeout 300
KeepAlive On
MaxKeepAliveRequests 100
KeepAliveTimeout 5
<IfModule mpm_prefork_module>
    StartServers          5
    MinSpareServers       5
    MaxSpareServers      10
    MaxClients          150
    MaxRequestsPerChild   0
</IfModule>

<IfModule mpm_worker_module>
    StartServers          2
    MinSpareThreads      25
    MaxSpareThreads      75 
    ThreadLimit          64
    ThreadsPerChild      25
    MaxClients          150
    MaxRequestsPerChild   0
</IfModule>

<IfModule mpm_event_module>
    StartServers          2
    MinSpareThreads      25
    MaxSpareThreads      75 
    ThreadLimit          64
    ThreadsPerChild      25
    MaxClients          150
    MaxRequestsPerChild   0
</IfModule>

User ${APACHE_RUN_USER}
Group ${APACHE_RUN_GROUP}

AccessFileName .htaccess

<Files ~ "^\.ht">
    Order allow,deny
    Deny from all
    Satisfy all
</Files>

DefaultType text/plain
HostnameLookups Off

ErrorLog ${APACHE_LOG_DIR}/error.log
LogLevel warn

Include mods-enabled/*.load
Include mods-enabled/*.conf
Include httpd.conf
Include ports.conf
LogFormat "%v:%p %h %l %u %t \"%r\" %>s %O \"%{Referer}i\" \"%{User-Agent}i\"" vhost_combined
LogFormat "%h %l %u %t \"%r\" %>s %O \"%{Referer}i\" \"%{User-Agent}i\" %T/%D" combined
LogFormat "%h %l %u %t \"%r\" %>s %O" common
LogFormat "%{Referer}i -> %U" referer
LogFormat "%{User-agent}i" agent
Include conf.d/
Include sites-enabled/

而对于其中一个速度较慢的站点来说,虚拟主机文件实际上非常简单……

<VirtualHost *:80>
    ServerAdmin [email protected]
        ServerSignature EMail
        ServerName toenjoy.drsklaus.nl
    DocumentRoot /var/www/toenjoy.drsklaus.nl
    <Directory />
        Options FollowSymLinks
        AllowOverride None
    </Directory>
    <Directory /var/www/toenjoy.drsklaus.nl/>
        Options Indexes FollowSymLinks MultiViews
        AllowOverride AuthConfig
                AuthType Basic
                AuthName "To Enjoy"
                AuthUserFile /etc/.htpasswd
                Require user petraaa
        Order allow,deny
        allow from all
    </Directory>

    ScriptAlias /cgi-bin/ /usr/lib/cgi-bin/
    <Directory "/usr/lib/cgi-bin">
        AllowOverride None
        Options +ExecCGI -MultiViews +SymLinksIfOwnerMatch
        Order allow,deny
        Allow from all
    </Directory>

    ErrorLog /var/log/apache2/error.log

    # Possible values include: debug, info, notice, warn, error, crit,
    # alert, emerg.
    LogLevel warn
    CustomLog /var/log/apache2/access.log combined

    Alias /doc/ "/usr/share/doc/"
    <Directory "/usr/share/doc/">
        Options Indexes MultiViews FollowSymLinks
        AllowOverride None
        Order deny,allow
        Deny from all
        Allow from 127.0.0.0/255.0.0.0 ::1/128
    </Directory>
</VirtualHost>

free -m 的输出如下:

klaas@ubuntu-server:/etc/apache2$ free -m
             total       used       free     shared    buffers     cached
Mem:          1997       1401        595          0        144       1017
-/+ buffers/cache:        238       1758
Swap:         2035          0       2035

我没有发现在网站变慢时发生交换的迹象。我运行了 top,似乎不是 CPU 问题。我的印象是 apache 线程的产生可能是瓶颈,但这只是一个建议。也许这提供了一些额外的信息!

编辑:问题似乎消失了一段时间,但又出现了!不仅使用 Apache,使用 SSH 连接也需要很长时间,有时需要长达 15 秒才能要求输入密钥短语。此外,scp 运行非常慢。行为确实不可预测,使服务器很难使用。有什么想法吗……?

答案1

当您尝试通过lynxcurl从本地主机或网络上的机器进行访问时会发生什么?

另外,看看来自 Apache 的这个块:

Alias /doc/ "/usr/share/doc/"
<Directory "/usr/share/doc/">
    Options Indexes MultiViews FollowSymLinks
    AllowOverride None
    Order deny,allow
    Deny from all
    Allow from 127.0.0.0/255.0.0.0 ::1/128
</Directory>

我建议删除整个阻止,重新启动 Apache 并重试。当 Apachedeny对本地主机或本地 IP 地址执行某些操作时,我也遇到过奇怪的挂起情况。奇怪的 DNS 查找问题可能会根据每个请求挂起 Apache。每页 12 秒的延迟让我认为这就是原因。但从您的配置中无法 100% 确定我指出的阻止是否是罪魁祸首。但请对与 Apache 相关的 DNS 查找相关任务进行某种搜索。

此外,如果不观察网站的实际流量,很难说应该在服务器上进行哪些设置,但我认为您的KeepAlive设置似乎占用大量资源。我建议按如下方式进行更改:

KeepAlive On
MaxKeepAliveRequests 50
KeepAliveTimeout 2

我还建议您在主要内容中降低MaxClients和添加ServerLimit调整,如下所示:MaxRequestsPerChildapache2.conf

<IfModule mpm_prefork_module>
    StartServers          5
    MinSpareServers       5
    MaxSpareServers      10
    ServerLimit          90
    MaxClients           90
    MaxRequestsPerChild 2000
</IfModule>

<IfModule mpm_worker_module>
    StartServers          2
    MinSpareThreads      25
    MaxSpareThreads      64 
    ThreadLimit          64
    ThreadsPerChild      25
    ServerLimit          90
    MaxClients           90
    MaxRequestsPerChild 2000
</IfModule>

<IfModule mpm_event_module>
    StartServers          2
    MinSpareThreads      25
    MaxSpareThreads      64 
    ThreadLimit          64
    ThreadsPerChild      25
    ServerLimit          90
    MaxClients           90
    MaxRequestsPerChild 2000
</IfModule>

另外,我强烈建议安装穆宁在您的机器上控制资源使用情况。省去了很多麻烦,并提供了良好的宏观视角。

答案2

Apache 是一个复杂的系统,可能是这里的问题……也可能不是。在深入研究这个黑洞之前,我会先调试一般的网络缓慢问题。具体来说:

  • 尝试在端口上以服务器模式运行 netcat,配置为分发本地文件的内容,然后从机器本身连接到该文件。例如:

    当为真时;执行 nc -l 80 < index.html ; 完成

这样就消除了 apache、物理网络和 DNS 或 IP 链接问题。请注意,提供的文件是本地的 - 例如没有 NFS 挂载。

  • 同样,但从同一子网通过本地网络连接
  • 再次,但来自不同的子网

如果您能做到这一点,则说明您的服务器很好,并且您的网络路由也没有问题。

现在清理 DNS,并确保反向查找有效。例如,挖掘 4.3.2.1.in-addr.arpa 来测试 1.2.3.4 地址的查找。如果它很慢,那就是一个问题,您需要使用 /etc/resolv.conf、dnsmasq 或您拥有的任何工具进行操作。在一切稳定之前不要继续。此时也值得尝试使用 SSH/SCP 进入盒子 - 它应该很快。

接下来是 Apache。如果你做到了这一点,你就知道你的网络很好,DNS 工作正常,盒子也正常。所以剩下的就是你的应用程序(即 www 服务器)。尝试将配置精简到最低限度,看看你的情况如何。例如这里就是其中之一。

祝你好运!

答案3

编辑:一次尝试一个!

有几件事很明显:

MaxRequestsPerChild 0

如果你没有理由使用0进程永不消亡)然后稍微增加一点(默认值为1000),然后100重新启动,看看是否能有所改善。可能会防止内存泄漏。

MaxClients 150

取决于您的服务器有多少内存,如果同时调用所有三个模块,您可能会耗尽内存。例如,如果您的 Apache 进程大小为 20MB,您将拥有 150 个客户端 x 20MB x 3 个模块 = 9000 MB ~ 8.8 GB。即使只调用其中一个,您也会使用 ~ 2.9 GB。

如果您不使用全部三个模块,请从 apache 实例中卸载不需要的模块。

另外,在这种缓慢的性能表现过程中,top输出情况如何?free -m

相关内容