Я выполняю тесты нагрузочного тестирования HTTP (используя Тест Apache и Осада) в небольшом приложении Java EE 1.7.0 / Tomcat 7.0.26, работающем в Debian Squeeze 6.0.4 x64, виртуализированном с помощью Virtualbox 4.1.8. Хост компьютера - Ubuntu 11.10 x64.
Я изменил эти параметры в Tomcat server.xml
:
<Connector
port="8080"
protocol="HTTP/1.1"
connectionTimeout="200000"
redirectPort="8443"
acceptCount="2000"
maxThreads="150"
minSpareThreads="50" />
Приложение, выполняемое на сервере, занимает около 300 мс.
Это приложение работает нормально до тех пор, пока не будет установлено определенное количество одновременных подключений, таких как:
ab -n 500 -c 150 http://xx.xx.xx.xx:8080/myapp/
ab -n 1000 -c 50 http://xx.xx.xx.xx:8080/myapp/
siege -b -c 100 -r 20 http://xx.xx.xx.xx:8080/myapp/
Полно socket connection timed out
происходит, и это приводит к полной перегрузке хост-процессора (но загрузка ЦП внутри виртуальной машины нормальная).
Делая htop
на хосте я вижу, что процесс Virtualbox работает под 300% ЦП и никогда не опускается даже после завершения нагрузочного теста. (Я выделил ВМ 4 процессора, если я выделю только один процессор, загрузка ЦП упадет ниже 100%).
Перезапуск Tomcat ничего не делает, я вынужден перезапустить всю виртуальную машину.
Я попытался запустить эти команды ab / siege локально на виртуальной машине, и все прошло хорошо.
Сначала я подумал, что это связано с ограничением сети Linux, как описано здесь: Запуск некоторых тестов с использованием ab, и tomcat начинает действительно тормозить Итак, я изменил эти параметры TCP:
echo 15 > /proc/sys/net/ipv4/tcp_fin_timeout
echo 30 > /proc/sys/net/ipv4/tcp_keepalive_intvl
echo 1 > /proc/sys/net/ipv4/tcp_tw_recycle
echo 1 > /proc/sys/net/ipv4/tcp_tw_reuse
Это кажется будет лучше, но продолжает перегружать центральный процессор и выводить socket connections time out
при определенном количестве одновременных подключений.
Мне интересно, не связано ли это с тем, как Virtualbox обрабатывает внешние одновременные соединения.
Я видел эту проблему раньше, когда у вас есть петля, из-за которой ваш сетевой трафик постоянно перенаправляется. Попробуйте проверить, не проходит ли через какой-либо из ваших сетевых интерфейсов абсурдно большой объем трафика.
Если это не сработает, прекращается ли загрузка ЦП при остановке гостевой ОС или вам нужно выключить весь контейнер виртуальной машины?
Прежде всего, вы ничего не говорите о хосте VBox. Насколько это мощно? Когда я провожу нагрузочное тестирование VBox, я использую машину с 12 ядрами и 32 ГБ ОЗУ для запуска виртуального сервера с 2-8 ядрами и до 12 ГБ ОЗУ. Другими словами, основной хост более мощный, чем гость VBox, поэтому я достаточно уверен, что у гостя есть выделенные ядра и оперативная память.
Затем я настраиваю и хост, и гостевую ОС для обработки нагрузки. Такие вещи, как максимальное количество открытых файлов, максимальное количество открытых сокетов и различные настройки TCP / IP, такие как буферы. Их необходимо правильно настроить для проведения нагрузочного тестирования. Если вы построите график данных с диапазоном нагрузок, вы увидите, что когда вы достигнете предела ОС, они внезапно станут намного хуже. Исправьте это перед нагрузочным тестом приложения.
Вы тестируете из виртуальной машины? Или откуда-нибудь? Если это виртуальная машина, попробуйте указать 127.0.0.1 вместо этого для тестирования.
ab -n 500 -c 150 http://127.0.0.1:8080/myapp/