Как исправить высокое использование памяти 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/

Другие вопросы по тегам