Как исправить высокое использование памяти MariaDB?
Я использую MariaDB(10.1.21) со следующими механизмами хранения:
- InnoDB
- TokuDB
- Паук двигатель
Конфигурация системы:
- 3 ГБ ОЗУ
- Двухъядерный процессор
я пытался pt-mysql-summary
инструмент для определения использования памяти и показывает, что 90% размера пула буферов innodb заполнено, когда на сервере не запущен процесс.
Я также попытался перезапустить сервер MariaDB, и это уменьшает объем памяти примерно на 1-2 часа, после чего он расходует память.
Любая подсказка, почему он потребляет слишком много памяти?
Поделиться своими настройками ниже:
my.cnf
[client]
port = 3306
socket = /var/run/mysqld/mysqld.sock
# Here is entries for some specific programs
# The following values assume you have at least 32M ram
# This was formally known as [safe_mysqld]. Both versions are currently parsed.
[mysqld_safe]
socket = /var/run/mysqld/mysqld.sock
nice = 0
[mysqld]
#performance_schema=ON
tmp_table_size=16M
max_heap_table_size=16M
skip-log-bin
#table_open_cache =16384
#table_definition_cache =16384
#
# * Basic Settings
#
user = mysql
pid-file = /var/run/mysqld/mysqld.pid
socket = /var/run/mysqld/mysqld.sock
port = 3306
basedir = /usr
datadir = /var/lib/mysql
tmpdir = /tmp
lc_messages_dir = /usr/share/mysql
lc_messages = en_US
skip-external-locking
#bind-address = 127.0.0.1
#skip-networking
# SAFETY #
max_allowed_packet= 16M
max-connect-errors = 1000000
skip-name-resolve
#sql-mode = STRICT_TRANS_TABLES,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_AUTO_VALUE_ON_ZERO,NO_ENGINE_SUBSTITUTION,NO_ZERO_DATE,NO_ZERO_IN_DATE,ONLY_FULL_GROUP_BY
# CACHES AND LIMITS #
tmp-table-size = 32M
max-heap-table-size = 32M
query-cache-type = 0
query-cache-size = 0
max-connections = 500
thread-cache-size = 50
open-files-limit = 65535
table-definition-cache = 1024
table-open-cache = 2048
# LOGGING #
log_warnings = 2
slow_query_log =1
log-output = TABLE
long_query_time = 5
log_slow_verbosity = query_plan
log-error =/var/log/mysql/system_error.err
# INNODB #
innodb-flush-method = O_DIRECT
innodb-log-files-in-group = 2
innodb-log-file-size = 128M
innodb-flush-log-at-trx-commit = 1
innodb-file-per-table = 1
innodb-buffer-pool-size = 1720M
[mysqldump]
quick
quote-names
max_allowed_packet = 16M
[mysql]
#no-auto-rehash # faster start of mysql but no tab completion
[isamchk]
key_buffer = 16M
TokuDB.cnf
plugin-load-add=ha_tokudb.so
tokudb_data_dir=/var/lib/mysql/toku_db_data
tokudb_read_block_size=64k
tokudb_row_format=tokudb_zlib
tokudb_directio=on
Spider.cnf
[mariadb]
#spider_internal_limit =1
spider_direct_order_limit =1
spider_skip_default_condition =1
spider_casual_read =1
spider_bgs_mode =2
spider_direct_dup_insert =1
spider_auto_increment_mode =2
#optimizer_switch='engine_condition_pushdown=on'
#optimizer_switch='mrr=on,mrr_sort_keys=off'
2 ответа
innodb-buffer-pool-size = 1720M
слишком велик для машины с 3 ГБ, особенно если также используются TokuDB и Spider.
На самом деле вопрос заключается в том, "есть ли обмен"? Если нет обмена, то нет проблем. Если происходит обмен, то первая защита - понизить этот параметр. Я предлагаю 500M. Обмен очень плохо влияет на производительность MySQL.
Это нормально, чтобы увидеть 90%. 92% - это среднее значение для (Innodb_buffer_pool_bytes_data / innodb_buffer_pool_size)
выборка машин. Поскольку buffer_pool является кешем, большую часть времени нормально заполнять. (Он редко заполнен более чем на 98% - возможно, оставляя место для быстрого повторного использования.) Если он ниже, скажем, на 50% после работы в течение нескольких часов, я бы сказал, что innodb_buffer_pool_size
слишком велик для рассматриваемого набора данных.
Предложите понижение до long_query_time = 2
чтобы ловить быстрее, но частые запросы тоже.
Приведенный ниже документ должен помочь вам правильно настроить память, а также научить вас по умолчанию распределять память в соответствии с выбором механизма БД.
https://mariadb.com/kb/en/mariadb/mariadb-memory-allocation/