Тупик производительности пула адаптера Jco?
Мы запускаем корпоративное приложение SAP с внешними клиентами Springboot, подключающимися через адаптер Jco 3.0 на Oracle VM с использованием пула соединений (размер 100). Мы наблюдаем бессистемные длительные запросы> 10 с, которые не видны в журнале сервера приложений SAP, т.е. узкое место, по-видимому, не на стороне SAP.
Глядя на файлы трассировки (уровень 4) для примера запроса, мы видим, что время, по-видимому, теряется, когда поток адаптера пытается получить клиента из пула (другие потоки продолжают выполнение, для ясности удалили нерелевантные потоки):
[20:05:50:259]: [JCoAPI] JCoContext.isStateful(P-foo-CPIC0) in session ID Client-53-1 returns false
[20:05:50:259]: [JCoAPI] JCoContext.begin(P-foo-CPIC0) in session ID Client-53-1
[20:05:50:259]: [JCoAPI] Started context for session Client-53-1
[20:05:50:259]: [JCoAPI] JCoContext.begin() for destination PFOO_200 (P-foo-CPIC0) on context with id Client-53-1; current state counter is 1
[20:05:50:259]: [JCoAPI] destination PFOO_200 destinationID=P-foo-CPIC0 executes Z_foo sessionID=Client-53-1, threadID=0x35
[20:05:50:259]: [JCoAPI] Context.getConnection on destination PFOO_200 (state: destination = STATEFUL, default = STATELESS)
[20:05:50:259]: [JCoAPI] PoolingFactory.getClient() on pool P-foo-CPIC0
--> time lost here
[20:06:20:840]: [JCoAPI] PoolingFactory.getClient() returns handle [3/84977415]
[20:06:20:840]: [JCoAPI] Context.getConnection on destination PFOO_200 nothing found in the context - got client from ConnectionManager [3/84977415]
[20:06:20:840]: [JCoAPI] JCoClient before execute(Z_foo) on handle [3/84977415]
[20:06:20:840]: [JCoRFC] Executing function Z_foo on handle [3/84977415]
[20:06:20:866]: [JCoAPI] JCoClient after execute(Z_foo) on handle [3/84977415] returns after 26 ms
[20:06:20:866]: [JCoAPI] Context.releaseConnection on destination PFOO_200 [3/84977415]
[20:06:20:867]: [JCoAPI] JCoContext.end(P-foo-CPIC0) in session ID Client-53-1
[20:06:20:867]: [JCoAPI] PoolingFactory.releaseClient() handle [3/84977415] into pool P-foo-CPIC0 [pool size: 3, peak limit: 100, waiting threads: 0, currently used: 1]
[20:06:20:879]: [JCoAPI] Finished context for session Client-53-1
[20:06:20:879]: [JCoAPI] JCoContext.end() for destination PFOO_200 (P-foo-CPIC0) on context with id Client-53-1; current state counter is 0
Для типичного запроса этот шаг обрабатывается в миллисекундах.
Существуют ли какие-либо известные ограничения или конфигурации в отношении обработки пула для адаптера Jco, либо на стороне адаптера, либо на стороне SAP?
Обновление у нас на адаптере Jco 3.0.16
и перепроверим 3.0.17
сейчас. DNS кажется маловероятным, так как мы отслеживаем dig
/nslookup
и они работают без задержек.
2 ответа
Какой уровень патча JCo вы используете? Вы пытались обновить до последней версии патча JCo 3.0.17?
В промежуток времени откроется RFC-соединение и будет выполнен RFC-вход, если в это время пул пуст. У вас был более пристальный взгляд с более высоким уровнем трассировки, или вы изучили трассировку RFC?
Это может быть что угодно: от отсутствия свободного рабочего процесса диалога на стороне ABAP, до проблем с базой данных системы SAP (требуется для проверки подлинности входа в систему RFC), медленного времени отклика от сервера сообщений SAP (при использовании входа в систему с балансировкой нагрузки), проблем с рукопожатием SNC (если используется SNC) или общие проблемы с сетью DNS (попробуйте использовать IP-адрес вместо имени хоста).
Стоит проверить еще один момент: вы говорите, что ваш пул соединений имеет размер 100. Возможно ли, что ваша программа имеет более 100 потоков? Тогда может случиться время от времени, что все соединения в настоящее время заняты в других потоках, и текущий поток должен ждать, пока вызов функции в другом потоке не завершится и соединение не будет возвращено в пул. (Время ожидания потока в пустом пуле можно настроить с помощью параметра "время ожидания пула".)