Просмотров: 16972
Дата последнего изменения: 23.09.2021
Сложность урока:
2 уровень - несложные понятия и действия, но не расслабляйтесь.
3
4
5
В последнее время все чаще проявляется проблема блокировки сессий во время эксплуатации проектов на 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"
}
}'