PmaControl logo PmaControl
  • 首页
  • PmaControl
    • AI智能代理 13个本地代理
    • 定价方案 Community、Cloud、On-Premise、Premium
    • 文档 指南、API、架构
    • 客户 28+企业
    • 常见问题 25个问题 / 7个类别
    数据库
    • MariaDB 30 篇文章
    • MySQL 10 篇文章
    • Galera Cluster 6 篇文章
    • MaxScale 3 篇文章
    • ProxySQL 2 篇文章
    • Amazon Aurora MySQL 0 篇文章
    • Azure Database 0 篇文章
    • ClickHouse 0 篇文章
    • GCP CloudSQL 0 篇文章
    • Percona Server 0 篇文章
    • SingleStore 0 篇文章
    • TiDB 0 篇文章
    • Vitess 0 篇文章
    解决方案
    • 全天候支持 MariaDB & MySQL紧急支持
    • Observabilité SQL 监控、告警、拓扑
    • Haute disponibilité 复制、故障转移、Galera
    • Disaster Recovery 备份、恢复、RPO/RTO
    • Sécurité & conformité 审计、GDPR、SOC2
    • Migration & upgrade 零停机、pt-osc、gh-ost
  • 定价方案
  • 资源
    • 文档 技术指南与API
    • 常见问题 25个常见问题
    • 客户评价 客户反馈与案例
    • 博客 文章与洞察
    • 路线图 即将推出的功能
    专业领域
    • Observabilité SQL 监控、告警、Dot3拓扑
    • Haute disponibilité 复制、故障转移、Galera
    • Sécurité & conformité 审计、GDPR、SOC2、ISO 27001
    • Disaster Recovery 备份、恢复、RPO/RTO
    • Performance & optimisation Digests、EXPLAIN、调优
    • Migration & upgrade 零停机、pt-osc
    快速链接
    • GitHub Wiki 26页 — 安装、引擎、插件
    • 源代码 GitHub官方仓库
    • 全天候支持 MariaDB & MySQL紧急支持
    • 预约演示 30分钟 — 真实架构
  • 全天候支持
  • 预约演示
预约演示
🇫🇷 FR Français 🇬🇧 EN English 🇵🇱 PL Polski 🇷🇺 RU Русский 🇨🇳 ZH 中文
← 返回博客

沉默的 OOM Killer:768MB 会话设置如何淹没 16GB 内存

发布于 2026年4月2日 作者 Aurélien LEQUOY
mariadb oom-killer performance-tuning systemd memory-management
分享 X LinkedIn Facebook Email PDF
沉默的 OOM Killer:768MB 会话设置如何淹没 16GB 内存

执行摘要

MariaDB 停止运行不是因为损坏、Galera 问题或 SQL 缺陷。Linux 内核因为超出内存限制而杀死了 mariadbd 进程。

证据在 systemd 和内核日志中非常明确:

mariadb.service: Failed with result 'oom-kill'
Out of memory: Killed process 1177 (mariadbd) total-vm:22267612kB, anon-rss:16649820kB
Memory cgroup out of memory: Killed process 1146610 (mariadbd)

环境

组件 值
总内存 19.5 GB
交换空间 ~1 GB
systemd MemoryMax 16 GB
innodb_buffer_pool_size 2 GB(自动缩减 → 1 GB)
rocksdb_block_cache_size 4 GB
tmp_table_size(Releem 覆盖) 768 MB
max_heap_table_size(Releem 覆盖) 768 MB
sort_buffer_size 32 MB
max_connections 100

被杀之前发生了什么

MariaDB 检测到内存压力并尝试通过缩减 InnoDB 缓冲池来自我保护:

Memory pressure event shrunk innodb_buffer_pool_size=1536m from 2048m
→ 1280m → 1152m → 1088m → 1056m → 1040m → 1032m → 1024m
Memory pressure event disregarded; innodb_buffer_pool_size=1024m,
  innodb_buffer_pool_size_auto_min=1024m

InnoDB 已经将缓冲池缩减到最小值(1 GB)。但这不够。其他内存消费者不会退让。

最坏情况计算

在 100 个同时连接下,每个会话的最坏情况内存消耗:

100 × (768 MB tmp_table + 768 MB heap + 32 MB sort) = ~153 GB

显然,不是所有会话都会创建 768 MB 的临时表。但仅仅 20 个会话 运行带有 GROUP BY 或 ORDER BY 的大数据集查询就足以突破 16 GB 上限:

InnoDB 缓冲池:      1 GB (已缩减)
RocksDB 缓存:       4 GB (固定,不会缩减)
20 个会话 × 768 MB: 15 GB
总计:               20 GB → 被杀

加重因素:ProxySQL 连接风暴

在 OOM 之前,MariaDB 日志显示来自 10.68.68.103(ProxySQL)的大量中断连接:

Aborted connection ... user: 'unauthenticated' host: '10.68.68.103'
Too many connections

更多连接 = 更多会话内存 = 更大压力。

修复方案

立即行动

  1. 减少会话内存:
tmp_table_size = 128M
max_heap_table_size = 128M
sort_buffer_size = 8M
  1. 提高 systemd 上限:
MemoryMax=18G
  1. 审计 RocksDB 缓存 —— 4 GB 可能过大:
rocksdb_block_cache_size = 2G

中期行动

  • 移除 Releem 覆盖文件(/etc/mysql/releem.conf.d/z_aiops_mysql.cnf)
  • 通过 PmaControl 监控 memory_mysqld 以在被杀之前发出告警
  • 配置 ProxySQL 的后端 max_connections 低于 MariaDB 的 max_connections

这不是什么

这不是:

  • 启动失败
  • Galera 恢复损坏
  • 数据目录损坏
  • 文件描述符问题

MariaDB 干净地重启并立即恢复为 active (running) 状态。

结论

一个自动调优工具(Releem)将 tmp_table_size 推到了 768 MB ——这个值单独看似乎合理。但与 16 GB 的 systemd 上限、4 GB 的 RocksDB 缓存以及 ProxySQL 连接风暴结合在一起,它就变成了一颗定时炸弹。

MariaDB 服务器的内存必须按最坏情况计算,而不是平均情况。

分享 X LinkedIn Facebook Email PDF
← 返回博客

评论 (0)

暂无评论。

发表评论

PmaControl
+33 6 63 28 27 47 contact@pmacontrol.com
法律声明 GitHub 联系我们
不要等到故障发生才了解您的架构。 © 2014-2026 PmaControl — 68Koncept