Трохи теорії. В операційних системах UNIX існує розділ файлової системи, який фізично перебуває в оперативній пам'яті, але дозволяє працювати з ним як зі звичайним дисковим накопичувачем. Швидкість доступу до блоку жорсткого диска приблизно дорівнює 1 мс. Швидкість доступу до пам'яті - 0.001 мс. Спробуємо застосувати це до БД MySQL, щоб вичавити максимум з операцій insert / update.
Спершу перевіримо швидкість випадкового запису на жорсткий диск:
Тепер те ж саме для shared memory (/ run / shm або / dev / shm):
Порівняємо результати і побачимо, що час створення 1000 файлів зменшилася в 574 рази. Добре. Значить, слід очікувати приріст швидкості запису в БД.
1) Перевіряємо розмір і вільне місце для / run / shm
2) Перевіряємо скільки місця займає БД
Значить, що базу ми можемо перенести в / run / shm
3) Зупиняємо MySQL:
4) Створюємо директорії і копіюємо дані:
5) Правимо конфиг:
6) Правимо AppArmor:
7) Запускаємо MySQL
* Якщо сервіс не стартує - дивимося /var/log/mysql/error.log
Тепер найцікавіше. Перевіряємо, що вийшло.
Тест на жорсткому диску я провів заздалегідь, тому відразу привожу результати.
Update виконувався за випадковим інтервалу [1 000 000 - 9 000 000] для первинного ключа (id). Крайні значення відкинуті, щоб движок «копався» всередині таблиці.
Істотний приріст швидкості на INSERT і ще більший на UPDATE.
Менше для вставки, тому що MySQL виробляє перерахунок індексів і організацію даних.
В налаштуваннях MySQL виставлено:
innodb_buffer_pool_size = 1024M
Якщо ставити менше, то швидкість UPDATE для HDD природно падає.
innodb_flush_log_at_trx_commit = 2
Як таких транзакцій тут у нас немає і на швидкість це не впливає. Проте, залишаємо це значення рівним 2.
При такій схемі критично важливо писати бінарний лог і регулярно робити бекап. Максимально знизити витрати записи ми можемо тільки вказавши для бінарники окремий жорсткий диск. Послідовна швидкість запису на вінчестер набагато вище випадковою. Тому ставимо в систему додатковий жорсткий диск, монтуємо його, наприклад, в / mnt / hddbin /, і вказуємо в my.ini шлях для бінарного логу: log_bin = /mnt/hddbin/mysql-bin.log
Не забуваємо додати скрипти для перезавантаження та зупинки системи. Дивимося папку / etc / rc *. Зазвичай це 0 (відключення системи) і 6 (перезавантаження). Мануал, як додати скрипти легко знайти в гуглі. Скрипт перед перезавантаженням або вимиканням системи зупиняє MySQL, потім копіює папку / run / shm / mysql-lib на жорсткий диск. При включенні системи скрипт відновлює дані з жорсткого диска в папку / run / shm / mysql-lib і після запускає MySQL.
Так само додаємо простенький bash або perl скрипт для моніторингу вільної пам'яті в / run / shm. Можна підключити Zabbix.