Перейти к содержимому
Local
bot

MySQL с MyISAM и патчи от Meltdown

Рекомендованные сообщения

Появилось сообщение, о том что наблюдается потеря производительности в 90% после обновления Linux ядра на сервере, которое теперь содержит KPTI (kernel page-table isolation - защита от Meltdown)

 

Такие большие потери связаны с запуском MariaDB на старой версии VMware, которая не пробрасывает PCID и INVPCID чипа гостю. Но в безвиртуальной системе удалось добиться регресса в 40%.

 

Тестовые условия:
----------------------------------
CREATE TABLE t1 (c1 INT PRIMARY KEY AUTO_INCREMENT, c2 INT) ENGINE=MyISAM;
INSERT INTO t1 (c2) VALUES (FLOOR(1000*RAND()));
INSERT INTO t1 (c2) SELECT FLOOR(1000*RAND()) FROM t1;
-- повторять последнее действия пока не станет хотя бы 1024 строки в t1

SELECT COUNT(*) FROM t1 AS a JOIN t1 AS b WHERE b.c1>a.c1 AND b.c2<a.c1;
----------------------------------

 

Теперь смотрим время SELECT с KPTI и без:
----------------------------------
rows    non-KPTI    KPTI         regression
1024    0.40 s        0.64 s        37.5%
2048    1.24 s        1.94 s        36.1%
4096    4.22 s        7.05 s        40.1%
8192    16.10 s      26.92 s      40.2%
----------------------------------

Для 8K строк запрос делает более чем 50млн вызовов Handler_read_rnd_next. Для MyISAM этот вызов возвращается вызовом fget(), который в свою очередь возвращается системным вызовом __fget.

 

Так происходит из-за того, что у движка MyISAM нет кеша строк. В Key Buffer кешируется индекс страниц, а кеша данных строк нету.
Поэтому движок полагается на кеш операционной системы. Это хорошо работает, но, т.к. кеш находится в ядре, то получается, что между MariaDB и и кешем есть системный вызов (syscall).

 

Изоляция табличных страниц, представленная в KPTI, увеличила нагрузку при системном вызове (syscall). Поэтому вышеуказанная схема, где большое количество MyISAM строк перебираются циклом, работает очень медленно. И замедление только увеличивается, если строка уже находится в кеше.

 

Как это побороть? - Никак, т.к. это потребует полного редизайна MyISAM.

 

Хорошая новость заключается в том, что большинство других движков имеют свой кеш строк. У InnoDB это InnoDB Buffer Pool, а у ARIA - ARIA Page Cache.

 

Вот пример выполнения нашего теста для ARIA со стандартным кешем в 128мегабайт:
----------------------------------
rows    non-KPTI         KPTI
1024    0.18 s             0.18 s
2048    0.57 s             0.57 s
4096    1.85 s             1.84 s
8192    6.34 s             6.30 s
----------------------------------

 

Мораль сей басни такова: переезжайте на другой движок и убедитесь, что кеш строк достаточно велик.

 

Источник: mariadb

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Создайте аккаунт или войдите в него для комментирования

Вы должны быть пользователем, чтобы оставить комментарий

Создать аккаунт

Зарегистрируйтесь для получения аккаунта. Это просто!

Зарегистрировать аккаунт

Войти

Уже зарегистрированы? Войдите здесь.

Войти сейчас


  • Сейчас на странице   0 пользователей

    Нет пользователей, просматривающих эту страницу.

  • Похожие публикации

    • Автор: bot
      Выпущены исправления уязвимостей Meltdown и Spectre для FreeBSD и QEMU. В исправлениях используется новая инструкция IBRS, представленная компанией Intel в обновлении микрокода.

      Разработчики открытой операционной системы FreeBSD выпустили набор исправлений для уязвимостей Meltdown и Spectre. Патчи интегрированы в ветку FreeBSD 11-STABLE.

      Исправления для Meltdown основаны на технике Page Table Isolation (PTI), позволяющей разделять таблицы страниц памяти ядра и пространства пользователя при переключении контекста во время системного вызова. Помимо этого, в исправлениях предусмотрена оптимизация при помощи инструкции PCID, снижающая негативное влияние PTI на производительность компьютера.

      Исправление для второго варианта Spectre использует новую инструкцию Indirect Branch Restricted Speculation (IBRS), представленную компанией Intel в обновлении микрокода. IBRS позволяет в зависимости от ситуации разрешать и запрещать спекулятивное выполнение косвенных переходов. Например, переходы будут запрещены во время обработки прерываний, системных вызовов и переключений контекста. Для применения данной инструкции обязательно наличие обновленного микрокода для процессоров Intel.

      После установки исправлений отключить PTI будет невозможно, однако IRBIS может быть отключен через команду sysctl.

      Помимо этого, защита от Meltdown и Spectre также была реализована в программе для эмуляции аппаратного обеспечения QEMU 2.11.1. Исправления для Meltdown основаны на патчах KPTI, а защита от Spectre разработана с привлечением инструкций IBRS и Indirect Branch Prediction Barriers (IBPB).
       
      Источник: securitylab
    • Автор: mac
      Естественно, ip сети и города - разные, версии Ubilling - одинаковые.
      Собственно, как это сделать максимально просто и безопасно?
       
      То, до чего сам додумался - это использовать "Модуль Миграция 2"
      Для это планирую сделать экспорт нужных полей из базы данных с помощью запроса


      По sql запросу вопрос прежде всего к уважаемому nightfly : оттуда ли (таблицы, поля) я беру значения?
    • Автор: strushke
      Всем пламенный привет! Соскучились? 
      Вот вам новый вселенский вопрос каким образом из модуля делать INSERT запрос?
       
      При помощи simple_queryall плюётся вот таким сообщением:
      Warning: mysql_fetch_assoc() expects parameter 1 to be resource, boolean given in /usr/local/www/apache24/data/billing/api/libs/api.mysql.php on line 235
       
      При этом, данные добавляет.
       
      Кусок:
      $addExpenseQuery = "INSERT INTO expenses (date,summ,comment) VALUES (CURRENT_DATE(),'$addExpAmount','$addExpComment')"; $query_result = simple_queryall($addExpenseQuery);  
    • Автор: Common
      Ничего не меняется в базе.
      Вестимо, неверный пароль я от неё сунул, есть варианты как починить?
       
      Ошибка 
      Подозрительная ошибка - вообще странно, что вы ее видите:EMPTY_DATABASE_USERDATA UserProfile Object( [alterCfg:protected] => Array ( [NMLEASES] => /var/log/messages [NMLEASEMARK] => [NMREP_INMACCHG] => 1 [SIMPLENEWMACSELECTOR] => 1 [PROFILE_PLUGINS] => 1 [CITY_DISPLAY] => 0 [ZERO_TOLERANCE] => 1 [DOCSIS_SUPPORT] => 0 [DOCSIS_MODEM_NETID] => 22 [docsis_cm_source] => multinet/cm_source/
    • Автор: livalera
      помогите пожалуйста не грузится  mysql
      пишет ошибку
       
      подскажите пожалуйста что делать 
       



×