我绞尽脑汁想弄清楚为什么我的网站在服务器资源没有问题的情况下响应速度却如此缓慢,最后我检查了 Apache 状态并发现:
78 requests/sec - 0.7 MB/second - 8.5 kB/request
256 requests currently being processed, 0 idle workers
看来我的 Apache 连接数已经达到极限。任何试图访问我网站的人都会被列入“等待名单”,直到 Apache 再次可用。
看来我有两个选择。
A)将最大连接数限制提高到 256 以上。尽管根据本文这并不容易:
默认情况下,MaxClients 参数的编译硬限制为 256。不过,这可以通过重新编译 Apache 来更改。某些发行版或托管公司会将此限制提高到很高的值,例如 512 甚至 1024,以应对大负载。
B) 找到占用时间过多的脚本。这对我来说似乎更加棘手,因为大多数 Apache 进程只是出现然后又消失。此外,我的站点 PHP 脚本优化得相当好……而且服务器资源再次正常:
Server load 2.69 (8 CPUs)
Memory Used 25.33% (2,039,108 of 8,048,804)
Swap Used 1.32% (54,156 of 4,095,992)
我应该选择哪个选项(如果是其中之一)以及我应该怎么做?
编辑
更多信息:服务器版本:Apache/2.2.23 (Unix) mod_ssl/2.2.23 OpenSSL/1.0.0-fips DAV/2 mod_auth_passthrough/2.1 mod_bwlimited/1.4 FrontPage/5.0.2.2635
HTTP 会议:http://pastebin.com/yBeLt6mP
部分请求示例:http://pastebin.com/vzUVDMPR
如果粘贴框出现异常,请切换文本换行。
答案1
那篇文章不准确;MaxClients
使用 prefork MPM 时可以提高到 256 以上(根据您对问题的描述,我假设您目前使用的是 prefork MPM)。从文档:
对于非线程服务器(即 prefork),
MaxClients
表示将启动以处理请求的最大子进程数。默认值为 256;要增加它,您还必须增加ServerLimit
。
ServerLimit
是具有硬编译限制的一个,但是它已经超出了您的服务器在遇到其他瓶颈的情况下应该达到的范围。 文档:
ServerLimit 20000
编译到服务器中的文件数量有硬性限制(对于 prefork MPM 200000)。这是为了避免拼写错误造成的不良影响。
因此,如果您想将客户端限制提高到 512 左右,那么:
MaxClients 512
ServerLimit 512
您还应该查看您正在使用哪个 MPM,因为除 prefork 之外的其他 MPM 更适合扩展。请参阅这里了解更多信息。
答案2
我建议你使用反向代理,像 nginx 或 lighttpd 这样的代理可以处理比 apache 多得多的连接。根据你的网站使用 htaccess 的方式,你也可以使用带有 fcgi 的 nginx/lighttpd,完全放弃 apache。