Назад | Перейти на главную страницу

БД MySQL вызывает высокий уровень ввода-вывода на запущенном Zabbix сервере

Мой хост VPS жалуется, что я использую самый высокий IO на хосте. Я запускаю сервер мониторинга Zabbix с базой данных MySQL innodb. VPS имеет оперативную память 512 МБ. Я не понимаю, почему сценарий mysqltuner.pl рекомендует innodb_buffer_pool_size> 1G, когда у меня всего 512 МБ. Буду очень признателен за любой совет о том, с чего мне начать. Я связался с экспертом по Zabbix, и мне сказали: «Таблицы tmp не должны заканчиваться на диске, а пул буферов innodb в большинстве случаев должен быть максимально большим», но я не уверен, как именно это реализовать с точки зрения чисел.

Вот результат работы скрипта mysqltuner.pl.

-------- General Statistics --------------------------------------------------
[--] Skipped version check for MySQLTuner script
[OK] Currently running supported MySQL version 5.0.77
[OK] Operating on 64-bit architecture

-------- Storage Engine Statistics -------------------------------------------
[--] Status: -Archive +BDB -Federated +InnoDB -ISAM -NDBCluster 
[--] Data in InnoDB tables: 1G (Tables: 144)
[!!] BDB is enabled but isn't being used
[OK] Total fragmented tables: 0

-------- Performance Metrics -------------------------------------------------
[--] Up for: 129d 6h 54m 3s (342M q [30.677 qps], 1M conn, TX: 112B, RX: 46B)
[--] Reads / Writes: 57% / 43%
[--] Total buffers: 34.0M global + 2.7M per thread (100 max threads)
[OK] Maximum possible memory usage: 309.0M (62% of installed RAM)
[OK] Slow queries: 0% (134/342M)
[OK] Highest usage of available connections: 33% (33/100)
[OK] Key buffer size / total MyISAM indexes: 8.0M/67.0K
[OK] Key buffer hit rate: 96.3% (31M cached / 1M reads)
[!!] Query cache is disabled
[OK] Sorts requiring temporary tables: 0% (0 temp sorts / 5M sorts)
[OK] Temporary tables created on disk: 13% (1M on disk / 10M total)
[!!] Thread cache is disabled
[!!] Table cache hit rate: 0% (64 open / 46K opened)
[OK] Open file limit used: 0% (0/1K)
[OK] Table locks acquired immediately: 100% (406M immediate / 406M locks)
[!!] InnoDB data size / buffer pool: 1.8G/8.0M


-------- Recommendations -----------------------------------------------------
General recommendations:
    Add skip-bdb to MySQL configuration to disable BDB
    Enable the slow query log to troubleshoot bad queries
    Set thread_cache_size to 4 as a starting value
    Increase table_cache gradually to avoid file descriptor limits
Variables to adjust:
    query_cache_size (>= 8M)
    thread_cache_size (start at 4)
    table_cache (> 64)
    innodb_buffer_pool_size (>= 1G)

А вот и мой текущий my.cnf

[mysqld]
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
user=mysql
# Default to using old password format for compatibility with mysql 3.x
# clients (those using the mysqlclient10 compatibility package).
old_passwords=1

# Disabling symbolic-links is recommended to prevent assorted security risks;
# to do so, uncomment this line:
# symbolic-links=0

[mysqld_safe]
log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid

Вывод free -m

             total       used       free     shared    buffers     cached
Mem:           492        486          6          0          2         44
-/+ buffers/cache:        439         53
Swap:          255        112        143

Вывод из iostat

avg-cpu:  %user   %nice %system %iowait  %steal   %idle
           0.24    0.03    0.12    0.57    0.01   99.03

Device:            tps   Blk_read/s   Blk_wrtn/s   Blk_read   Blk_wrtn
xvda             24.47        36.26       748.69  405085498 8365183264
xvdb              1.16         9.50         6.87  106190600   76708192
xvdc              0.00         0.00         0.00       5961       1416

innodb_buffer_pool_size > 1G, потому что размер вашего набора данных составляет 1,8 ГБ.

Чтобы уменьшить количество чтений, вам нужно увеличить innodb_buffer_pool_size. Чтобы уменьшить количество операций записи, вам необходимо отредактировать ваши шаблоны zabbix (отключить некоторые ненужные элементы, такие как свободные inodes, увеличить интервалы между проверками).

У вас соотношение чтения / записи 57% / 43%, поэтому включение Query Cache не поможет (это может усугубить ситуацию, потому что запись в таблицы делает кеш недействительным).

Подумайте об увеличении tmp_table_size и max_heap_table_size, чтобы избежать создания таблиц tmp на диске (13% таблиц tmp). Временные таблицы в МБ? это посчитать? Если это счетчик, это слишком высоко.

Уменьшите количество подключений до 50 (ваше максимальное число было 33).

innodb_support_xa = false
innodb_buffer_pool_size = 256M # It depends how many memory is available to MySQL, more is better.
innodb_flush_log_at_trx_commit = 0 # disable writing to logs on every commit and disable fsync on each write
innodb_max_dirty_pages_pct = 90 # avoid flushing dirty pages to disk
innodb_flush_method = O_DIRECT # direct access to disk without OS cache
thread_cache_size = 4
query_cache_size = 0
table_cache = 80? # a little more than number_of_tables_in_zabbix_database

Полезный ссылка на сайт об оптимизации InnoDB.

Пул буферов InnoDB ДЕЙСТВИТЕЛЬНО слишком мал (попробуйте по крайней мере 64 или 128 МБ). Подумайте, чтобы включить Thread Cache, Query Cache и увеличить table_cache, это может очень помочь.