Назад | Перейти на главную страницу

Ошибки подключения Tomcat при слишком большом количестве пользователей

Я тестирую приложение, работающее на Tomcat (6.0.33). По мере увеличения числа пользователей у меня начинаются проблемы с подключением. Вот что возвращает jMeter. Я новичок в Tomcat, может ли кто-нибудь дать совет, где даже начать поиск?

org.apache.http.conn.HttpHostConnectException: Connection to https://example.domain.edu refused
    at org.apache.http.impl.conn.DefaultClientConnectionOperator.openConnection(DefaultClientConnectionOperator.java:190)
    at org.apache.http.impl.conn.ManagedClientConnectionImpl.open(ManagedClientConnectionImpl.java:294)
    at org.apache.http.impl.client.DefaultRequestDirector.tryConnect(DefaultRequestDirector.java:640)
    at org.apache.http.impl.client.DefaultRequestDirector.execute(DefaultRequestDirector.java:479)
    at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:906)
    at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:805)
    at org.apache.jmeter.protocol.http.sampler.HTTPHC4Impl.sample(HTTPHC4Impl.java:284)
    at org.apache.jmeter.protocol.http.sampler.HTTPSamplerProxy.sample(HTTPSamplerProxy.java:62)
    at org.apache.jmeter.protocol.http.sampler.HTTPSamplerBase.sample(HTTPSamplerBase.java:1075)
    at org.apache.jmeter.protocol.http.sampler.HTTPSamplerBase.sample(HTTPSamplerBase.java:1064)
    at org.apache.jmeter.threads.JMeterThread.process_sampler(JMeterThread.java:426)
    at org.apache.jmeter.threads.JMeterThread.run(JMeterThread.java:255)
    at java.lang.Thread.run(Thread.java:680)
Caused by: java.net.ConnectException: Operation timed out
    at java.net.PlainSocketImpl.socketConnect(Native Method)
    at java.net.PlainSocketImpl.doConnect(PlainSocketImpl.java:351)
    at java.net.PlainSocketImpl.connectToAddress(PlainSocketImpl.java:213)
    at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:200)
    at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:432)
    at java.net.Socket.connect(Socket.java:529)
    at com.sun.net.ssl.internal.ssl.SSLSocketImpl.connect(SSLSocketImpl.java:570)
    at org.apache.http.conn.ssl.SSLSocketFactory.connectSocket(SSLSocketFactory.java:549)
    at org.apache.http.impl.conn.DefaultClientConnectionOperator.openConnection(DefaultClientConnectionOperator.java:180)
    ... 12 more

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

  • ЦП, память или ввод-вывод (в этом поможет vmstat)

  • Вы могли попасть в ulimit для максимального количества открытых сокетов, файлов или процессов (это будет записано в системный журнал)

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

Вкратце: нагрузочное тестирование, по крайней мере, с целью оптимизации производительности службы под нагрузкой, полезно только в том случае, если вы объедините его с тщательным мониторингом службы, которую вы тестируете, с целью количественной оценки ее результатов. При таком мониторинге нагрузочное тестирование сообщает вам только порог, после которого ваш сервис больше не используется.

Вы должны увеличить максимальное количество потоков в конфигурации tomcat.

Вот объяснение: http://tomcat-configure.blogspot.com.es/2009/01/tomcat-maxthreads-configuration.html