За последние 24 часа нас посетил 64301 программист и 1754 робота. Сейчас ищет 871 программист ...

Проблемы при использовании семафоров

Тема в разделе "Прочие вопросы по PHP", создана пользователем USHBA, 19 дек 2006.

  1. USHBA

    USHBA Активный пользователь

    С нами с:
    19 дек 2006
    Сообщения:
    1
    Симпатии:
    0
    Адрес:
    Одесса
    Доброго дня всем.
    Столкнулся с вот какой проблемой.
    Есть php-скрипт, который обрабатывает запрос, веб-сервер - Апач.
    Возникла необходимость ограничить количество одновременно выполняемых экземпляров скрипта всего двумя, отодвигая начало выполнения следующего экземпляра скрипта до момента, пока не закончится один из уже выполняемых.
    Скрипт выполняется в среднем 30 миллисекунд, так что за секунду, при последовательном выполнении в два потока (ибо всего два экземпляра можно сразу) будет обработано не более 60-70 запросов. Реально зарегистрированный максимум в часы пик - 31 запрос в секунду, так что - двойной запас, типа, имеем.
    Воспользовался для решения задачи семафорами, а именно - вот так.

    <?
    $key=2;
    $limit=2;

    $sem_id=sem_get($key,$limit);
    sem_acquire($sem_id);

    /*
    тут собственно тело скрипта
    */

    if ( $sem_id ) {
    sem_release($sem_id);
    sem_remove($sem_id);
    }

    ?>

    Система работает на выделенном сервере.
    И вот все работает, запросы действительно выстраиваются в очередь, среднее время выполнения скрипта сократилось раза в два, LA в три раза упал :)

    НО! За сутки сервак (FreeBSD) четыре раза вошел в полный ступор, вплоть до необходимости жесткого ребута. Вход в ступор проиходил каждый раз быстро, не осталяя никакой инфорации ни в каких логах. И это при том, что последние три месяца система работала без единой перезагрузки, как часики.

    После первых двух ребутов увеличил $limit до четырех.
    Эффект тот же.
    И вот вопрос - ГДЕ ТЕ ГРАБЛИ, на которые я наступил?
    Поиски по сети ответа не дали...

    Буду признателен за любую толковую наводку.
    Юрий