在 Linux 系统中,当内存不足时,OOM Killer(Out-Of-Memory Killer)会终止占用内存较多的进程,以释放内存。MySQL 等数据库进程通常占用大量内存,因此容易被 OOM Killer 选中。为了避免 MySQL 进程被 OOM Killer 杀死,可以采取以下措施:
1. 优化 MySQL 内存配置合理配置 MySQL 的内存参数,避免过度占用系统内存。
关键参数innodb_buffer_pool_size:InnoDB 缓冲池大小,建议设置为物理内存的 50%-70%。key_buffer_size:MyISAM 索引缓存大小,如果使用 InnoDB 引擎,可以设置为较小值。query_cache_size:查询缓存大小,建议根据实际情况调整。tmp_table_size 和 max_heap_table_size:临时表大小,避免设置过大。示例SET GLOBAL innodb_buffer_pool_size = 4G; SET GLOBAL key_buffer_size = 256M; SET GLOBAL query_cache_size = 128M; SET GLOBAL tmp_table_size = 64M; SET GLOBAL max_heap_table_size = 64M;2. 限制 MySQL 的内存使用
通过 Linux 的 cgroups 或 ulimit 限制 MySQL 进程的内存使用。
使用 cgroups创建 cgroup:sudo cgcreate -g memory:/mysql_group设置内存限制:
echo 8G | sudo tee /sys/fs/cgroup/memory/mysql_group/memory.limit_in_bytes将 MySQL 进程添加到 cgroup:
echo <mysql_pid> | sudo tee /sys/fs/cgroup/memory/mysql_group/tasks使用 ulimit
在启动 MySQL 前,设置内存限制:
ulimit -m 8388608 # 限制内存为 8GB3. 调整 OOM Killer 行为
通过调整 OOM Killer 的评分机制,降低 MySQL 进程被选中的概率。
修改 OOM 评分查看 MySQL 进程的 OOM 评分:cat /proc/<mysql_pid>/oom_score手动调整 OOM 评分:
echo -1000 | sudo tee /proc/<mysql_pid>/oom_score_adj永久生效
在 MySQL 启动脚本中添加以下命令:
echo -1000 > /proc/self/oom_score_adj4. 增加系统内存
如果 MySQL 需要大量内存,可以考虑增加物理内存或使用 Swap 空间。
增加 Swap 空间创建 Swap 文件:sudo fallocate -l 4G /swapfile设置权限:
sudo chmod 600 /swapfile启用 Swap:
sudo mkswap /swapfile sudo swapon /swapfile永久生效:在 /etc/fstab 中添加:
/swapfile none swap sw 0 05. 监控内存使用
实时监控系统内存使用情况,及时发现内存不足问题。
使用 free 命令free -h使用 top 或 htop
top htop使用监控工具Prometheus + Grafana:实时监控系统内存和 MySQL 内存使用。Zabbix:提供告警和监控功能。6. 优化系统内核参数
调整 Linux 内核参数,减少 OOM Killer 触发的概率。
修改 vm.overcommit_memory查看当前值:sysctl vm.overcommit_memory修改为 1(允许超额分配内存):
sudo sysctl vm.overcommit_memory=1永久生效:在 /etc/sysctl.conf 中添加:
vm.overcommit_memory = 1修改 vm.swappiness查看当前值:
sysctl vm.swappiness修改为较低值(如 10),减少 Swap 使用:
sudo sysctl vm.swappiness=10永久生效:在 /etc/sysctl.conf 中添加:
vm.swappiness = 107. 使用容器化技术
如果 MySQL 运行在容器中,可以通过 Docker 或 Kubernetes 限制内存使用。
Docker 内存限制docker run -d --name mysql --memory="8g" mysql:latestKubernetes 内存限制
在 Pod 配置中添加资源限制:
resources: limits: memory: "8Gi" requests: memory: "4Gi"总结
为了避免 MySQL 等进程因内存不足被 OOM Killer 杀死,可以采取以下措施:
优化 MySQL 内存配置,避免过度占用内存。使用 cgroups 或 ulimit 限制 MySQL 内存使用。调整 OOM Killer 行为,降低 MySQL 被选中的概率。增加系统内存或 Swap 空间。监控内存使用,及时发现内存不足问题。优化系统内核参数,减少 OOM Killer 触发概率。在容器化环境中,使用内存限制功能。通过以上方法,可以有效避免 MySQL 进程因内存不足被 OOM Killer 杀死。
网友回复
python如何实现torrent的服务端进行文件分发p2p下载?
如何在浏览器中录制摄像头和麦克风数据为mp4视频保存下载本地?
go如何编写一个类似docker的linux的虚拟容器?
python如何写一个bittorrent的种子下载客户端?
ai能通过看一个网页的交互过程视频自主模仿复制网页编写代码吗?
ai先写功能代码通过chrome mcp来进行测试功能最后ai美化页面这个流程能行吗?
vue在手机端上下拖拽元素的时候如何禁止父元素及body的滚动导致无法拖拽完成?
使用tailwindcss如何去掉响应式自适应?
有没有直接在浏览器中运行的离线linux系统?
nginx如何保留post或get数据进行url重定向?