我运行一个相当繁忙的网络服务器。它非常标准:FreeBSD 7.1 上的 Apache 和 mod_php。它连接到一个单独的 MySQL 服务器。它提供大量静态图像。
用户一直在抱怨响应速度太慢。今天我的加载速度非常慢,然后我的网络浏览器显示“无法连接,请重试”。
从顶部看,服务器实际上处于空闲状态!但它拒绝任何进一步的连接。大约一分钟后,它又开始响应(尽管仍然很慢)。
netstat -s 包括
161796 listen queue overflows
但我不确定这是否是问题所在,因为我已经增加了somaxconn。
我肯定遇到了资源限制。我还应该检查哪些内容来诊断问题?
答案1
也许您有一个相对较小的 MaxClients,keepalives 开启且超时时间较长,并且有相当多的请求。
如果您允许,浏览器通常会保持连接打开 30 秒左右 - 因此不要将 keepalive 设置得太长。
短时间启用 keepalive 对您的用户有益 - 但确实会消耗资源。您能看到 Apache 记分牌(即服务器状态页面?)吗?您的所有插槽是否都处于“K”状态?
一般来说,混合应用程序服务(您的 PHP 应用程序)和高容量静态文件不是一个好主意,它们有不同的要求。一个庞大的 Apache 进程(比如包含 PHP 的进程)将浪费大量内存来提供静态图像,而这些静态图像可以由一个瘦小的进程来提供。考虑将它们放在不同的物理服务器组中,或放在同一组服务器上的不同服务器实例上(具有非常不同的配置)
答案2
首先。瓶颈几乎肯定是 MySQL 后端(或前端和后端之间的网络)。因此,前端处于闲置状态。
其次。如果 Web 服务器负载真的很高,您可能希望通过 nginx/lighttpd 提供静态服务。
第三。我发布了关于FreeBSD sysctl 调整,您可能会发现它很有用。
PS. Apache 还提供了 ListenBacklog 指令,您可能希望将其与 MaxClients 一起增加。
答案3
Apache 的 MaxClients 是一个很大的参数。您可以通过启用 mod_status 并运行“apachectl status”或加载“http://localhost/服务器状态“在 Web 浏览器中从 Web 服务器
答案4
它是否在进行反向 DNS 查找?(禁用它们)
avahi-daemon 是否正在运行?(终止它)