С этого утра память одного из наших веб-серверов заполняется php, что в конечном итоге приведет к тому, что сервер начнет подкачку, замедлится и станет недоступным (вход в систему ssh занимает около 5 минут, а иногда он полностью умирает) ...
Интересно, как бы вы справились с решением подобных проблем?
Jul 23 06:16:31 websrv2 kernel: [10409040.981882] php-cgi invoked oom-killer: gfp_mask=0x200da, order=0, oom_adj=0
Jul 23 06:16:31 websrv2 kernel: [10409040.981888] php-cgi cpuset=/ mems_allowed=0
Jul 23 06:16:31 websrv2 kernel: [10409040.981892] Pid: 27697, comm: php-cgi Not tainted 2.6.32-5-amd64 #1
Jul 23 06:16:31 websrv2 kernel: [10409040.981894] Call Trace:
Jul 23 06:16:31 websrv2 kernel: [10409040.981903] [<ffffffff810b6714>] ? oom_kill_process+0x7f/0x23f
Jul 23 06:16:31 websrv2 kernel: [10409040.981908] [<ffffffff8106bdee>] ? timekeeping_get_ns+0xe/0x2e
Jul 23 06:16:31 websrv2 kernel: [10409040.981912] [<ffffffff810b6c38>] ? __out_of_memory+0x12a/0x141
Jul 23 06:16:31 websrv2 kernel: [10409040.981916] [<ffffffff810b6d8f>] ? out_of_memory+0x140/0x172
Jul 23 06:16:31 websrv2 kernel: [10409040.981921] [<ffffffff810baaf4>] ? __alloc_pages_nodemask+0x4ec/0x5fc
Jul 23 06:16:31 websrv2 kernel: [10409040.981927] [<ffffffff810d92d8>] ? read_swap_cache_async+0x5d/0xf3
Jul 23 06:16:31 websrv2 kernel: [10409040.981931] [<ffffffff810d93c5>] ? swapin_readahead+0x57/0x98
Jul 23 06:16:31 websrv2 kernel: [10409040.981937] [<ffffffff8100c18d>] ? __raw_callee_save_xen_pte_val+0x11/0x1e
Jul 23 06:16:31 websrv2 kernel: [10409040.981941] [<ffffffff810cd245>] ? handle_mm_fault+0x47f/0x80f
Jul 23 06:16:31 websrv2 kernel: [10409040.981947] [<ffffffff813001a6>] ? do_page_fault+0x2e0/0x2fc
Jul 23 06:16:31 websrv2 kernel: [10409040.981952] [<ffffffff812fe045>] ? page_fault+0x25/0x30
Jul 23 06:16:31 websrv2 kernel: [10409040.981954] Mem-Info:
Пытаюсь пойти по пути сортировки процессов по использованию памяти:
ps -e -orss =, args = | sort -b -k1,1n | pr -TW $ COLUMNS
Я вижу кучу / usr / bin / php-cgi, потребляющую память. Как я могу ограничить общее потребление памяти PHP, чтобы сервер никогда не был доведен до предела, чтобы израсходовать всю память / своп и стать недоступным?
Дополнительная информация о системе:
ii php5 5.3.3-7+squeeze18 server-side, HTML-embedded scripting language (metapackage)
ii apache2 2.2.16-6+squeeze11 Apache HTTP Server metapackage
вы можете ограничить использование памяти пользователем (пользователем, который запускает процессы php-cgi) с помощью cgroups.
например, чтобы ограничить использование памяти пользователем, вы можете сделать следующее:
# file: /etc/cgconfig.conf
group php {
memory {
memory.limit_in_bytes = "2G";
}
}
И затем вам нужно добавить своего пользователя php-cgi в эту cgroup-group:
# file: /etc/cgrules.conf
phpcgiuser memory php
Если вы хотите ограничить использование памяти для каждого процесса, вы можете сделать это с помощью ulimit (100 МБ на процесс).
# file: /etc/security/limits.conf
phpcgiuser hard as 102400
Изменить: Тем не менее, вы должны проанализировать программное обеспечение, которое вызывает утечку памяти.
На какой ОС вы вообще работаете? На всех своих веб-серверах со всеми обслуживаемыми веб-приложениями я делаю следующее:
Таким образом, я никогда не сталкивался с этим сейчас, потому что каждый раз, когда у меня было приложение, пытающееся переполнить ОЗУ собой, просто вылетало, не оказывая никакого влияния на остальные веб-приложения.
Однако я также настоятельно рекомендую найти виновника этого массового переполнения, это может быть атака или плохо написанный код (я предполагаю второй).
Но больше всего я рекомендую ОБНОВЛЕНИЕ ВЕРСИИ PHP !!!! PHP 5.5 уже мертв, поддержки для него нет. Если невозможно обновить до 7.1, то хотя бы до 5.6.
Если это результат регулярного использования, вам следует проверить эти PHP-скрипты на утечку памяти, бесконечные циклы и другие пугающие проблемы.