Sergei
Новичок
Семафоры в PHP и С++. Автоматическое разлочивание долгое время занятых семафоров.
Здравствуйте!
Пишу чат для серверов с нагрузкой от ~1000 человек. Использую демон на С++ для выдачи сообщений в браузер и набор php-файлов для обработки данных от пользователя (чат базируется на известном Voodoo Chat, http://www.vochat.com/). Данные между php-скриптами и демоном передаются через SysV IPC (shared-память и семафоры для синхронизации, ext-модули sysvsem и shmop соответственно). При создании семафоров указывается параметр auto release, так же включено ignore_user_abort(1). В системе стоит ограничение по времени на выполнение скрипта в 30 секунд.
Проблема в том, что при наплыве посетителей иногда залочивается один из синхронизирующих семафоров, лавинно ростут процесы апача, ожидающие его освобождения, в результате система стает нестабильной и неработоспособной.
Полторы недели перебираем логи, но источник проблемы пока неясен -- или какой то из процессов киляется системой и не высвобождает корректно семафор, или какое-то редкое сочетание условий, ждать появления бага иногда приходится по 30-40 минут
.
Вопрос: как можно диагностировать и устранять возникшую ситуацию средствами пхп или С++ ? (пробовал отслеживать SYSVSEM_USAGE в демоне и пытался разлочивать "залипший" семафор, но в стабильное состояние система так и не возвращалась). Есть ли другие методы синхронизации? (флок на файлы -- слишком медленный, к сожалению
). Может, кто то посоветует подход, исключающий возникновение подобных ситуаций? Пока подход стандартный: а) занял семафор б) прочитал-записал в) освободил семафор.
Инфо о системе:
OS: Linux 2.6.11-6mdksmp
Apache 1.3
PHP 5.1.2
Здравствуйте!
Пишу чат для серверов с нагрузкой от ~1000 человек. Использую демон на С++ для выдачи сообщений в браузер и набор php-файлов для обработки данных от пользователя (чат базируется на известном Voodoo Chat, http://www.vochat.com/). Данные между php-скриптами и демоном передаются через SysV IPC (shared-память и семафоры для синхронизации, ext-модули sysvsem и shmop соответственно). При создании семафоров указывается параметр auto release, так же включено ignore_user_abort(1). В системе стоит ограничение по времени на выполнение скрипта в 30 секунд.
Проблема в том, что при наплыве посетителей иногда залочивается один из синхронизирующих семафоров, лавинно ростут процесы апача, ожидающие его освобождения, в результате система стает нестабильной и неработоспособной.
Полторы недели перебираем логи, но источник проблемы пока неясен -- или какой то из процессов киляется системой и не высвобождает корректно семафор, или какое-то редкое сочетание условий, ждать появления бага иногда приходится по 30-40 минут
. Вопрос: как можно диагностировать и устранять возникшую ситуацию средствами пхп или С++ ? (пробовал отслеживать SYSVSEM_USAGE в демоне и пытался разлочивать "залипший" семафор, но в стабильное состояние система так и не возвращалась). Есть ли другие методы синхронизации? (флок на файлы -- слишком медленный, к сожалению
). Может, кто то посоветует подход, исключающий возникновение подобных ситуаций? Пока подход стандартный: а) занял семафор б) прочитал-записал в) освободил семафор.Инфо о системе:
OS: Linux 2.6.11-6mdksmp
Apache 1.3
PHP 5.1.2
