Mysql

如何解決 MariaDB 的高記憶體使用問題?

  • February 3, 2022

我正在使用 MariaDB(10.1.21) 和以下儲存引擎:

  • InnoDB
  • TokuDB
  • 蜘蛛引擎

系統配置為:

  • 3GB 記憶體
  • 雙核處理器

我已經嘗試pt-mysql-summary使用工具來辨識記憶體使用情況,當伺服器上沒有執行任何程序時,它顯示 90% 的 innodb 緩衝池大小已填滿。

我還嘗試重新啟動 MariaDB 伺服器,這只會減少大約 1-2 小時的記憶體,然後它會耗盡記憶體。

任何線索為什麼它消耗太多記憶體?

在下面分享我的配置:

我的.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

蜘蛛網

[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'

您的緩衝池設置為 1720M,TokuDB 預設使用伺服器記憶體的一半。1.7G + 1.5G = 3.2G,已經超過物理記憶體總量了。

將這兩個值都設置為較低的值,並為作業系統留出至少 1G 的可用空間。例如:

innodb_buffer_pool_size = 1G
tokudb_cache_size = 1G

此外,您看到緩衝池填充高達 90% 的原因是某些查詢可能會在​​某個時候執行,即使使用 mysqldump 進行備份也可以做到這一點。一旦緩衝池滿了,即使沒有伺服器活動也不會清空。

這不是關鍵所以不用擔心這是 Innodb 引擎的正常行為。

如果您的數據大小大於或等於緩衝池大小,Innodb 將在預熱時填滿所有緩衝區大小。因此,當您在幾個小時後啟動 MySQL 時,緩衝池將滿(僅 Buffer pull 並非所有 Ram 的容量)

您正在系統中使用多重引擎。它會使配置複雜化,因為您必須控制每個引擎的重要變數(例如記憶體配置)。

你有理由使用 TokuDB 嗎?我認為最好使用其中一種引擎(InnoDB 或 TokuDB)

因此,如果您更喜歡使用 innodb,您可以將緩衝池大小設置為 RAM 的 70% 左右,除非您的數據/索引大小很小

引用自:https://dba.stackexchange.com/questions/183034