22 ноября 2010 г.

Семафоры, UNIX, FreeBSD.

Попалась серьезная проблема по семафорам при переводе производственного сервера на базе FreeBSD с СУБД Firebird 2.1 на 2.5. Вылез неприятный казус, при котором уперлись в количество семафоров в 256. И началось. LA почти дошел до 1000. При том, что раньше я видел максимум 170-200 на httpd.
Количество процессов постоянно росло. Выяснить удалось из-за чего выросло такое количество процессов: каждый раз при подключении к Firebird появляется новый процесс fb_inet_server, который запускается через inetd. Процессу не хватает в системе семафоров и он остается ждать их появления.
Ситуацию удалось исправить добавив правило, запрещающее установку соединения на порт Firebird (по умолчанию 3050, мы умолчания никогда не меняем в таких случаях):
ipfw add deny tcp from 10.0.0.0/8 to me 3050 setup
Рост количества процессов прекратился. Но система работала не так как должа бы работать. А что изменилось?
По сути, в 2.5 поменяли технологию блокировки: если раньше в роли блокировок выступал отдельный сервер fb_lock_mgr, то теперь каждый процесс самостоятельно выполнял задачи блокировок. Более того, убрали из конфигурации firebird.conf описание семафором - вроде как они теперь не нужны. А в 2.1 приходилось постоянно увеличивать их количество при росте количества подключений.
Но. У нас в итоге оказалось такое, что каждый процесс fb_inet_server отъедал 1 семафор и в конце уперся в 255 (1 семафор использовался zabbix-агентом для мониторинга сервера).
Почему так - на данный момент так и не разобрались.
Решение было принято следующее: вернуться на старую сборку 2.1, база которого несовместима с 2.5.
Хочется разобраться со всем этим. Почему уперлись в 256 семафоров, при том, что реально в системе по sysctl доступно намного больше их.

Ссылки на начальные сведения по семафорам:
http://www.sean.de/Solaris/sysvipc.html - описание расчета семафоров
http://greenteapress.com/semaphores/ - лекция с примерами по семафорам
http://www.cs.cf.ac.uk/Dave/C/node26.html - программирование и описание семафоров
http://forums.freebsd.org/showthread.php?t=6397 - этот модуль я так и не понял, что он делает. Просьба подсказать что и как.

PS: доработать и добавить скриншоты и статистику.