CrazyAirhead

疯狂的傻瓜,傻瓜也疯狂——傻方能执著,疯狂才专注!

0%

如何调整MySQL容器运行内存

背景

写作练习标注工具挂在1核2G的阿里小主机上,除了速度慢点一直还算运行稳定。但最近有使用者反馈不能访问,于是登录服务器,发现MySQL的容器的没有运行,而且启动一段时间后MySQL的容器又会停止。

通过简单分析,是资源不足引起的,于是调整了下MySQL和Docker的配置。

调整

调整参数之前对数据库做一次备份,即使搞崩了还能重来。

调整Docker配置

旧配置

1
docker run --name mysql8 -p 3307:3306 -v /data/mysql/data:/var/lib/mysql -v /data/mysql/conf.d:/etc/mysql/conf.d -e MYSQL_ROOT_PASSWORD=password -d mysql:8.0.20 

新配置

1
docker run -m 512m --memory-reservation 450M --oom-kill-disable --name mysql8 --restart=always -p 3307:3306 -v /data/mysql/data:/var/lib/mysql -v /data/mysql/conf.d:/etc/mysql/conf.d -e MYSQL_ROOT_PASSWORD=password -d mysql:8.0.20 

这里主要的调整是-m 512m --memory-reservation 450M --oom-kill-disable --name mysql8 --restart=always

其中

-m 512m限制容器的最大内存。

--memory-reservation 450M设置预留内存。

--oom-kill-disable阻止OOM killer杀死容器。

--restart=always docker重启时自动启动容器。

调整MySQL配置

因为已经把MySQL的配置挂载成卷,在data/mysql/conf.d目录下的*.cnf文件都会变当成MySQL的自定义配置文件被加载进去,于是创建my.cnf文件,内容如下:

1
2
3
4
5
6
7
[mysqld]
performance_schema = off
performance_schema_max_table_instances=400
table_definition_cache=400
table_open_cache=256
skip-host-cache
skip-name-resolve

其中

performance_schema = off关闭数据库性能监控。

performance_schema_max_table_instances=400限制监控的最大表数。

table_definition_cache=400限制缓存的表定义的数量。

table_open_cache=256限制缓存的打开表时候的最大文件描述符数。

结果

通过一段时间的观察,MySQL容器一直正常运行,调整有效。

1
2
3
4
5
6
7
8
docker stats mysql8

CONTAINER ID NAME CPU % MEM USAGE / LIMIT MEM %
ed4203b90339 mysql8 0.37% 220.4MiB / 512MiB 43.05%

top
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
7325 polkitd 20 0 1055768 244560 21952 S 0.3 13.6 38:38.25 mysqld

欢迎关注我的其它发布渠道