2013-08-29 2 views
0

Некоторого фонОперация таймаута и сброс соединения пэра - 400 одновременных доступов к MySQL

Я работаю над проектом, где мы имеем устаревшее очень простой книжный веб-приложение с 1999, написанным на Java EE 1.4. Однако цель состоит в том, чтобы модернизировать его, чтобы запустить его в облачной среде, такой как Amazon AWS. Мы решили переписать его с начала с использованием Spring framework, Hibernate и c3p0 для объединения пулов.

Помимо веб-приложения мы также получили инструмент стресс для веб-приложения под названием RBE (эмулятор удаленного браузера). Вы просто говорите RBE, сколько пользователей вы хотите, и он создает один поток для каждого пользователя. Каждый поток произвольно генерирует url, и он делает это до тех пор, пока пользователь просматривает страницу (мы определили, что пользователь просматривает сайт на 180 секунд). После этого он отключает поток, и это так. Для каждого запроса он берет источник HTML-страницы, разбирает jsessionid и затем переходит к следующему URL-адресу.

Проблема

Когда я бегу ОБЭ для 400 пользователей (что составляет 400 запросов в секунду), я быстро получаю следующее исключение:

java.net.SocketException: Connection reset by peer 
    at java.net.PlainSocketImpl.socketConnect(Native Method) 
    at java.net.PlainSocketImpl.doConnect(PlainSocketImpl.java:382) 
    at java.net.PlainSocketImpl.connectToAddress(PlainSocketImpl.java:241) 
    at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:228) 
    at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:431) 
    at java.net.Socket.connect(Socket.java:527) 
    at sun.net.NetworkClient.doConnect(NetworkClient.java:158) 
    at sun.net.www.http.HttpClient.openServer(HttpClient.java:388) 
    at sun.net.www.http.HttpClient.openServer(HttpClient.java:523) 
    at sun.net.www.http.HttpClient.<init>(HttpClient.java:227) 
    at sun.net.www.http.HttpClient.New(HttpClient.java:300) 
    at sun.net.www.http.HttpClient.New(HttpClient.java:317) 
    at sun.net.www.protocol.http.HttpURLConnection.getNewHttpClient(HttpURLConnection.java:970) 
    at sun.net.www.protocol.http.HttpURLConnection.plainConnect(HttpURLConnection.java:911) 
    at sun.net.www.protocol.http.HttpURLConnection.connect(HttpURLConnection.java:836) 
    at sun.net.www.protocol.http.HttpURLConnection.getInputStream(HttpURLConnection.java:1172) 
    at rbe.EB.getHTML(EB.java:423) 
    at rbe.EB.run(EB.java:324) 

Через некоторое время, когда РРБ пытаются просматривать другие подстраниц я получаю:

java.net.ConnectException: Operation timed out 
    at java.net.PlainSocketImpl.socketConnect(Native Method) 
    at java.net.PlainSocketImpl.doConnect(PlainSocketImpl.java:382) 
    at java.net.PlainSocketImpl.connectToAddress(PlainSocketImpl.java:241) 
    at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:228) 
    at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:431) 
    at java.net.Socket.connect(Socket.java:527) 
    at sun.net.NetworkClient.doConnect(NetworkClient.java:158) 
    at sun.net.www.http.HttpClient.openServer(HttpClient.java:388) 
    at sun.net.www.http.HttpClient.openServer(HttpClient.java:523) 
    at sun.net.www.http.HttpClient.<init>(HttpClient.java:227) 
    at sun.net.www.http.HttpClient.New(HttpClient.java:300) 
    at sun.net.www.http.HttpClient.New(HttpClient.java:317) 
    at sun.net.www.protocol.http.HttpURLConnection.getNewHttpClient(HttpURLConnection.java:970) 
    at sun.net.www.protocol.http.HttpURLConnection.plainConnect(HttpURLConnection.java:911) 
    at sun.net.www.protocol.http.HttpURLConnection.connect(HttpURLConnection.java:836) 
    at sun.net.www.protocol.http.HttpURLConnection.getInputStream(HttpURLConnection.java:1172) 
    at rbe.EB.getHTML(EB.java:423) 
    at rbe.EB.run(EB.java:324) 

код на EB.java:423) (где произошло исключение) является:

BufferedReader in = new BufferedReader(new InputStreamReader(connection.getInputStream())); 

Моя my.cnf конфигурация:

[mysqld] 
log=/var/log/mysqld.log 
max_connections = 200 
log-slow-queries = /var/log/mysqld_slow_queries.log 
log-error = /usr/local/mysql/data/mysql-error.log 
back-log = 200 
key_buffer_size=16M 
max_allowed_packet=100M 
interactive_timeout=30 
wait_timeout=30 

Tomcat соответствующие настройки в server.xml:

<Connector connectionTimeout="20000" port="8080" protocol="HTTP/1.1" redirectPort="8443" acceptCount="500" /> 

я также сделал тест и служил статические HTML-файлы с задержкой 2 секунды и не делать ничего iteraction с базой данных. Я сделал этот тест, чтобы узнать, не может ли Tomcat обрабатывать 400 одновременных запросов. Томкат успешно прошел этот тест.

Каково узкое место для 400 одновременных доступов к mysql? Это слишком много для MySQL?

+0

Если я не ошибаюсь, следы исключений, которые вы показываете, - это клиент загрузки нагрузки RBE, который вы используете, чтобы забивать ваш стек сервера. «Сброс соединения с помощью peer» - это условие ошибки, которое подсказывает, что ваш сервер отказался от соединения на уровне TCP в вашем стеке HTTP/TCP/IP. Имеются ли в ваших журналах сервера (в частности, журналы объединения пулов и журналы HTTP-сервера) какие-либо доказательства истощения ресурсов? –

+0

Обычно люди, испытывающие нагрузку, наращивают нагрузку. Начните с 10 или 20 виртуальных пользователей и добавьте их 10 или 20 за раз, пока не найдете первую точку прерывания. Наблюдайте за такими вещами, как одновременные HTTP-соединения, средние нагрузки на загрузку и одновременные подключения MySQL, когда вы запускаете все. Кто-то еще указал, что 400 виртуальных пользователей - очень большое число. YAGNI –

ответ

0

В вашем my.cnf указано, что max_connections = 200. Это может быть проблемой.

400 Запросы кстати. много.

+0

Я попытался установить max_connections = 1000, но никакой разницы. Похоже, что Tomcat не может обрабатывать так много запросов или MySQL. Я где-то читал, что Tomcat может вызвать проблемы, потому что он может обрабатывать так много запросов и что Tomcat отменяет запросы на MySQL.Может кто-нибудь, кто знает вещи более подробно, объясняет, где проблема? – Ivansek

Смежные вопросы