Abh*_*hek 6 mysql database mysqladministrator mariadb
我正在使用 MariaDB(10.1.21) 和以下存储引擎:
系统配置是:
我尝试使用pt-mysql-summary工具来识别内存使用情况,当服务器上没有进程运行时,它显示 innodb 缓冲池大小的 90% 已被填充。
我还尝试重新启动 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
Run Code Online (Sandbox Code Playgroud)
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
Run Code Online (Sandbox Code Playgroud)
蜘蛛.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'
Run Code Online (Sandbox Code Playgroud)
innodb-buffer-pool-size = 1720M对于 3GB 机器来说太大了,尤其是在同时使用 TokuDB 和 Spider 的情况下。
真正的问题是,“有没有交换”?如果没有交换的话就没有问题。如果存在交换,那么第一个防御就是降低该设置。我建议500M。交换对于 MySQL 的性能非常不利。
看到90%都是正常的。(Innodb_buffer_pool_bytes_data / innodb_buffer_pool_size)92% 是机器样本的中值。由于buffer_pool是一个缓存,所以大多数时候“满”是正常的。(它很少会超过 98% 满——可能会留下一些空间供快速重用。)如果在运行几个小时后低于 50% 满,我会说innodb_buffer_pool_size对于有问题的数据集来说太大了。
建议降低 tolong_query_time = 2以便捕获更快但频繁的查询。