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

Где моя память ?! Интерфейсный веб-сервер Nginx + PHP-FPM замедляется до сканирования

Я не уверен, есть ли у меня проблема с утечкой памяти (как предлагает моя хостинговая компания), или нам обоим нужно прочитать 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

память теперь кажется стабильной.

Вот две вещи, которые нужно проверить:

  1. Скорее всего у вас утечка памяти. pm.max_requests убьет / перезапустит дочерний процесс php-fpm после обработки такого количества запросов. Поскольку для замедления сканирования вашего бокса требуется около суток, попробуйте установить это число, чтобы каждый дочерний процесс воспроизводился каждые 20 минут или около того. Итак, если вы получаете 200 запросов в минуту и ​​у вас 5 процессов, установите pm.max_requests до 800. Если вы не хотите выполнять математические вычисления, можно выбрать значение от 500 до 1000. Поиграйте с ним, чтобы найти баланс между потерей времени на процессы возрождения и потерей оперативной памяти на утечку памяти.

  2. 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», а затем сообщите нам результаты.