LINUX.ORG.RU
ФорумAdmin

Через 332 дня аптайма затупил NGinx. В чем может быть причина?

 ,


1

2

Сайт на Nginx + PHP5.6, в последние пару месяцев было ~5000 уникумов в день, ~7000 страниц.

# uptime
 10:31:36 up 332 days, 21:49,  1 user,  load average: 2.12, 2.12, 2.09


Сегодня Nginx выдал ошибку:

504 Gateway Time-out nginx/1.6.2


По htop вижу, что память выжрал php-fpm. Всего на сервере 1Gb, использовано:

# free -h
             total       used       free     shared    buffers     cached
Mem:          1.0G       923M        83M        68M        65M       713M
-/+ buffers/cache:       145M       862M
Swap:           0B         0B         0B


У php-fpm вижу 1 процесс со статусом D. Процесс, имеющий статус S может получить статус D спустя некоторое время. Пример с процессом 23265:

# ps aux | grep php-fpm
root       460  0.0  1.3 105288 14024 ?        Ss    2018  33:25 php-fpm: master process (/etc/php5/fpm/php-fpm.conf)
www-data 23232  0.6  3.3 116828 34536 ?        S    09:20   0:33 php-fpm: pool www                                 
www-data 23237  0.6  3.3 116860 34648 ?        S    09:21   0:29 php-fpm: pool www                                 
www-data 23240  0.7  3.2 116780 33752 ?        S    09:22   0:32 php-fpm: pool www                                 
www-data 23264  0.5  3.3 116568 34312 ?        D    09:27   0:23 php-fpm: pool www                                 
www-data 23265  0.6  3.3 116816 34748 ?        S    09:27   0:26 php-fpm: pool www                                 
root     23992  0.0  0.2   4556  2108 pts/0    S+   10:39   0:00 grep php-fpm

# ps aux | grep php-fpm
root       460  0.0  1.3 105288 14024 ?        Ss    2018  33:25 php-fpm: master process (/etc/php5/fpm/php-fpm.conf)
www-data 23232  0.7  3.3 116828 34536 ?        S    09:20   0:35 php-fpm: pool www                                 
www-data 23237  0.6  3.3 116676 34464 ?        S    09:21   0:31 php-fpm: pool www                                 
www-data 23240  0.7  3.2 116700 33816 ?        S    09:22   0:35 php-fpm: pool www                                 
www-data 23264  0.5  3.3 116568 34396 ?        S    09:27   0:26 php-fpm: pool www                                 
www-data 23265  0.6  3.3 116816 34748 ?        D    09:27   0:29 php-fpm: pool www                                 
root     24029  0.0  0.2   4556  2152 pts/0    S+   10:44   0:00 grep php-fpm


Вот. Что все это значит? Перед тем как я сделаю ребут, хотел бы понять что произошло, чего серверу не хватило.

Хотя, перед ребутом я попробую перезапустить php-fpm, может и ребутиться ненадо. Но хотелось бы понять в чем причина 504-й ошибки.



Перемещено leave из web-development

★★★★★

Ответ на: комментарий от ya-betmen

А что твой пых делает? Что-то считает? В базу лазает?

База SQLite3. Из проблемных мест, на многие запросы он лезет на GitHub, берет оттудова контент и показывает пользователю.


Может там while (true) sleep ?

Ну такой дикости точно нет.

Xintrea ★★★★★ ()
Ответ на: комментарий от Deleted

За 332 дня ни одного апдейта? Может в этом причина?

Хоумпейджи - они такие. Да я каждый раз подссыкиваю апдейтиться. Накачаешь апдейтов, а потом несколько дней выгребаешь, разбираясь что там отвалилось на этот раз.

Xintrea ★★★★★ ()
Ответ на: комментарий от Xintrea

Это содержимое файла

www.conf
(по умолчанию), который лежит где-то здесь /etc/php/5.6/fpm/pool.d

Ну или это может быть файл с именем твоего домена.

Twissel ★★★★★ ()
Последнее исправление: Twissel (всего исправлений: 4)

Завис и выжрал память fpm, а затупил nginx?

504 код означает, что сервер, на который nginx отправил запрос ( upstream ), не ответил. Можно увеличить таймаут, и хорошо бы проверить upstream

В твоём случае этот upstream скорее всего и есть fpm

router ★★★★★ ()
Ответ на: комментарий от Xintrea

Обновки лучше накати и ребутни весь сервак. Хотя так то он прав, достаточно fpm ребутнуть. Правда если хостер гоняет десктопное железо на нодах (есть такие) - то проблема может быть и в другом месте.

Deleted ()
Ответ на: комментарий от Xintrea

Твоя просьба похожа на просьбу огласить выхлоп phpinfo()

Совсем непохожа)) Дело в том, что по дефолту для бэкенда там стоят неоптимальные настройки именно по жору памяти. Я, конечно, ниже напишу опцию, но неужели так сложно показать файлик? Личные данные можно сменить.

pm = ondemand

Поставь как указал выше.

Twissel ★★★★★ ()
Ответ на: комментарий от Xintrea

Сначала смени dynamic на ondemand.

Тыц!

Ну и, понятно дело, перезапусти пулл (php-fpm). А вообще php-fpm это такая вещь которая требует настройки, а не поставил и забыл.

Twissel ★★★★★ ()
Последнее исправление: Twissel (всего исправлений: 2)
Ответ на: комментарий от Twissel

Дело в том, что по дефолту для бэкенда там стоят неоптимальные настройки именно по жору памяти.

У меня вот так настроено:

pm = dynamic
pm.max_children = 5
pm.start_servers = 2
pm.min_spare_servers = 1
pm.max_spare_servers = 3

Xintrea ★★★★★ ()
Ответ на: комментарий от Twissel

Хм, когда останавливаю php-fpm, память не высвобождается. Например, было занято 881M, становится 815M...

Ага, походу нашел:

  PID USER      PRI  NI  VIRT   RES   SHR S CPU% MEM%   TIME+  Command
31615 root       20   0 53756 31712 14140 R 31.8  3.1  6:55.21 php .../libraries/sitemapSpider.php


Формирователь Sitemap затупил похоже.

Xintrea ★★★★★ ()
Ответ на: комментарий от Xintrea

Когда я фрилансил по этой теме делал так (дистрибутив Убунту):

Определяем среднее потребление памяти одним процессом

ps -ylC php-fpm7.0 --sort:rss | awk '{sum+=$8; ++n} END {print "Tot="sum"("n")";print "Avg="sum"/"n"="sum/n/1024"MB"}'

Далее делал такую инструкцию заказчику

1) Исходим из того, что размер процесса php-fpm в среднем равен 40 Мб (для ваших сайтов). Делим количество оперативной памяти на сервере на это значение получаем максимальное количество процессов, которое может запуститься на данной конфигурации при полной загрузке;

2) Записываем 75-80% от значения максимального количества процессов в параметр pm.max_children в файле /etc/php/7.0/fpm/pool.d/www.conf ;

3) В этом же файле меняем значение по-умолчанию pm = dynamic на ondemand . Таким образом мы указали, что воркеры php-fpm будут создаваться только тогда, когда это необходимо. Т.е. они не будут попусту отъедать ОЗУ, ожидая подключения пользователя;

4) Значение pm.max_children в конфигурационных файлах остальных хостов (сайтов) устанавливаем как pm.max_children из

www.conf
поделить на количество ядер процессора.

5) Перезапускаем наш веб-сервер командами systemctl restart nginx, systemctl restart php-fpm .

Может фигню написал, т.к. все это сильно зависит от характера трафика на сервер, см. ссылку выше. Но работало это дело долго и счастливо.

Twissel ★★★★★ ()
Последнее исправление: Twissel (всего исправлений: 2)
Ответ на: комментарий от Xintrea

У тебя процесс повис, а ядро его не сняло. Кильни процесс руками, или если не получается - ребут системы. ПРоблема, скорее всего, с памятью на ноде.

Deleted ()
Ответ на: комментарий от Twissel

Определяем среднее потребление памяти одним процессом
ps -ylC php-fpm7.0 --sort:rss | awk '{sum+=$8; ++n} END {print «Tot=„sum“(„n“)»;print «Avg=„sum“/„n“=„sum/n/1024"MB“}'

Хм, у меня простой ps aux показывает:

...
root     24548  0.0  2.1 105288 21716 ?        Ss   11:45   0:00 php-fpm: master process (/etc/php5/fpm/php-fpm.conf)
root     24634  0.0  0.0      0     0 ?        S    11:53   0:00 [kworker/0:2]
root     24639  0.0  0.0  16512   936 ?        Ss   11:53   0:00 nginx: master process /usr/sbin/nginx -g daemon on; master_process on;
www-data 24640  0.9  0.6  17452  6260 ?        S    11:53   0:03 nginx: worker process
www-data 24661  1.3  3.0 116560 31860 ?        S    11:54   0:02 php-fpm: pool www
www-data 24668  0.9  3.0 116512 31368 ?        S    11:54   0:01 php-fpm: pool www
www-data 24683  1.1  2.8 114268 29020 ?        S    11:56   0:01 php-fpm: pool www
www-data 24691  1.5  2.8 116104 29684 ?        D    11:57   0:00 php-fpm: pool www


А команда:
ps -ylC php-fpm

выводит пустую строку...

Xintrea ★★★★★ ()
Ответ на: комментарий от Xintrea

Из проблемных мест, на многие запросы он лезет на GitHub, берет оттудова контент и показывает пользователю.

Вангую, что в D оно где-то здесь и влетает.

leave ★★★★★ ()
Ответ на: комментарий от Deleted

У тебя процесс повис, а ядро его не сняло. Кильни процесс руками, или если не получается - ребут системы. ПРоблема, скорее всего, с памятью на ноде.

Похоже на то. Я ребутнулся, но страницы по минутам открываются, или показывают 504 Gateway Time-out. Хотя бываю какие-то всплески работы, вдруг на пару минут все начинает работать шустро, потом опять все тупит и таймоут на простых страницах.

Что делать? Хостера пинать?

Xintrea ★★★★★ ()
Последнее исправление: Xintrea (всего исправлений: 1)
Ответ на: комментарий от Xintrea

Нагрузка на CPU вов ремя генерации страницы? Хватает ли памяти? Если объем данных, которые PHP обрабатывает не менялся - таки пинать хостера.

Deleted ()
Ответ на: комментарий от Deleted

Нагрузка на CPU вов ремя генерации страницы? Хватает ли памяти? Если объем данных, которые PHP обрабатывает не менялся - таки пинать хостера.

Нагрузка на CPU крутится в районе 3% у каждого веркера. После перезагрузки памяти используется пятая часть:

# free -h
             total       used       free     shared    buffers     cached
Mem:          1.0G       218M       789M        13M        24M       104M



Объем данных не менялся, все штатно.

Кароч хостера реально надо пнуть.

Xintrea ★★★★★ ()
Ответ на: комментарий от Xintrea

А вас случайно не «перевезли» на что-то помедленнее?
Опишу с чем столкнулся я. Есть некий сайт о котором я знаю только то что он существует. Крутился на хетзнере VQ. Сейчас VQ закрывают и переносят на cloud. Меня попросили помочь в переносе. Не вопрос, перенес, обычный rsync же. Но вот незадача, на новом месте по таймауту стал отваливаться. Как понял я в результате изысканий, «камешек» (если можно так назвать) на новом месте помедленнее. Помогло «подкручивание» таймаутов, шел эмпирическим путем (не знаток всей этой пофигистики и лениво глубоко лезть было), типа «ну вот это предположительно должно повлиять».

anc ★★★★★ ()
Последнее исправление: anc (всего исправлений: 1)
Ответ на: комментарий от anc

А вас случайно не «перевезли» на что-то помедленнее?

А кто ж мне об этом скажет?

Я написал в техподдержку, они ответили: проблем не видим. Я смотрю - и правда, все само стало работать как положено. Сразу после того как в поддержку написал.

Xintrea ★★★★★ ()