Ubuntu 10.04 服务器在 POST 到 mySQL 时出现延迟

Ubuntu 10.04 服务器在 POST 到 mySQL 时出现延迟

我有一台 Ubuntu 10.04 服务器,不知为何,每当对 mySQL 数据库执行 CRUD 操作时,它似乎总是会出现间歇性延迟。大多数 Post 命令在正常的毫秒数内执行,但当出现延迟时,它似乎总是持续约 4.5 秒。这不是一个繁忙的公共服务器,因此问题不应该是服务器负载。让您理解我试图解释的内容的最佳方式是我向您展示。所以事不宜迟,请快速浏览以下几个简短的视频:

视频 1
视频 2

有人能告诉我为什么会发生这种情况以及如何解决它吗?

答案1

正如我在评论中提到的,我没有理由相信 MySQL 是这里的瓶颈,但我确实认为 Web 服务器配置可能会导致这种情况。

例如apt-get install lamp-server^,安装常规 LAMP 设置将安装 PHP 作为 Apache 模块并拉入预分叉MPM。默认情况下,它仅以有限数量的工作程序(分支)开始处理传入连接。任何新连接都不会被处理(但不会被拒绝)。所以,我认为您看到的只是工作程序“池”太小,无法处理所有连接。

当达到此限制时,类似这样的错误可能会出现在您的 Apache 错误日志中的某处:

[error] server reached MaxClients setting, consider raising the MaxClients setting

要在 Apache 中配置 prefork MPM,您可以在以下位置查看当前值/etc/apache2/apache2.conf

# prefork MPM
# StartServers: number of server processes to start
# MinSpareServers: minimum number of server processes which are kept spare
# MaxSpareServers: maximum number of server processes which are kept spare
# MaxClients: maximum number of server processes allowed to start
# MaxRequestsPerChild: maximum number of requests a server process serves
<IfModule mpm_prefork_module>
    StartServers          5
    MinSpareServers       5
    MaxSpareServers      10
    MaxClients          150
    MaxRequestsPerChild   0
</IfModule>

为了改变这种情况,我建议在中创建一个新文件/etc/apache2/conf.d,例如prefork-mpm-tuning.conf,然后“重载”其默认设置(并重新启动 Apache):

<IfModule mpm_prefork_module>
    StartServers          20      # |-- important to increase
    MinSpareServers       20      # |
    MaxSpareServers       50
    MaxClients           70       # too high will get you out-of-memory here
    MaxRequestsPerChild   0
</IfModule>

需要注意的是,Apache 只能扩大规模每秒仅从一个(硬编码,不可配置)并且永远不会缩小,除非您明确配置它。如Apache 有关性能调优的文档

如果机器忙于生成子进程,它就无法处理请求。但是,这会对 Apache 的感知性能产生巨大影响,因此必须将其替换。从 Apache 1.3 开始,代码将放宽每秒一个的规则。它将生成一个,等待一秒钟,然后生成两个,等待一秒钟,然后生成四个,并且它将以指数方式继续,直到它每秒生成 32 个子进程。只要满足 MinSpareServers 设置,它就会停止。

这似乎足够灵敏,几乎不需要调整 MinSpareServers、MaxSpareServers 和 StartServers 旋钮。当每秒生成超过 4 个子进程时,将向 ErrorLog 发出一条消息。如果您看到很多此类错误,请考虑调整这些设置。使用 mod_status 输出作为指南。

虽然最后一段可能适用于一般情况,但在测试中我发现 Apache 在重新启动后似乎没有响应,这非常令人困惑。因此我的建议以提高StartServers设置。

总结一下:

  • 您可能希望增加StartServers以接受从客户端发出的所有后续连接。Apache 的 prefork MPM 不是非常动态的工作器 - 为了能够使其在大量同时连接的情况下表现良好,您只需启动很多连接即可。
  • 允许它分配足够的内存(实际上每个 fork 大约 20MB)。是的,在这个设计中,您需要大量的内存才能服务 100 个并发访问者。(如果您需要更少的内存和更高的性能,请查看 PHP-FPM)
  • 限制MaxClients以防止 Apache 占用服务器的所有内存并使其崩溃。在此处进行计算和测试。
  • 为了节省内存而设置StartServers得太低,同时保持较大的值MaxClients是一件坏事:您的网站会因为每秒一次的原因而显得很慢,并且内存使用量以后无论如何都会增加。那时就会发生这种情况。

参考:

相关内容