我正在运行一个流量密集的网站,其中有大量动态内容,大部分是由用户生成的。
该服务器是专用服务器,总共有 4 个 Intel(R) Xeon(R) CPU X3210 @ 2.13GHz 处理器。考虑到服务器有 4GB 的 RAM 并且 MySQL 数据库在单独的服务器上运行,我需要知道 ServerLimit 和 MaxClients apache 指令的最佳值。面板是带有 CentOS 的 DirectAdmin。
下面是我当前的指令,但是在超过 5k 个用户的高峰时段,会注意到一个重要的滞后 - 而且这并不完全是 MySQL 的错误,因为页面似乎生成得很快(我实现了一个页面生成时间计数器),但是在页面开始响应并发送到浏览器之前存在较长的连接延迟。
<IfModule prefork.c>
StartServers 800
MinSpareServers 20
MaxSpareServers 60
ServerLimit 900
MaxClients 900
MaxRequestsPerChild 2000
</IfModule>
Timeout 90
KeepAlive On
KeepAliveTimeout 5
我应该提到,使用 top 命令监控服务器时,高峰时段的 CPU 使用率从未超过 20% 至 30%。MySQL 服务器当时的使用率也有 30% 至 50%,我一直在努力修复慢速查询,但那是另一个问题。我知道这不是数据库瓶颈,因为静态页面在高峰时段也需要很长时间才能加载。
任何关于优化这些值的建议都将不胜感激,谢谢。
答案1
您的 MaxClients 太高了。您的 apache 进程的当前大小是多少?将其乘以 x 900。是否大于 4GB?如果是,则机器可能会进入交换状态。我通常从 MaxClients = 2x vCPUs 开始(grep -c 处理器 /proc/cpuinfo)。在这种情况下大约是 8。然后确保 MaxClients x apache 进程大小不超过 4GB。
您可以根据客户端的连接类型从那里增加 MaxClients。(拨号用户需要被分配,等等。)但请确保您永远不会陷入交换的情况。
然后将 Min、Max 和 Start 服务器设置为 MaxClients。在专用服务器环境中,没有必要让它们有所不同。
然后用 ab 进行一些测试(正如 goose 所指出的。)
答案2
我建议你尝试使用 apache 的基准测试 (ab) 工具。你可以尝试使用这些值来匹配你的流量,看看你在平均加载时间等方面得到了什么样的响应。此时,你可以尝试使用你正在讨论的设置来尝试优化它们。你应该能够使用 ab 来掌握每个性能调整的最佳性能。
谈论您的设置对我来说并不明智,但是您也需要考虑您的 RAM,因为听起来您的这些设置会占用大量 RAM。虽然这只是猜测,没有任何数据。htop 可以让您直观地了解您的资源。
您的平均负载也可能说明很多问题。我怀疑您的 CPU 使用率是否比总核心数高出 20-30%,但这是服务器实际工作强度的另一个指标。
答案3
您需要获取 Apache 进程的平均大小。使用此数字和 RAM 的总大小,您可以计算 MaxClients 指令。请记住:“Web 服务器永远不需要交换”(Apache 性能调优)
使用 top 或 htop 监控是可以的,但是您需要使用一些监控工具(例如 ganglia 或 munin)更好地查看服务器的所有统计信息(cpu、ram、磁盘 i/o、apache 请求、mysql 慢查询等...)以找到可能的瓶颈。