4

我正在使用 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'
4

1 回答 1

4

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对于有问题的数据集来说太大了。

建议降低到long_query_time = 2以捕获更快但更频繁的查询。

于 2017-08-16T16:55:22.433 回答