2017-08-08 153 views
2

我使用MariaDB的(21年1月10日)有以下存储引擎:如何解决MariaDB的高内存使用问题?

  • InnoDB的
  • TokuDB
  • 蜘蛛引擎

系统配置为:

  • 3GB RAM
  • 双核处理器

我试过pt-mysql-summary工具来识别内存使用情况,它显示当服务器上没有进程正在运行时,innodb缓冲池大小的90%被填充。

我也尝试重新启动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' 
+0

它是否会导致您的问题?数据库爱内存和缓冲池是否有充满缓存的数据... –

+0

是的,但有时它由于高使用率而崩溃。 –

+0

当没有任何东西在运行时,它也使用RAM。有什么方法可以识别这个吗? –

回答

1

innodb-buffer-pool-size = 1720M是太大了一个3GB的机器,特别是如果TokuDB和蜘蛛也在使用。

真正的问题是,“有任何交换”?如果没有交换,那么没有问题。如果有交换,那么第一道防线就是降低该设置。我建议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以便更快,但频繁地查询。