Бутылка JMeter и Python - не закрывающие сокеты

У нас есть 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.

Комбинация очень большого тайм-аута (вкладка JMeter HTTP Request Advanced) и «KeepAlive», похоже, сработала, хотя сейчас я скептически отношусь к тому же значению теста производительности при повторном использовании соединений. Пропускная способность (на ноутбуке) составляет 1000 с в секунду.

Jeremy Gooch 03.05.2018 18:37

Вы работаете в системе Windows? Если да, то это ваше решение - support.microsoft.com/en-us/help/196271/…

Kavindu Dodanduwa 08.05.2018 13:29
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
1
2
251
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Я столкнулся с подобным при запуске стресс-тестов JMeter на машине с Windows. Это должно произойти из-за ограничений порта, установленных Windows по умолчанию. Согласно их документации, существует 5000 портов по умолчанию. Вы можете попробовать увеличить это значение с помощью этого гид

Большое спасибо. Я установил для MaxUserPorts значение 65534, как было предложено, и это определенно улучшило производительность. Однако я все еще получаю много ошибок "адрес используется". Пока настраиваю тест на своем ноутбуке (Windows 7). Когда мы сделаем это по-настоящему, это будет Windows 2012 R2.

Jeremy Gooch 09.05.2018 17:55

Извините, я также хотел добавить, что я также изменил TcpTimedWaitDelay на 30. Тест длится дольше, прежде чем начнут появляться ошибки, и в целом их меньше (но все равно 9% за пятиминутный прогон).

Jeremy Gooch 09.05.2018 18:16

@JeremyGooch не уверен, с какой проблемой вы сейчас столкнулись. Вы уверены, что закрываете связи? Я имею в виду, есть ли шанс, что соединение будет зависнуть из-за тестового примера?

Kavindu Dodanduwa 10.05.2018 05:58

Теперь у меня была возможность проверить это на реальном сервере, который мы собираемся использовать (Windows 2012 R2). У меня не было никаких проблем (мы протестировали службу на скорости 2300 транзакций в секунду), поэтому я предполагаю, что это функция Windows 7. Спасибо за вашу помощь.

Jeremy Gooch 10.05.2018 17:23

Другие вопросы по теме