我已经阅读了几乎所有的博客文章和与此有关的serverfault的答案,但已经看到了服务器的CPU或内存使用情况绝对零的改进,所以我觉得我失去了一些东西。
起初我以为这是一个WP问题。 我在我的机器和WHIPS站点上使用Vagrant复制远程服务器。 这该死的快。 我不知道这是因为虚拟机正在使用我的处理器,但是Vagrant虚拟机的内存比远程VPS要低。
除此之外,他们使用相同版本的Ubuntu,相同的Apache模块,下面看到相同的服务器configuration。 一年前我设置了远程服务器,所以也许有一些我显然没有检查? 我已经通过apt-get dist-upgrade,以及在Linode和Vagrant虚拟机上运行apt-get autoremove。
Linode VPS:
Ubuntu 10.04
Intel(R)Xeon(R)CPU E5-2670 0 @ 2.60GHz 8核
1.47 GB真实内存,256 MB交换内存
谢天谢地,服务器(通常)不会locking,但是在第一个字节的时间里,速度非常慢。 这是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
KeepAlive Off HostnameLookups Off Timeout 30 <IfModule mpm_prefork_module> StartServers 3 ServerLimit 12 MinSpareServers 2 MaxSpareServers 3 MaxRequestsPerChild 300 MaxClients 12 </IfModule>
增加MaxRequestsPerChild结果几乎立即交换。
; Maximum amount of memory a script may consume (128MB) ; http://php.net/memory-limit memory_limit = 32M
key_buffer = 24M max_allowed_packet = 1M thread_stack = 64K thread_cache_size = 8 table_cache = 4 sort_buffer = 4M net_buffer_length = 2K
我注意到的第一件事是39.3%st
– 这是CPU窃取 ,这意味着pipe理程序正在给同一台物理机上的另一台虚拟机CPU时间。 我把这个虚拟机移动到另一台主机上。 你将不得不和提供商谈谈如何做到这一点。
关于RAM,你应该使用像APC这样的操作码caching。 你也应该从mod_php切换到FPM 。 MaxClients
值为12似乎非常低,事实上,增加MaxRequestsPerChild
(进程在回收之前处理的请求数量)会导致系统交换,实际上可能是内存泄漏的标志 – 您必须检查/configuration代码来解决它。
一般来说,1.47 GB是一个用于运行一个繁忙的PHP应用程序与本地MySQL服务器的less量RAM。 你可能只需要一个更大的盒子。
一般来说,这样的问题应该过于宽泛地closures。
然而这是非常有趣的:
增加MaxRequestsPerChild结果几乎立即交换
…指向内存泄漏。
PHP架构使内存泄漏相对罕见 – 但它们可能发生在shm中。 但是如果泄漏发生在PHP中,我不会期望它受到MaxRequestsPerChild的影响。
我会先检查一下Apache的确切版本以及它已经安装的modulse–它在这方面的确有比PHP更糟糕的logging( 例如 )。 确保你的发行版是最新的补丁。