Мой хост 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, это может очень помочь.