Зачем нужны семафоры в Progress OpenEdge?
Семафоры обеспечивают доступ к общим объектам данных для множества различных процессов, они предоставляют процессу "лицензию" на блокировку ресурсов, таких как записи, разделяемую память, замки (latches), и т.д. Progress разделяет семафоры на две группы: для входа в систему и для пользовательских процессов. Для входа в систему используется так называемый Логин - семафор, через который каждый процесс должен подключатся к базе данных, и который используется только с этой целью. Пользовательские семафоры используется пользовательскими процессами, уже подключенными к базе данных, чтобы иметь возможность блокировать запись или другой ресурс. Оба типа этих семафоров размещены в одном и том же пуле (pool), который мы называем "semset". Число семафоров в пределах этого набора определено параметром запуска –n для каждой базы данных.
Как и почему необходимо использование Multiple Semaphore Sets (-semsets)?
С самого начала, в Progress имелся только один semset, но в этом случае, был один существенный недостаток – в любой момент времени только один процесс мог его использовать. Причем не зависимо от того, регистрируется ли процесс в базе данных, или выполняет обычную операцию обработки данных. Поэтому, при большом количестве процессов образовывалась очередь за доступом к этому пулу, а это приводило к возникновению узкого места в работе базы данных.
Следующая проблема заключалась в том, что Progress всегда успешно запускал процесс сервера, даже если ядро ОС не было способно предоставить достаточное количество семафоров для каждого процесса, которые были определены параметром –n. В этом случае, база использует столько семафоров, сколько может предложить ядро ОС, после чего они циклически распределяются между имеющимися процессами, не зависимо от того, используют они их в качестве логин - семафора, или в качестве пользовательских семафоров. В этой точке, мы получали как бы выполнение “double contention” и симптомы нехватки семафоров, которые выражались в виде сообщения в логе базы данных: "Warning: only x available wait semaphores".
До сих пор, можно было решить только последнюю проблему - настройкой ядра ОС, увеличив количество доступных семафоров. Но чтобы выполнить настройку Progress для эффективного использования семафоров, не существовало ни какого способа, кроме как использование параметра –spin, который здесь не будет описываться.
Начиная с 8.3A, было осуществлено использование множества наборов семафоров на UNIX платформах, поскольку на NT это всегда было значением по умолчанию. В новой реализации логин-семафор и пользовательские семафоры разделены по различным наборам. Логин - семафоры постоянно находятся в первом наборе, в то время как все другие наборы будут содержать только пользовательские семафоры. Поскольку конкуренция за семафоры связана с производительностью в системах с большим количеством пользователей, то теперь мы можем предоставить большему количеству процессов одновременный доступ к различным ресурсам, позволив им обращаться к более чем одному пулу семафоров.
Как можно определить необходимое значение параметра –semsets?
Для каждых 20 – 50 пользователей рекомендуется, чтобы имелся 1 набор семафоров. Например: если у базы данных есть -n равно 2500, то -semsets устанавливаем равным 50.
Как определить наличие конкуренции за семафоры на рабочей базе данных Progress?
Хорошим инструментом, для определения наличия конкуренции, может стать утилита sar с параметром -u. Если %sys становится выше чем 25 %, то вероятно, что у Вас возникает конкуренция за семафоры, при этом будет отмечаться деградация производительности, связанная с добавлением большего количества пользователей. Так же, Вы можете воспользоваться одним из экранов R&D утилиты promon. Для этого необходимо запустить promon командой promon <dbname>, и выбрать следующий экран: R&D -> Activity Displays -> Other.
04/01/09 Activity:
10:12:45 04/01/09 10:07 to 04/01/09 10:12 (5 min 0 sec)
|
|
Total
|
Per Min
|
Per Sec
|
Per Tx
|
Commit |
1333 |
267 |
4,44 |
1 |
Undo |
0 |
0 |
0 |
0 |
Wait on semaphore |
67 |
13 |
0,22 |
0,05 |
Flush master block |
0 |
0 |
0 |
0 |
Если пользователи для доступа к ресурсу ожидают семафор, то это покажет поле “Wait on semaphore”. Оптимальное значение этого поля может сильно отличаться на разных системах.
Для того, чтобы установить необходимое количество наборов семафоров, воспользуйтесь следующим синтаксисом:
proserve <dbname> -semsets 2 -n 100 Где,
2 - значение semsets,
-n - число пользователей.
-n является дополнительным, и может быть использован в составе .pf - файла. Если значение -n не будет указано в командной строке или в .pf – файле, тогда ему будет присвоено значение по умолчанию, которое равно 20. Если же не определен –semsets, то для него так же будет определено стандартное значение.
В заключении хотел бы отметить, что только с лицензией Enterprise возможно использование Multiple Semaphore Sets (-semsets).
(Башкатов В.Г. 2009 г.)
|