背景
写作练习标注工具挂在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 | [mysqld] |
其中
performance_schema = off关闭数据库性能监控。
performance_schema_max_table_instances=400限制监控的最大表数。
table_definition_cache=400限制缓存的表定义的数量。
table_open_cache=256限制缓存的打开表时候的最大文件描述符数。
结果
通过一段时间的观察,MySQL容器一直正常运行,调整有效。
1 | docker stats mysql8 |