Параметры для настройки сетевой коммуникации
В многоуровневой среде приложений клиенты взаимодействуют с сервером базы данных по сети. Сетевая коммуникация является ещё одним потенциальным источником узких мест, которые могут привести к снижению производительности.
СУБД OpenEdge упаковывает записи в сетевые сообщения при выполнении запросов к базе данных от удалённых пользователей. Записи сохраняются в кэше упреждающей выборки (prefetching) и становятся доступны сразу же, как это потребуется. Это называется упреждающей выборкой потому, что сервер получает дополнительные записи в буфер сообщений до того, как клиент фактически запросит их.
По умолчанию, упреждающая выборка активируется, когда используется одно из следующего:
- блоки FOR EACH и PRESELECT EACH использующие NO-LOCK;
- оператор FIND;
- опция BY, когда сортировка выполняется не в индексном порядке;
- запросы, использующие SCROLLING и NO-LOCK;
- функция CAN-FND.
Если используется лицензия OpenEdge Enterprise RDBMS, то администратор с помощью определённых параметров старта базы данных может выполнить настройку для улучшения сетевого взаимодействия.
Далее рассмотрены следующие параметры для настройки сетевого взаимодействия:
- Message Buffer Size
- Prefetch Delay
- Prefetch NumRecs
- Prefetch Factor
- Prefetch Priority
Message Buffer Size
СУБД использует буферы сообщений для перемещения записей, упакованных в сообщение, между серверами и удалёнными клиентами. Размер буфера сообщения в байтах указывается параметром старта Message Buffer Size (-Mm). По умолчанию, если параметр специально не установлен, размер буфера сообщений равен 1024 байт.
Для выбора размера буфера сообщений применяются следующие общие рекомендации:
- если в базе данных хранятся большие записи, то для устранения фрагментации необходимо увеличить значение параметра (-Mm);
- если сеть работает более эффективно с небольшими сообщениями, то необходимо уменьшить значение параметра (-Mm).
Синтаксис параметра старта Message Buffer Size (-Mm):
-Mm <размер в байтах>
До версии OpenEdge 11.6 значение параметра Message Buffer Size должно было быть одинаковым как для сервера базы данных, так и для клиента. Начиная с OpenEdge 11.6 значения параметра между клиентом и сервером могут отличаться, при этом значение сервера имеет приоритет, т.е. значение параметра на стороне клиента используется для первоначальной инициализации буфера, но после установления соединения, клиент будет использовать значение сервера.
Prefetch Delay
Когда удалённый клиент запрашивает данные из базы используя запрос с упреждающей выборкой, сервер отвечает на этот запрос отправкой множества сетевых сообщений. По умолчанию клиенту немедленно отправляется первое сообщение, содержащее первую запись, ассоциированную с упреждающей выборкой. Последующие сетевые сообщения содержат оставшиеся записи, при этом каждое сообщение по умолчанию содержит 16 записей.
Для улучшения производительности администратор может указать серверу чтобы сетевое сообщение, содержащее первую запись, было заполнено большим количеством записей перед отправкой клиенту. Это сокращает количество отправляемых сообщений. Чтобы добиться этого применяется параметр старта базы данных Prefetch Delay (-prefetchDelay).
Синтаксис команды старта Prefetch Delay (-prefetchDelay):
-prefetchDelay
Если используется параметр Prefetch Delay, то рекомендуется использовать дополнительные параметры старта -prefetchNumRecs и -prefetchFactor, которые отвечают за объём пересылаемых данных.
Prefetch NumRecs
Для настройки количества записей в сетевом сообщении применяется параметр старта Prefetch NumRecs (-prefetchNumRecs). Допустимые значения этого параметра находятся в диапазоне от 1 до 32766. По умолчанию применяется значение 16.
Синтаксис параметра старта Prefetch NumRecs (-prefetchNumRecs):
-prefetchNumRecs <кол-во записей>
В зависимости от размера записей в базе данных, значение -prefetchNumRecs может быть установлено выше или ниже 16. Из-за накладных расходов в сообщении (заголовок и прочая информация протокола) и задержек внутри самой сети, чем больше записей вы сможете упаковать в каждое сообщение, тем эффективнее будет выборка записей и тем лучше производительность базы данных. При этом если текущее значение Prefetch NumRecs будет превышать текущее значение параметра Message Buffer Size (-Mm), то будет использоваться размер буфера сообщений.
Prefetch Factor
Дополнительно к указанию количества записей упреждающей выборки в сетевом сообщении можно использовать целое значение, определяющее процент заполнения буфера сообщений, для этого используется параметр старта Prefetch Factor (-prefetchFactor). Допустимые значения этого параметра находятся в диапазоне от 0 до 100.
Например, значение 10 означает, что буфер сообщения должен быть заполнен на 10% перед отправкой сервером сетевого сообщения клиенту. А значение 100 будет означать, что буфер сообщения должен быть заполнен на 100% перед отправкой.
Для оптимальной производительности рекомендуется использовать значение параметра -prefetchFactor равным 100.
Синтаксис параметра старта Prefetch Factor (-prefetchFactor):
-prefetchFactor <% заполнения буфера сообщений>
Примечание: если в базе данных одновременно используются параметры -prefetchNumRecs и -prefetchFactor, то сетевое сообщение будет отправлено, когда значение одного из этих параметров будет достигнуто.
Prefetch Priority
Если используются только параметры упреждающей выборки, то сервер по умолчанию копирует первую запись упреждающей выборки в буфер сетевого сообщения, а затем проверят, есть ли другие пользователи, которые делают какие-либо запросы. Если нет других пользователей, то сервер копирует следующую запись в буфер сообщения и снова проверяет, есть ли запросы от других пользователей. Если же есть запрос от другого пользователя, то сервер обрабатывая этот запрос, т.е. работает в режиме «по требованию», что приводит к ожиданиям в обработке упреждающей выборки.
Для проверки запросов от других пользователей сервер использует механизм опросов poll(), что приводит к увеличению потребления системных ресурсов CPU. В противоположность этому, когда сервер выполняет копирование записи упреждающей выборки в буфер сообщения, то используется меньше системных ресурсов CPU.
Таким образом, более эффективным для сервера будет скопировать в буфер сообщения сразу несколько записей перед тем, как выполнить проверку наличия запросов от других пользователей. Для этого используется параметр старта Prefetch Priority (-prefetchPriority), с помощью которого указывается количество записей упреждающей выборки, которые должны быть добавлены в сообщение перед проверкой запросов от других пользователей. Таким образом упреждающая выборка получает приоритет перед обработкой сервером новых запросов от других удалённых подключений. Допустимые значения параметра Prefetch Priority находятся в диапазоне между 0 и 32766.
Для лучшей производительности рекомендуется использовать значение 100.
Синтаксис параметра старта Prefetch Priority (-prefetchPriority):
-prefetchPriority <кол-во записей>
Использование параметра приводит к уменьшению системного времени CPU и к увеличению пользовательского времени CPU, а значит, к увеличению производительности.