在2核2G的服务器上运行MySQL Docker镜像,需要调整以下内核参数以优化性能和稳定性:
1. 关键内核参数调整
/etc/sysctl.conf 配置:
# 内存相关
vm.swappiness = 10
vm.dirty_ratio = 60
vm.dirty_background_ratio = 5
# 网络相关(连接数优化)
net.core.somaxconn = 65535
net.ipv4.tcp_max_syn_backlog = 65535
net.core.netdev_max_backlog = 65535
# 文件描述符和inode
fs.file-max = 65535
fs.nr_open = 65535
# 内存过载保护
vm.overcommit_memory = 1
vm.overcommit_ratio = 95
# TCP连接优化
net.ipv4.tcp_fin_timeout = 30
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_tw_recycle = 0 # CentOS 7+和Ubuntu禁用此项
net.ipv4.tcp_keepalive_time = 1200
# 内存映射区域
vm.max_map_count = 262144 # 对InnoDB缓冲池重要
应用配置:
# 立即生效
sudo sysctl -p
# 对于CentOS 7/8
sudo systemctl restart systemd-sysctl
# 对于Ubuntu 22.04
sudo service procps restart
2. Docker特定配置
创建或修改 /etc/docker/daemon.json:
{
"default-ulimits": {
"nofile": {
"Name": "nofile",
"Hard": 65535,
"Soft": 65535
},
"nproc": {
"Name": "nproc",
"Hard": 65535,
"Soft": 65535
}
},
"storage-driver": "overlay2"
}
重启Docker服务:
sudo systemctl restart docker
3. MySQL容器启动参数
docker run -d
--name mysql
--restart unless-stopped
--memory="1.5g" # 限制容器内存使用
--memory-swap="2g" # 限制swap使用
--cpus="1.5" # 限制CPU使用
--ulimit nofile=65535:65535
--ulimit nproc=65535:65535
-e MYSQL_ROOT_PASSWORD=your_password
-p 3306:3306
mysql:8.0
--innodb_buffer_pool_size=512M
--max_connections=200
--table_open_cache=2000
--innodb_log_file_size=128M
4. 针对2G内存的MySQL配置优化
在MySQL配置文件或启动参数中添加:
# my.cnf 或 docker环境变量
[mysqld]
innodb_buffer_pool_size = 512M
innodb_log_file_size = 128M
innodb_flush_log_at_trx_commit = 2
innodb_flush_method = O_DIRECT
max_connections = 200
thread_cache_size = 50
table_open_cache = 2000
query_cache_type = 0
query_cache_size = 0
tmp_table_size = 64M
max_heap_table_size = 64M
5. 系统限制检查
# 检查当前限制
ulimit -a
# 修改用户限制(CentOS/Ubuntu)
echo "* soft nofile 65535" >> /etc/security/limits.conf
echo "* hard nofile 65535" >> /etc/security/limits.conf
echo "* soft nproc 65535" >> /etc/security/limits.conf
echo "* hard nproc 65535" >> /etc/security/limits.conf
# 对于systemd系统(Ubuntu 22.04/CentOS 7+)
sudo mkdir -p /etc/systemd/system/docker.service.d/
sudo tee /etc/systemd/system/docker.service.d/limits.conf << EOF
[Service]
LimitNOFILE=infinity
LimitNPROC=infinity
LimitMEMLOCK=infinity
EOF
6. 验证配置
# 检查内核参数
sysctl vm.swappiness vm.max_map_count net.core.somaxconn
# 检查容器限制
docker inspect mysql | grep -i "ulimit|memory|cpu"
# 检查MySQL运行状态
docker exec mysql mysqladmin status -p
注意事项:
- 内存分配:2G服务器上,建议MySQL容器使用1-1.5G内存,为系统和Docker守护进程预留资源
- swap设置:适当启用swap(1-2G)但降低swappiness
- 监控调整:使用
docker stats监控资源使用情况,根据实际负载调整参数 - 数据持久化:确保使用volume挂载数据目录
- 备份策略:小内存服务器更需要注意备份和监控
这些调整能确保MySQL在资源有限的服务器上稳定运行,同时避免因内核参数限制导致的性能问题。
CLOUD技术笔记