mariadb: производительность параллельных запросов - PullRequest
0 голосов
/ 09 мая 2018

нам нужна ваша помощь, чтобы узнать больше о внутренностях из mariadb 10.2 ..

У нас есть один сложный запрос. Если мы выполним этот запрос один, ему потребуется 5 секунд. Но если мы выполняем один и тот же запрос параллельно, каждый запрос выполняется дольше.

Запрос содержит случайное целое число в части where, поэтому мы не используем кэширование запросов. Наш сервер имеет в наличии 4 процессора.

Наши наблюдения:

(1) выполнить 1 запрос => ~ 5 секунд

(2) выполнить один и тот же запрос 4 раза (параллельно) => каждый запрос выполняется ~ 5,5 секунд

(3) выполнить один и тот же запрос 7 раз (параллельно) => каждый запрос выполняется ~ 7 секунд

(4) выполнить один и тот же запрос 10 раз (параллельно) => каждый запрос выполняется ~ 11 секунд

Мы оптимизировали запрос, нам не нужна временная таблица дисков. Мы видим, что все 4 процессора имеют нагрузку около 80-90%.

Но у нас нет идей, почему время исполнения такое разное.

Спасибо, Рене

Ответы [ 2 ]

0 голосов
/ 22 мая 2018

Давайте попробуем ускорить запрос.

Похоже, что запрос выполняет сканирование таблицы или какую-либо другую задачу с интенсивным вводом-выводом. Обратите внимание, что диски (в большинстве систем) являются однопоточными. То есть ваш «параллельно» не распространяется на ввод / вывод.

«Мы оптимизировали запрос, нам не нужна временная таблица дисков». - Это только одна из многих оптимизаций. Давайте посмотрим больше.

Есть ли у вас "составные" индексы?

Вы скрываете проиндексированные столбцы внутри вызовов функций?

Покажите нам запрос вместе с SHOW CREATE TABLE и EXPLAIN SELECT ...

0 голосов
/ 09 мая 2018

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

Любой компьютер имеет ограниченное количество ресурсов. Процессор, ОЗУ, диск. Если вы запустите процесс, который использует много ресурсов, для следующего процесса их станет меньше.

То же самое с параллельными потоками, каждый из которых выполняет запрос. Каждый из них должен использовать некоторый процессор для обработки данных. Если данные находятся на диске, их необходимо загрузить в буферный пул, и это использует некоторую пропускную способность диска.

Кроме того, некоторые внутренние структуры данных требуют глобальных блокировок. Например, если два потока пытаются загрузить страницы в буферный пул, существует глобальная блокировка, которая необходима обоим потокам, чтобы они могли найти свободную страницу. Один поток захватывает эту блокировку, выполняет свою работу и снимает блокировку. Второй поток уже ждет. Это происходит много раз в секунду, но чем больше потоков, тем больше разногласий.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...