Я не уверен, есть ли у меня проблема с утечкой памяти (как предлагает моя хостинговая компания), или нам обоим нужно прочитать http://linuxatemyram.com. Может, вы умники нам поможете?
Это виртуальная машина интерфейсного веб-сервера, работающая, по сути, только на nginx и php-fpm на RHEL 5.5. Этот сервер поддерживает Magento, PHP для электронной коммерции. Сервер работает в общей среде, но мы скоро это изменим.
В любом случае .. после перезагрузки сервер работает нормально, но в течение дня превратится в ничто. Страницы будут загружаться буквально за 2 минуты, загрузка процессора резко возрастает и т. Д. Консоль даже тормозит, когда я подключаюсь по SSH. Это как будто весь мой сервер ставится на колени.
Я также отслеживал сервер БД через top и tcpdumping входящего трафика. БД простаивает большую часть этого «медленного» времени загрузки. Когда я начинаю видеть запросы, поступающие от внешнего сервера, страница загружается вскоре после этого.
Вот некоторая статистика после того, как я вошел в систему во время замедления после перезапуска php-fpm:
[mike@front01 ~]$ free -m
total used free shared buffers cached
Mem: 5963 5217 745 0 192 314
-/+ buffers/cache: 4711 1252
Swap: 4047 4 4042
[mike@front01 ~]$ top
top - 11:38:55 up 2 days, 1:01, 3 users, load average: 0.06, 0.17, 0.21
Tasks: 131 total, 1 running, 130 sleeping, 0 stopped, 0 zombie
Cpu0 : 0.0%us, 0.3%sy, 0.0%ni, 99.3%id, 0.3%wa, 0.0%hi, 0.0%si, 0.0%st
Cpu1 : 0.3%us, 0.0%sy, 0.0%ni, 99.7%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st
Cpu2 : 0.0%us, 0.0%sy, 0.0%ni,100.0%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st
Cpu3 : 0.0%us, 0.0%sy, 0.0%ni,100.0%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st
Mem: 6106800k total, 5361288k used, 745512k free, 199960k buffers
Swap: 4144728k total, 4976k used, 4139752k free, 328480k cached
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
31806 apache 15 0 601m 120m 37m S 0.0 2.0 0:22.23 php-fpm
31805 apache 15 0 549m 66m 31m S 0.0 1.1 0:14.54 php-fpm
31809 apache 16 0 547m 65m 32m S 0.0 1.1 0:12.84 php-fpm
32285 apache 15 0 546m 63m 33m S 0.0 1.1 0:09.22 php-fpm
32373 apache 15 0 546m 62m 32m S 0.0 1.1 0:09.66 php-fpm
31808 apache 16 0 543m 60m 35m S 0.0 1.0 0:18.93 php-fpm
31807 apache 16 0 533m 49m 30m S 0.0 0.8 0:08.93 php-fpm
32092 apache 15 0 535m 48m 27m S 0.0 0.8 0:06.67 php-fpm
4392 root 18 0 194m 10m 7184 S 0.0 0.2 0:06.96 cvd
4064 root 15 0 154m 8304 4220 S 0.0 0.1 3:55.57 snmpd
4394 root 15 0 119m 5660 2944 S 0.0 0.1 0:02.84 EvMgrC
31804 root 15 0 519m 5180 932 S 0.0 0.1 0:00.46 php-fpm
4138 ntp 15 0 23396 5032 3904 S 0.0 0.1 0:02.38 ntpd
643 nginx 15 0 95276 4408 1524 S 0.0 0.1 0:01.15 nginx
5131 root 16 0 90128 3340 2600 S 0.0 0.1 0:01.41 sshd
28467 root 15 0 90128 3340 2600 S 0.0 0.1 0:00.35 sshd
32602 root 16 0 90128 3332 2600 S 0.0 0.1 0:00.36 sshd
1614 root 16 0 90128 3308 2588 S 0.0 0.1 0:00.02 sshd
2817 root 5 -10 7216 3140 1724 S 0.0 0.1 0:03.80 iscsid
4161 root 15 0 66948 2340 800 S 0.0 0.0 0:10.35 sendmail
1617 nicole 17 0 53876 2000 1516 S 0.0 0.0 0:00.02 sftp-server
...
Есть ли что-нибудь еще, на что мне следует обратить внимание, или дополнительная информация, которая может быть полезна? Я всего лишь разработчик, но замедление работы этой системы меня беспокоит и затрудняет выполнение моей работы.
Помогите мне, ServerFault!
На случай, если кто-то еще пострадает.
Мы только что столкнулись с той же проблемой. Утечка памяти в php5-fpm. ОЗУ используется с каждым запросом страницы и в конечном итоге исчерпывается. Затем ЦП переходит в режим перегрузки, и процесс KSWAP запускает диск подкачки.
единственное, что было исправлено, хотя и не идеальная установка, - это изменить наш файл пула www.conf
pm = динамический
к
pm = ondemand
память теперь кажется стабильной.
Вот две вещи, которые нужно проверить:
Скорее всего у вас утечка памяти. pm.max_requests
убьет / перезапустит дочерний процесс php-fpm после обработки такого количества запросов. Поскольку для замедления сканирования вашего бокса требуется около суток, попробуйте установить это число, чтобы каждый дочерний процесс воспроизводился каждые 20 минут или около того. Итак, если вы получаете 200 запросов в минуту и у вас 5 процессов, установите pm.max_requests
до 800. Если вы не хотите выполнять математические вычисления, можно выбрать значение от 500 до 1000. Поиграйте с ним, чтобы найти баланс между потерей времени на процессы возрождения и потерей оперативной памяти на утечку памяти.
Php-FPM может создавать слишком много дочерних процессов, когда происходит всплеск трафика, из-за чего ему не хватает оперативной памяти и начинается переключение на диск. Решите, какой общий объем ОЗУ выделить для php-fpm, а затем разделите его на то, сколько памяти занимает каждый дочерний процесс. Для форумов на базе Wordpress и PHP я часто вижу, что каждому дочернему процессу требуется 30-45 МБ. Если вы используете только один пул php-fpm, установите pm.max_children
к этому номеру.
Если у вас только один пул php-fpm, вы увидите увеличение скорости от настройки pm.type = static
.
Если у вас есть несколько пулов php-fpm, возможно, потому что вы размещаете несколько приложений и хотите изолировать их по соображениям безопасности, вам нужно установить pm.type = dynamic
и поиграйте с start_servers
, min_spare_servers
, и max_spare_servers
. Просто убедитесь, что совокупный max_children
во всех пулах не больше, чем может выдержать ваша коробка.
Если у вас много приложений с низким трафиком, каждое из которых имеет собственный пул php-fpm, лучше установить pm.type=ondemand
так что каждое приложение потребляет ресурсы только тогда, когда оно действительно используется. Также установите pm.max_children
достаточно низкий, чтобы ни одно приложение не могло полностью заполнить поле.
Я предполагаю, что php5 только что был обновлен с ограничением памяти по умолчанию в 128 МБ, и работает слишком много экземпляров php5 (проверьте pm.max_children в конфигурации php-fpm).
Вышеупомянутое тоже случилось со мной, и я тянул за волосы, пытаясь понять это. Я зарегистрировал отчет об ошибке с помощью ubuntu, но предполагаю, что его нужно исправить в восходящем потоке с помощью php-fpm - значения по умолчанию, которые у меня были, съели бы 6 ГБ ОЗУ, если бы могли. И это, черт возьми, сделало мой сервер 1 Гб бесполезным ...
У вас, вероятно, не установлен кеш-код операций на сервере, который вызывает медленную работу.
Более того, как сказал Марко, в системе может быть запущено большое количество экземпляров php-fpm.
Если вы подозреваете проблему с утечкой памяти, установите расширение suhosin для php, которое предотвратит утечку памяти.
На самом деле, если это утечка памяти, она должна быть зарегистрирована в журнале ошибок php, php.ini имеет возможность сообщать об утечках памяти, report_memleaks = On
В следующий раз, когда сервер замедлится, запустите «vmstat 1» и «iostat 1», а затем сообщите нам результаты.