У нас есть API, написанный на Python и использующий Bottle и Cherrypy, который нам нужен для стресс-тестирования. Для этого мы создали сценарий JMeter, но через пару минут выполнения вызовы начинают завершаться ошибкой со следующим исключением: -
java.net.BindException: Address already in use: connect
at java.net.DualStackPlainSocketImpl.connect0(Native Method)
at java.net.DualStackPlainSocketImpl.socketConnect(Unknown Source)
at java.net.AbstractPlainSocketImpl.doConnect(Unknown Source)
at java.net.AbstractPlainSocketImpl.connectToAddress(Unknown Source)
at java.net.AbstractPlainSocketImpl.connect(Unknown Source)
at java.net.PlainSocketImpl.connect(Unknown Source)
at java.net.SocksSocketImpl.connect(Unknown Source)
at java.net.Socket.connect(Unknown Source)
Кажется, я не могу понять, как сказать JMeter, чтобы он не цеплялся за сокеты, или как сказать Bottle, чтобы он их уронил. Мы пробовали это с такими опциями, как JMeter's KeepAlive, но безуспешно.
Мы вытащили почти все из API, и у этого скрипта все еще есть проблема (без какого-либо нашего функционального багажа).
"""
This script provides a dummy API, which responds to every GET as if it found something.
"""
import bottle
import os
import sys
import datetime
import routes
if __name__ == '__main__':
HOST = 'localhost'
PORT = 5555
@bottle.route('/thing/:id', builtin_function_or_method='GET')
def get_thing(id):
response_json = {
'data': {
'type': 'thing',
'id': id,
'meta': {
'date_retrieved': datetime.datetime.now().isoformat()
}
}
}
bottle.response.headers['Cache-Control'] = 'public,max-age=0'
return response_json
bottle.run(server='cherrypy', host=HOST, port=PORT)
Это Python 3.6.5, Cherrypy 8.9.1 и JMeter 3.3, работающие в Windows.
Вы работаете в системе Windows? Если да, то это ваше решение - support.microsoft.com/en-us/help/196271/…
Я столкнулся с подобным при запуске стресс-тестов JMeter на машине с Windows. Это должно произойти из-за ограничений порта, установленных Windows по умолчанию. Согласно их документации, существует 5000 портов по умолчанию. Вы можете попробовать увеличить это значение с помощью этого гид
Большое спасибо. Я установил для MaxUserPorts значение 65534, как было предложено, и это определенно улучшило производительность. Однако я все еще получаю много ошибок "адрес используется". Пока настраиваю тест на своем ноутбуке (Windows 7). Когда мы сделаем это по-настоящему, это будет Windows 2012 R2.
Извините, я также хотел добавить, что я также изменил TcpTimedWaitDelay на 30. Тест длится дольше, прежде чем начнут появляться ошибки, и в целом их меньше (но все равно 9% за пятиминутный прогон).
@JeremyGooch не уверен, с какой проблемой вы сейчас столкнулись. Вы уверены, что закрываете связи? Я имею в виду, есть ли шанс, что соединение будет зависнуть из-за тестового примера?
Теперь у меня была возможность проверить это на реальном сервере, который мы собираемся использовать (Windows 2012 R2). У меня не было никаких проблем (мы протестировали службу на скорости 2300 транзакций в секунду), поэтому я предполагаю, что это функция Windows 7. Спасибо за вашу помощь.
Комбинация очень большого тайм-аута (вкладка JMeter HTTP Request Advanced) и «KeepAlive», похоже, сработала, хотя сейчас я скептически отношусь к тому же значению теста производительности при повторном использовании соединений. Пропускная способность (на ноутбуке) составляет 1000 с в секунду.