65  /  97

Пример решения проблемы блокировки сессий

Просмотров: 16084
Дата последнего изменения: 23.09.2021
Сложность урока:
2 уровень - несложные понятия и действия, но не расслабляйтесь.
1
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" 
    }
}'


3
Курсы разработаны в компании «1С-Битрикс»

Если вы нашли неточность в тексте, непонятное объяснение, пожалуйста, сообщите нам об этом в комментариях.
Развернуть комментарии