服务器资源不足时维持网站可用性及避免MariaDB被OOM Killer终止的方案咨询
服务器资源不足时维持网站可用性及避免MariaDB被OOM Killer终止的方案咨询
兄弟,我太懂你作为新手遇到这种OOM Killer杀服务、网站直接挂掉的崩溃感了!咱们一步步来解决这个问题,先搞定“不让MariaDB轻易被杀”,再安排“就算被杀了也能快速恢复网站”,最后聊聊长期治本的优化方向。
一、给MariaDB加个“免杀护盾”——避免被OOM Killer优先盯上
OOM Killer是Linux内存耗尽时的最后手段,它会根据进程的“优先级分数”选目标,咱们从两个方向调整:
1. 降低MariaDB的OOM被杀优先级
Linux每个进程都有oom_score_adj值,范围-1000到1000,值越低越不容易被杀。咱们给MariaDB设个较低的值:
- 临时生效:先找MariaDB进程ID,执行
echo -100 > /proc/$(pidof mariadbd)/oom_score_adj(如果进程名是mysqld就替换) - 永久生效:新建
/etc/systemd/system/mariadb.service.d/override.conf文件,写入:
再执行[Service] OOMScoreAdjust=-100systemctl daemon-reload && systemctl restart mariadb。
注意:别设成-1000(完全免疫OOM),万一系统真的内存耗尽,会杀不掉MariaDB导致整个系统崩溃,-100足够让它成为OOM Killer最后考虑的对象。
2. 给MariaDB“限内存”——从根源减少内存占用
这就是你要的“限制资源”方法,MariaDB默认配置可能把内存占满,手动调整my.cnf(通常在/etc/my.cnf或/etc/mysql/my.cnf):
[mysqld] # InnoDB缓冲池是最占内存的部分,2G内存设512M,4G内存设1G即可 innodb_buffer_pool_size = 512M # MyISAM索引缓存,不用MyISAM可以设更小 key_buffer_size = 64M # 每个连接的排序/连接缓存,别设太大,否则连接多了内存直接爆 sort_buffer_size = 2M join_buffer_size = 2M # 限制最大连接数,避免并发连接占满内存 max_connections = 50
改完重启MariaDB,用mysql -e "show variables like '%buffer%';"查看参数是否生效,也可以用htop实时监控内存变化。
二、就算MariaDB被杀了,也要让网站快速恢复
就算没拦住OOM Killer,咱们也能让服务自动拉起,减少网站 downtime:
1. 让Systemd自动重启MariaDB
编辑刚才的override.conf,再加两行:
[Service] Restart=always RestartSec=5
这样MariaDB不管是崩溃还是被OOM杀掉,Systemd都会在5秒内自动重启,大部分用户甚至察觉不到服务断过。
2. 网站层加“降级缓冲”
如果MariaDB重启需要几秒,网站可以返回缓存内容或友好提示,比如用Nginx配置:
location / { proxy_pass http://your_backend_server; # 后端报错时尝试使用缓存 proxy_next_upstream error timeout invalid_header http_500 http_502 http_503 http_504; proxy_cache my_cache; proxy_cache_key "$host$request_uri"; proxy_cache_valid 200 302 10m; # 后端完全挂了就返回备用页面 error_page 500 502 503 504 /fallback.html; } location = /fallback.html { root /usr/share/nginx/html; internal; }
你可以自己写个fallback.html,比如“服务正在维护,稍后回来”,用户体验会好很多。
三、长期治本:从根源降低资源消耗
虽然你说之前搜的都是优化,但还是得提——限制资源只是“治标”,优化服务才是“治本”,不然内存压力还是会越来越大:
- 开慢查询日志抓耗资源的SQL:在
my.cnf里加:
然后用slow_query_log = 1 slow_query_log_file = /var/log/mysql/slow.log long_query_time = 2mysqldumpslow /var/log/mysql/slow.log分析慢查询,给对应表加索引、优化SQL语句,减少CPU和内存消耗。 - 定期优化数据库表:对经常读写的表执行
OPTIMIZE TABLE your_table;(MyISAM),或者转成InnoDB引擎(内存管理更高效)。 - 装个监控工具:用
htop实时看资源,或者用monit做简单告警,当内存使用率超过80%时提醒你,提前处理避免OOM。
备注:内容来源于stack exchange,提问作者Pablo
相关产品推荐
相关产品推荐

