1

我已经从 mariadb 10.1.36 升级到 10.4.8,我可以看到在那个新版本上神秘地增加了 ram 使用量。我还编辑了 innodb_buffer_pool_size ant 似乎没有效果,如果它设置为 15M 或 4G,ram 只是在慢慢增加。在它吃掉整个 ram 和 oom 杀手杀死 mariadb 之后,这种情况正在重复。

我的服务器有 8GB RAM,并且每天增加 60-150MB。它并不可怕,但我有大约 150 台数据库服务器,所以这是个大问题。

我可以通过重新启动 mariadb 并再次启动来临时解决问题。

有关数据库服务器的信息:数据库:200+ 表:28200(每个数据库 141 个)平均活动连接数:100-200 存储数据大小:100-350GB

中央处理器:4 内存:8GB

有我的配置:

server-id=101
datadir=/opt/mysql/
socket=/var/lib/mysql/mysql.sock
tmpdir=/tmp/
gtid-ignore-duplicates=True
log_bin=mysql-bin
expire_logs_days=4
wait_timeout=360
thread_cache_size=16
sql_mode="ALLOW_INVALID_DATES"
long_query_time=0.8
slow_query_log=1
slow_query_log_file=/opt/log/slow.log
log_output=TABLE
userstat = 1
user=mysql
symbolic-links=0
binlog_format=STATEMENT
default_storage_engine=InnoDB
slave_skip_errors=1062,1396,1690innodb_autoinc_lock_mode=2
innodb_buffer_pool_size=4G
innodb_buffer_pool_instances=5
innodb_log_file_size=1G
innodb_log_buffer_size=196M
innodb_flush_log_at_trx_commit=1
innodb_thread_concurrency=24
innodb_file_per_table
innodb_write_io_threads=24
innodb_read_io_threads=24
innodb_adaptive_flushing=1
innodb_purge_threads=5
innodb_adaptive_hash_index=64
innodb_flush_neighbors=0
innodb_flush_method=O_DIRECT
innodb_io_capacity=10000
innodb_io_capacity_max=16000
innodb_lru_scan_depth=1024
innodb_sort_buffer_size=32M
innodb_ft_cache_size=70M
innodb_ft_total_cache_size=1G
innodb_lock_wait_timeout=300
slave_parallel_threads=5
slave_parallel_mode=optimistic
slave_parallel_max_queued=10000000
log_slave_updates=on
performance_schema=on
skip-name-resolve
max_allowed_packet = 512M
query_cache_type=0
query_cache_size = 0
query_cache_limit = 1M
query_cache_min_res_unit=1K
max_connections = 1500
table_open_cache=64K
innodb_open_files=64K
table_definition_cache=64K
open_files_limit=1020000
collation-server = utf8_general_ci
character-set-server = utf8
log-error=/opt/log/error.log
log-error=/opt/log/error.log
pid-file=/var/run/mysqld/mysqld.pid
malloc-lib=/usr/lib64/libjemalloc.so.1
4

5 回答 5

2

我解决了!问题是内存分配库。

如果您执行此 SQL 查询:

显示变量,如 'version_malloc_library';

您必须获得价值“jemalloc”库。如果你只得到“系统”,你可能会遇到问题。

要更改它,您需要编辑此目录中的任何 .conf 文件:

/etc/systemd/system/mariadb.service.d/

在那里,添加这一行:

环境="LD_PRELOAD=/usr/lib/x86_64-linux-gnu/libjemalloc.so.1"

(此库文件可能在其他文件夹中)

然后你必须重新启动mysqld

service mysqld stop && systemctl daemon-reload && service mysqld start

于 2020-03-02T12:02:40.063 回答
1

你在 my.cnf 中增加了值。

许多缓存会增长直到达到极限,因此您会经历内存增长。

价值从何而来SHOW GLOBAL STATUS LIKE 'Max_used_connections';?有一个大的max_connections突出了其他几个值;降低它。

但也许真正糟糕的是表缓存——它有的单位,而不是字节。把这些调低很多:

table_open_cache=64K
innodb_open_files=64K
table_definition_cache=64K
于 2020-03-06T05:41:25.620 回答
0

我也有完全一样的问题。是不是因为配置不好?还是新版本的bug?

当我将 Debian 9 升级到 Debian 10 时,mariadb 10.1 已更新到 10.3。我尝试使用 mariadb 10.4 解决问题,但没有任何改变。

我想降级版本,但我认为有必要转储所有数据库并恢复它,这意味着几个小时没有服务。

我不认为 Debian 10 与这个问题有关

于 2020-02-29T19:05:01.817 回答
0

请阅读我之前关于替代内存分配器的评论......

使用 jemalloc 时: 使用 Jemalloc

当使用默认内存分配器时: 在此处输入图像描述

于 2020-03-02T10:15:40.417 回答
0

尝试使用 tcmalloc

环境="LD_PRELOAD=/usr/lib/x86_64-linux-gnu/libtcmalloc_minimal.so.4.5.3.1"

于 2020-03-04T06:43:57.520 回答