Mysql
如何解決 MariaDB 的高記憶體使用問題?
我正在使用 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% 左右,除非您的數據/索引大小很小