У меня есть долго работающее PHP-приложение, которое порождает несколько дочерних процессов для запуска задач на виртуальной машине CentOS, и оно использует очередь сообщений SysV IPC (через msg_get_queue () и т. Д.) Для отправки событий в родительский процесс.
Проблема заключается в том, что, хотя дети хорошо выполняют msg_remove_queue () перед выходом, ресурсы сообщений, похоже, остаются на системном уровне. В конечном итоге это заполняет очередь сообщений, пока не достигнет kernel.msgni.
Самое смешное, что когда я бегу
ipcs
как пользователь, под которым запускается этот скрипт, я вижу, что очереди сообщений появляются и исчезают, как и ожидалось. Однако, когда я запускаю ту же команду, что и root, список очередей медленно и непрерывно увеличивается, и многие из них в списке:
0x00000000 1031634944 <user> 0 0 0
Я не эксперт в очереди сообщений SysV, поэтому я немного не уверен в том, какое решение лучше здесь, или есть ли хорошее решение. В настоящее время я установил для kernel.msgni значение 100 000 (!). Я не уверен, что это хорошая идея для коробки объемом 1 ГБ.
Обратите внимание, что разрешения равны 0, а количество используемых байтов равно 0. Таким образом, теоретически эти очереди не занимают места, хотя в какой-то момент я ожидал бы, что простое повторение системы приведет к загрузке системы.
Мои вопросы:
Задача ещё не решена.
Других решений пока нет …