Итак, у меня есть эта машина, на которой запущен сервер XMPP, который подключается к своей базе данных MySQL. Когда я начинаю нагрузочное тестирование, все идет нормально до тех пор, пока примерно через 500 секунд я не замечаю:
Caused by: com.mysql.jdbc.exceptions.MySQLTimeoutException: Statement cancelled due to timeout or client request
начинает появляться. Как они это делают, команда:
mysql> show processlist;
показывает, как MySQL получает следующие запросы, отвечает на них (состояние = отправка данных была записана на ленту), а затем просто бездействует в состоянии = спящий режим в течение 20 секунд, 40 секунд или даже больше. Все это время вызов метода PreparedStatement.execute () не возвращается. В top
показывает использование ЦП не более 800% (16 ядер - половина из них используется на пике).
Я проверил / var / log / messages и несколько других мест в / var / log на наличие ошибок на сервере XMPP без каких-либо подсказок. Я также попробовал другой соединитель JDBC, другой сервер MySQL, обновленный JRE, без улучшений. Где мне искать дальше?
Что дальше ? Спасибо!
РЕДАКТИРОВАТЬ: проверил еще несколько, и это не связано ни с количеством потоков, перекачивающих и отправляющих запросы из своих очередей, ни с запросами в секунду, ни с конкретной машиной, ни с типом выполняемых SQL-запросов или количеством подключений к MySQL. Я также осмотрел tcpdump
захват, и сервер отвечает на запросы через несколько миллисекунд. В остальное время ... Просто клиент почему-то не получает результат в пользовательское пространство TCP.
Но во всех тестах есть показатель, который остается неизменным - когда он достигает чуть более 30 тысяч одновременно подключенных пользователей (пользователей серверов XMPP) - вот тогда и начинаются проблемы.