Я читал почти все сообщения в блоге и ответы на ошибки сервера, связанные с этим, но не видел абсолютно никаких улучшений в использовании ЦП или памяти сервера, поэтому я чувствую, что что-то упускаю.
Сначала я подумал, что это проблема 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
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
Как правило, подобные вопросы следует закрывать как путь слишком широкий.
Однако это очень интересно:
Увеличение MaxRequestsPerChild почти мгновенно приводит к замене
... что указывает на утечку памяти.
Архитектура PHP делает утечки памяти относительно редкими, но они могут происходить в shm. Но если бы утечка происходила в PHP, я бы не ожидал, что MaxRequestsPerChild повлияет на нее таким образом.
Я бы начал с проверки точных версий Apache и установленного им модуля - в этом отношении он имеет более неоднородный послужной список, чем PHP (например). Убедитесь, что в вашем дистрибутиве установлены все исправления.
Первое, что я заметил, это 39.3%st
-- это Кража процессора, что означает, что гипервизор передает процессорное время другой виртуальной машине на той же физической машине. Я бы переместил эту виртуальную машину на другой хост-компьютер. Вам нужно будет поговорить с поставщиком о том, как это сделать.
Что касается ОЗУ, вы должны использовать кеш-код операции, например APC. Вам также следует переключиться с mod_php на FPM. Значение 12 для MaxClients
кажется чрезвычайно низким, и тот факт, что увеличение MaxRequestsPerChild
(количество запросов, которые процесс будет обрабатывать до повторного использования), если система подкачивается, действительно может быть признаком утечки памяти - вам нужно будет проверить / профилировать код, чтобы решить эту проблему.
Однако в целом 1,47 ГБ - это небольшой объем оперативной памяти для запуска загруженного приложения PHP с локальным сервером MySQL. Вам может просто понадобиться коробка побольше.