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

Распределенное тестирование Jmeter через туннель ssh

При настройке распределенного тестирования jmeter я столкнулся с проблемой удаленного подключения к серверам, находящимся за NAT. Узел с клиентом jmeter имеет внешний IP-адрес, все серверы находятся в разных локальных сетях за NAT, без возможности прямого перенаправления портов.

Решил попробовать туннели SSH.

На сервере:

> jmeter-server -Djava.rmi.server.hostname=127.0.0.1
> ssh -N -f -R  55500:127.0.0.1:55500 -R 55501:127.0.0.1:55501 -L 60000:127.0.0.1:60000 jmuser@client_node_ip -p 5000

На клиенте:

> jmeter -n -t testcase.jmx -l testcase.jtl -Djava.rmi.server.hostname=127.0.0.1 -r

Тест считается успешным в случае небольшого количества одновременных VU (10-100). Но когда я указываю больше VU, SSH-туннель выдает следующие ошибки:

accept: Too many open files
open failed: administratively prohibited: open failed
Write Failed: broken pipe

Я вижу много подключений через порт 60000. Значение ulimit довольно высокое = 1000000 на серверных и клиентских узлах.

Есть ли обходной путь?

Я бы проверил три вещи:

  • отслеживать количество открытых файлов, которые приложение имеет во время тестирования. Есть разные способы сделать это, но я просто считаю записи в /fd подкаталог для процесса в /proc дерево каталогов. Если ваше приложение не закрывает должным образом дескрипторы файлов, когда это делается, это может произойти.
  • Проверить ulimit для открытых файлов значение этого лимита чрезвычайно велико. Обычно значение по умолчанию составляет около 1024, а 65536 - очень высокое значение.
  • Следите за количеством установленных подключений на порту 60000. Они будут учитываться при учете лимита открытых файлов.

Если происходит сбой туннеля, это может быть ssh-сервер или ssh-клиент. Исправить ограничение на количество открытых файлов ssh-сервера, вероятно, будет сложнее, чем установить ограничение на количество открытых файлов ssh-клиентов.

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