Просмотров: 2943
Дата последнего изменения: 16.09.2015
Дата последнего изменения: 16.09.2015
В последнее время все чаще проявляется проблема блокировки сессий во время эксплуатации проектов на PHP. По умолчанию PHP создает файл для сессии, и процесс его блокирует. Остальные процессы, пытающиеся открыть сессию, выстраиваются в очередь. Логика приложения, особенно, если она сложная, не всегда позволяет эффективно ограничить время блокировки конкурирующих за сессию процессов. Ситуация усугубляется еще тем, что 3-5 подобных клиентов способны быстро забить зависшими и простаивающими в ожидании процессами PHP worker'ы и веб-проект «зависает».
В качестве решения проблемы можно использовать достаточно простой скрипт на AWK. Скрипт выбирает процесс, вызвавший коллапс PHP worker'ов из группы висящих блокировок, и прерывает его:
lsof | awk ' /sess/ { load_sessions[$9]++; if (load_sessions[$9]>max_sess_link_count){ max_sess_link_count = load_sessions[$9]; max_sess_link_name = $9; }; if ($4 ~ /.*uW$/ ){locked_id[$9]=$2}; } END { print max_sess_link_count, max_sess_link_name,locked_id[max_sess_link_name]; if (locked_id[max_sess_link_name] && max_sess_link_count>10) { r=system("kill "locked_id[max_sess_link_name]); if (!r) print "Locking process "locked_id[max_sess_link_name]" killed" } }'