Почему только мой клиент MySQL в Windows 11 работает медленно?MySql

Форум по Mysql
Ответить
Anonymous
 Почему только мой клиент MySQL в Windows 11 работает медленно?

Сообщение Anonymous »

У меня новый компьютер с Windows 11, и я столкнулся с проблемой производительности MySQL, которую не знаю, как исправить.
Сервер MySQL работает на удаленном Linux, и проблема в том, что моя Windows будет выполнять только около 6 запросов в секунду, а затем, очевидно, заснет на полсекунды. Это специфично для трафика MySQL, и я не смог понять, почему это так.

Существует некоторое бизнес-приложение, которое в общей сложности выполняет 4418 последовательных запросов SELECT, когда я нажимаю определенную кнопку. (Это проблема сама по себе, но я ничего не могу с этим поделать.)
При включенном общем ведении журнала я извлек полный список выполненных запросов и поместил их в очень простой скрипт Python, чтобы можно было воспроизвести запросы (используя pymysql) и удалить приложение как источник узкого места.
Запуск этого сценария Python был успешным во всех ситуациях, но результаты по времени вызывают беспокойство:
  • чуть меньше одной секунды, на той же машине, что и mysqld
  • примерно 70 секунд, на моем локальном ноутбуке, доступ к mysqld через две вложенные переадресации портов SSH через Интернет
  • 13 минут и несколько секунд, на рассматриваемой машине Windows, в той же локальной сети, что и mysqld
  • чуть меньше четырех секунд, используя WSL на рассматриваемом компьютере Windows, в той же локальной сети, что и mysqld.
Это должно быть что-то локальное для моей установки Windows.

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, я вижу быстрый обмен сообщениями, при этом одиночный обмен сообщениями туда и обратно занимает около 130 микросекунд и нет никаких перерывов в 0,5 секунды.
Ни на клиент 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}
Общее время выполнения 51,088 секунды, из которых 50,888 секунды было потрачено на _socket.socket.recv_into. Ожидает ли Windows какой-то завершающий символ, который MySQL/Linux не отправляет?

Подробнее здесь: https://stackoverflow.com/questions/798 ... ws-11-slow
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «MySql»