Некоторого фонОперация таймаута и сброс соединения пэра - 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?
Если я не ошибаюсь, следы исключений, которые вы показываете, - это клиент загрузки нагрузки RBE, который вы используете, чтобы забивать ваш стек сервера. «Сброс соединения с помощью peer» - это условие ошибки, которое подсказывает, что ваш сервер отказался от соединения на уровне TCP в вашем стеке HTTP/TCP/IP. Имеются ли в ваших журналах сервера (в частности, журналы объединения пулов и журналы HTTP-сервера) какие-либо доказательства истощения ресурсов? –
Обычно люди, испытывающие нагрузку, наращивают нагрузку. Начните с 10 или 20 виртуальных пользователей и добавьте их 10 или 20 за раз, пока не найдете первую точку прерывания. Наблюдайте за такими вещами, как одновременные HTTP-соединения, средние нагрузки на загрузку и одновременные подключения MySQL, когда вы запускаете все. Кто-то еще указал, что 400 виртуальных пользователей - очень большое число. YAGNI –