Рейтинг:1

maxConnections или maxThreads на tomcat

флаг tk

Ищу совет - я прочитал две другие темы об этом

в моем файле server.xml у меня есть два места, где maxThreads определены в двух местах:

  1. <Executor name="tomcatThreadPool" namePrefix="catalina-exec-" maxThreads="100" minSpareThreads="4"/>

И

  1. <Connector port="8443" protocol="org.apache.coyote.http11.Http11NioProtocol" maxThreads="100" SSLEnabled="true" scheme="https" secure="true" connectionTimeout="600000" keystoreFile="/usr/local/tomcat/conf/keystore.p12" keystorePass="mypassword" clientAuth="false" sslProtocol="TLS" />

Ошибка, с которой мы часто сталкиваемся на нашем сервере: «Тайм-аут: пул пуст. Не удалось получить соединение в течение 30 секунд, нет доступных [размер: 100; занят: 100; бездействует: 0; последнее ожидание: 30000]» перед фатальным остановом системы (машина перезагружается и снова запускается — на кластере AWS ECS)

Когда я увеличиваю значение maxThreads до 300 во втором из перечисленных здесь экземпляров, мы получаем то же сообщение об ошибке, поэтому я не уверен, что размер соединения вообще увеличился. Поведение системы другое (машина не перезагружается), но тогда пользователи не могут подключиться - в конечном итоге требуется ручная перезагрузка.

Как добиться большего количества подключений к системе или поддерживать максимально высокий уровень подключения?

В других сообщениях на эту тему некоторые предполагают, что уменьшение maxThreads также (при условии, что они выполняются быстро) может повысить производительность.

ОБНОВИТЬ:

в моем файле свойств приложения у меня были следующие настройки:

spring.datasource.url=jdbc:postgresql://db####
spring.datasource.username=#####
spring.datasource.password=######
spring.datasource.tomcat.max-wait=10000
spring.datasource.tomcat.max-active=60
spring.datasource.tomcat.test-on-borrow=true

spring.jpa.show-sql = ложь
#spring.jpa.hibernate.ddl-auto=create-drop
#spring.jpa.hibernate.ddl-auto=проверить
spring.jpa.properties.hibernate.show_sql = ложь
spring.jpa.hibernate.naming-strategy=org.hibernate.cfg.ImprovedNamingStrategy
spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.PostgreSQLDialect

spring.jpa.hibernate.connection.provider_class=org.hibernate.c3p0.internal.C3P0ConnectionProvider
spring.jpa.properties.hibernate.c3p0.min_size=1
spring.jpa.properties.hibernate.c3p0.max_size=30
spring.jpa.properties.hibernate.c3p0.timeout=120
spring.jpa.properties.hibernate.c3p0.max_statements=20
Piotr P. Karwasz avatar
флаг by
Эти сообщения отправляются не пулом рабочих потоков Tomcat, а пулом соединений вашей базы данных. Можете ли вы добавить конфигурацию вашего пула соединений с БД?
RebRy avatar
флаг tk
Петр, спасибо за ваш ответ - я проверил в своей базе данных файл конфигурации (postgres), и для параметра maxConnections установлено значение 500. Определены ли настройки на стороне сервера postgres?
Piotr P. Karwasz avatar
флаг by
Ваше приложение, вероятно, использует пул соединений (Tomcat JDBC, DBCP2, HikariCP, чтобы назвать несколько возможностей). Каждый из них настраивается по-своему. По [погуглив ваше сообщение об ошибке](https://www.google.com/search?q=size%3A100%3Bbusy%3A100%3Bidle%3A0%3Blastwait%3A30000) можно догадаться, что вы используете Tomcat JDBC. Следуйте [документации] (https://tomcat.apache.org/tomcat-9.0-doc/jdbc-pool.html), чтобы увеличить `maxActive` (по умолчанию 100).
RebRy avatar
флаг tk
Да, используя Tomcat JDBC, поскольку я новичок в этом, я не мог понять, где еще искать эти настройки. Это очень помогло - спасибо за размещение ссылок!
Piotr P. Karwasz avatar
флаг by
Кстати: если у вас есть 100 рабочих потоков и 100 подключений к базе данных в пуле, ваше приложение может иметь утечку соединений (т.е. не возвращать их в пул). Вы можете попробовать использовать свойства logAbandoned и removeAbandoned пула, чтобы найти их.
RebRy avatar
флаг tk
Я обновил здесь, показывая свойства приложения (которые, как я думаю, определяют значения по умолчанию для значений, которые я получаю в ошибке). У меня еще не было возможности протестировать его в продакшене.
Рейтинг:1
флаг by

Ваше приложение страдает от исчерпания пула соединений с базой данных: поскольку у вас больше рабочих потоков в Tomcat (100), чем доступных соединений в пуле соединений (60), многим потокам приходится ждать, пока соединение станет доступным. У вас должно быть как минимум столько соединений с базой данных, сколько у вас есть рабочих потоков. Попробуйте с:

spring.datasource.tomcat.max-active=200

Примечание: Поскольку ваш <Connector> не имеет исполнитель атрибут, т. <Executor> созданный вами, не используется и может быть удален (если только его не использует другой коннектор).

Поскольку нет spring.jpa.hibernate.connection.provider_class пул соединений C3P0, который вы пытаетесь настроить, никогда не создается: Hibernate будет использовать тот, который настроен через весна.источник данных.* характеристики. Поэтому вы можете удалить свойства, связанные с C3P0.

RebRy avatar
флаг tk
К сожалению, с этими изменениями служба по-прежнему имела ту же ошибку «Тайм-аут: пул пуст. Невозможно получить соединение через 30 секунд, нет доступных [размер: 100; занято: 100; простоя: 0; последнее ожидание: 30000]». (я добавил maxConnections=300 в
Piotr P. Karwasz avatar
флаг by
Поскольку пул соединений, похоже, не меняется после реконфигурации, возможно, ваше приложение использует не пул соединений Spring, а другой. Проверьте, нет ли у вас `` определение типа `javax.sql.DataSource` в папке `conf` вашего Tomcat (оно может находиться во многих разных файлах).
RebRy avatar
флаг tk
Я снова оглядываюсь на эту проблему (поскольку нам удалось с ней смириться) и пересматриваю возможность настройки наших параметров и упустил одну деталь в вашем замечании - я видел некоторый закомментированный код в нашем server.xml: . будет ли раскомментировать эти строки с помощью исполнителя, определенного ранее в файле server.xml? Есть ли способ эхо/распечатать/зарегистрировать эти виды свойств/конфигураций в журнале запуска java/tomcat?

Ответить или комментировать

Большинство людей не понимают, что склонность к познанию нового открывает путь к обучению и улучшает межличностные связи. В исследованиях Элисон, например, хотя люди могли точно вспомнить, сколько вопросов было задано в их разговорах, они не чувствовали интуитивно связи между вопросами и симпатиями. В четырех исследованиях, в которых участники сами участвовали в разговорах или читали стенограммы чужих разговоров, люди, как правило, не осознавали, что задаваемый вопрос повлияет — или повлиял — на уровень дружбы между собеседниками.