我几乎读完了所有与此相关的博客文章和 serverfault 答案,但却没有看到服务器的 CPU 或内存使用情况有任何改善,所以我觉得我遗漏了一些东西。
起初我以为这是 WP 问题。我使用 Vagrant 在我的计算机上复制了远程服务器,并使用 WHIPS 站点复制了远程服务器。速度非常快。我不知道是不是因为 VM 正在使用我的处理器,但 Vagrant VM 的内存比远程 VPS 低。
除此之外,他们使用的是相同版本的 Ubuntu、相同的 Apache 模块、如下所示的相同服务器配置。我一年前就设置了远程服务器,所以也许有些东西我显然没有检查?我在 Linode 和 Vagrant VM 上运行了 apt-get dist-upgrade 以及 apt-get autoremove。
Linode VPS:
Ubuntu 10.04
Intel(R) Xeon(R) CPU E5-2670 0 @ 2.60GHz 8 核
1.47 GB 实际内存,256 MB 交换内存
值得庆幸的是,服务器(通常)不会锁定,但在第一个字节的传输过程中,它的速度非常慢。如下top
所示
top - 06:41:36 up 2 days, 14:02, 1 user, load average: 6.12, 6.16, 5.75
Tasks: 128 total, 6 running, 122 sleeping, 0 stopped, 0 zombie
Cpu(s): 17.3%us, 5.2%sy, 0.0%ni, 30.7%id, 7.5%wa, 0.0%hi, 0.1%si, 39.3%st
Mem: 1546512k total, 1157032k used, 389480k free, 27964k buffers
Swap: 262140k total, 72840k used, 189300k free, 779308k cached
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
9276 www-data 20 0 650m 108m 84m R 101 7.2 6:48.42 apache2
9203 www-data 20 0 646m 122m 102m R 64 8.1 7:10.95 apache2
9208 www-data 20 0 653m 136m 109m R 56 9.0 7:50.82 apache2
9207 www-data 20 0 666m 148m 110m S 51 9.8 7:45.71 apache2
9201 www-data 20 0 656m 124m 95m R 49 8.3 9:09.42 apache2
9204 www-data 20 0 645m 107m 88m D 47 7.1 10:12.04 apache2
9202 www-data 20 0 656m 131m 101m S 45 8.7 9:36.33 apache2
2337 mysql 20 0 165m 41m 3028 S 29 2.8 1064:57 mysqld
7 root 20 0 0 0 0 R 6 0.0 78:57.47 rcu_sched
2734 root 20 0 33304 4452 1904 S 2 0.3 14:52.61 newrelic-daemon
9498 deploy 20 0 2632 1224 932 R 1 0.1 0:00.06 top
httpd配置文件
KeepAlive Off
HostnameLookups Off
Timeout 30
<IfModule mpm_prefork_module>
StartServers 3
ServerLimit 12
MinSpareServers 2
MaxSpareServers 3
MaxRequestsPerChild 300
MaxClients 12
</IfModule>
增加 MaxRequestsPerChild 会导致几乎立即进行交换。
php.ini
; Maximum amount of memory a script may consume (128MB)
; http://php.net/memory-limit
memory_limit = 32M
我的cnf
key_buffer = 24M
max_allowed_packet = 1M
thread_stack = 64K
thread_cache_size = 8
table_cache = 4
sort_buffer = 4M
net_buffer_length = 2K
答案1
我注意到的第一件事是39.3%st
——那是CPU窃取,这意味着虚拟机管理程序正在将 CPU 时间分配给同一物理机上的另一台 VM。我会将此 VM 移动到另一台主机。您必须与提供商讨论如何执行此操作。
关于 RAM,你应该使用类似以下操作码缓存:亚太经合组织。您还应该从 mod_php 切换到纤维增强塑料。12 的值MaxClients
似乎非常低,而增加MaxRequestsPerChild
(进程在回收之前将处理的请求数)导致系统交换的事实确实可能是内存泄漏的迹象——您必须检查/分析代码才能解决它。
但一般来说,1.47 GB 的 RAM 对于运行本地 MySQL 服务器的繁忙 PHP 应用程序来说只是很小的一点。您可能只需要一个更大的盒子。
答案2
一般来说,像这样的问题应该关闭,因为方式太宽泛。
然而这非常有趣:
增加 MaxRequestsPerChild 几乎立即导致交换
...这表明存在内存泄漏。
PHP 的架构使得内存泄漏相对少见 - 但它们可能发生在共享内存中。但如果泄漏发生在 PHP 中,我预计它不会以这种方式受到 MaxRequestsPerChild 的影响。
我将首先检查 Apache 及其安装的模块的确切版本 - 在这方面,它的记录确实比 PHP 更不完整(例如)。确保您的发行版已包含所有补丁。