性能调整与理解内存泄漏?

性能调整与理解内存泄漏?

我几乎读完了所有与此相关的博客文章和 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 更不完整(例如)。确保您的发行版已包含所有补丁。

相关内容