Сервер MySQL работает на удаленном Linux, и проблема в том, что моя Windows будет выполнять только около 6 запросов в секунду, а затем, очевидно, заснет на полсекунды. Это специфично для трафика MySQL, и я не смог понять, почему это так.
Существует некоторое бизнес-приложение, которое в общей сложности выполняет 4418 последовательных запросов SELECT, когда я нажимаю определенную кнопку. (Это проблема сама по себе, но я ничего не могу с этим поделать.)
При включенном общем ведении журнала я извлек полный список выполненных запросов и поместил их в очень простой скрипт Python, чтобы можно было воспроизвести запросы (используя pymysql) и удалить приложение как источник узкого места.
Запуск этого сценария Python был успешным во всех ситуациях, но результаты по времени вызывают беспокойство:
- чуть меньше одной секунды, на той же машине, что и mysqld
- примерно 70 секунд, на моем локальном ноутбуке, доступ к mysqld через две вложенные переадресации портов SSH через Интернет
- 13 минут и несколько секунд, на рассматриваемой машине Windows, в той же локальной сети, что и mysqld
- чуть меньше четырех секунд, используя WSL на рассматриваемом компьютере Windows, в той же локальной сети, что и mysqld.
13-минутный запуск ненормально длинный и его необходимо сократить. Только для этого конкретного запуска журнал MySQL содержит временную метку для каждого полученного запроса, и каждую секунду есть перерывы в 0,5 секунды, когда сервер не получает никаких запросов. Такое ощущение, что система каким-то образом дросселирует себя. Эти промежутки в 0,5 секунды существуют для сценария pymysql, а также для бизнес-приложения, использующего драйвер Oracle MySQL ODBC.
Используя реализации эхо-сервера и клиента из Realpython, я создал клиент, который выполняет бесконечные запросы и печатает некоторую информацию о времени между ними:
Код: Выделить всё
while True:
start = time.perf_counter_ns()
s.sendall(b"Hello, world")
data = s.recv(1024)
stop = time.perf_counter_ns()
print(f'{datetime.now()} {stop-start}')
Ни на клиент Windows, ни на сервер базы данных нет какой-либо заметной нагрузки. Во время теста трафик по TP-wire составляет всего несколько килобайт в секунду.
Это влияет только на соединения MySQL. Я могу перемещать данные с/на компьютер с Windows практически на линейной скорости и особенно использовать полную скорость подключения к Интернету (в обоих направлениях).
Я обновил все драйверы и встроенное ПО, проверил настройки сетевого адаптера на наличие настроенных ограничений, отключил ipv6, отключил регулирование сети, отключил Защитник Windows (, запустил скрипт Python). в качестве администратора), отключил защиту от несанкционированного доступа и проверку сети в реальном времени, вручную просмотрел списки запущенных служб и процессов и уничтожил все, что система позволяла мне убить/отключить. Проблема остается. Даже время сна составляет 0,5 секунды.
Я даже не знаю, на что обращать внимание. Как это исправить?
Обновление 1, больше результатов
Используя pymysql.Connection Я создал гораздо более простые тесты. Последовательное выполнение 100 pymysql.Connection.ping не вызывает каких-либо проблем с производительностью при запуске в Windows, но уже выполнение того же SELECT * FROM занимает около 0,5 секунды на запрос в чистой Windows, но только 1 миллисекунду в WSL на том же компьютере.
Что-то в соединении MySQL происходит очень медленно, как только клиент Windows взаимодействует с сервером Linux.
Обновление 2, профилирование
Используя тест, который отправляет один и тот же запрос 100 раз через одно и то же соединение, cProfile дает следующий результат:
Код: Выделить всё
458711 function calls in 51.088 seconds
Код: Выделить всё
100 50.888 0.509 50.888 0.509 {method 'recv_into' of '_socket.socket' objects}
Подробнее здесь: https://stackoverflow.com/questions/798 ... ws-11-slow
Мобильная версия