Назад | Перейти на главную страницу

настройка производительности против понимания утечки памяти?

Я читал почти все сообщения в блоге и ответы на ошибки сервера, связанные с этим, но не видел абсолютно никаких улучшений в использовании ЦП или памяти сервера, поэтому я чувствую, что что-то упускаю.

Сначала я подумал, что это проблема WP. Я реплицировал удаленный сервер с помощью Vagrant на своей машине и на сайте WHIPS. Это чертовски быстро. Я не знаю, потому что виртуальная машина использует мой процессор, но у Vagrant VM меньше памяти, чем у удаленного VPS.

Кроме того, они используют ту же версию Ubuntu, те же модули Apache, те же конфигурации сервера, которые показаны ниже. Я настроил удаленный сервер более года назад, так что, возможно, я что-то не проверяю? Я пробовал apt-get dist-upgrade, а также apt-get autoremove как на Linode, так и на Vagrant VM.

Линод VPS:
Ubuntu 10.04
Intel (R) Xeon (R) CPU E5-2670 0 @ 2,60 ГГц, 8 ядер
1,47 ГБ реальной памяти, 256 МБ памяти подкачки

К счастью, сервер (обычно) не блокируется, но он невероятно медленный во время передачи первого байта. Вот что 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.conf

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

my.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

Как правило, подобные вопросы следует закрывать как путь слишком широкий.

Однако это очень интересно:

Увеличение MaxRequestsPerChild почти мгновенно приводит к замене

... что указывает на утечку памяти.

Архитектура PHP делает утечки памяти относительно редкими, но они могут происходить в shm. Но если бы утечка происходила в PHP, я бы не ожидал, что MaxRequestsPerChild повлияет на нее таким образом.

Я бы начал с проверки точных версий Apache и установленного им модуля - в этом отношении он имеет более неоднородный послужной список, чем PHP (например). Убедитесь, что в вашем дистрибутиве установлены все исправления.

Первое, что я заметил, это 39.3%st -- это Кража процессора, что означает, что гипервизор передает процессорное время другой виртуальной машине на той же физической машине. Я бы переместил эту виртуальную машину на другой хост-компьютер. Вам нужно будет поговорить с поставщиком о том, как это сделать.

Что касается ОЗУ, вы должны использовать кеш-код операции, например APC. Вам также следует переключиться с mod_php на FPM. Значение 12 для MaxClients кажется чрезвычайно низким, и тот факт, что увеличение MaxRequestsPerChild (количество запросов, которые процесс будет обрабатывать до повторного использования), если система подкачивается, действительно может быть признаком утечки памяти - вам нужно будет проверить / профилировать код, чтобы решить эту проблему.

Однако в целом 1,47 ГБ - это небольшой объем оперативной памяти для запуска загруженного приложения PHP с локальным сервером MySQL. Вам может просто понадобиться коробка побольше.