K8s 环境人大金仓 / 达梦性能断崖下跌?容器资源配额极致调优指南|实测性能回升 90%+
摘要
信创数据库上 K8s 已经是行业趋势,但 90% 的团队都会踩同一个坑:物理机跑得好好的数据库,迁到容器里性能直接暴跌 30%-50%,TPS 上不去、延迟忽高忽低、大查询直接卡死,很多人归罪于「容器本身就有性能损耗」。
扎心真相是:容器原生 overhead 只有 5% 以内,性能断崖式下跌,本质都是资源配额配错了 + 数据库参数不匹配。本文基于政务、金融一线项目实测经验,拆解 CPU、内存、IO、网络四大维度的配额坑点,补充 cgroup v2 适配、数据库参数联动、压测验证方法,针对人大金仓 V9、达梦 DM9 分别给出三级场景调优模板,调完性能可接近物理机 95% 以上,所有配置直接复制就能用。
政务选金仓,金融选达梦;MySQL 迁移选金仓,Oracle 迁移选达梦。全文无空泛理论,全是生产踩出来的硬经验。
一、扎心真相:容器化数据库性能暴跌,90% 都是配额配错了
📌 先给结论:正常容器化场景下,数据库性能损耗应该在 5% 以内,超过 10% 一定是配置有问题。
我见过太多团队踩这个坑:物理机压测 TPS 能到 3000,上了 K8s 直接掉到 1200,延迟翻 3 倍,最后得出「容器不适合跑数据库」的结论。但排查下来,无一例外都是资源配额乱配:
- CPU limits 设了 8 核,实际高峰期被 CFS 限流,只能用到 2 核
- 共享内存默认 64M,达梦 MEMORY_TARGET 设了 2G,启动都费劲
- 数据放容器 overlay2 层,IO 栈多了三层,性能直接腰斩
- 透明大页没关,内存碎片化导致 IO 随机抖动
数据库是典型的资源敏感型应用,差一个参数,性能就是天壤之别。容器化不是性能差的借口,配额调对了,完全可以逼近物理机水平。
很多人配错的根源,是把容器当成了「轻量虚拟机」,但容器本质是进程级隔离,通过 cgroup 做资源限制、namespace 做视图隔离,资源边界比虚拟机更硬,错配的副作用也更明显。
1.1 性能异常的典型征兆
出现以下任意一种情况,不用怀疑,就是配额配错了:
- TPS 上不去,但节点 CPU 整体利用率很低
- 延迟忽高忽低,周期性卡顿,无规律可循
- 数据库经常莫名重启,事件里显示 OOM Kill
- 主备同步延迟持续偏高,网络带宽远没跑满
- 同样配置,容器性能比物理机差 30% 以上
二、四大性能杀手:资源配额踩坑全景与快速定位
绝大多数容器化数据库的性能问题,都逃不出这四个坑,按优先级排查效率最高:
| 性能杀手 | 核心问题 | 影响程度 | 常见现象 | 10 秒定位命令 |
|---|---|---|---|---|
| CPU 限流 | CFS 配额机制,limits 限制后高峰期被节流 | ⭐⭐⭐⭐⭐ | TPS 上不去,CPU 利用率卡在固定值,延迟突增 | cat /sys/fs/cgroup/cpu/cpu.stat 看 nr_throttled |
| 内存配置错误 | 共享内存不足、大页未开、OOM 优先级低 | ⭐⭐⭐⭐⭐ | 启动失败、随机重启、内存抖动、查询卡顿 | df -h /dev/shm 看共享内存大小 |
| IO 路径过长 | 数据放容器可写层、存储选型错误 | ⭐⭐⭐⭐ | IO 延迟高、TPS 低、写入卡顿 | iostat -x 1 看 await、% util |
| 网络损耗 | 隧道封装、转发路径长、参数不合理 | ⭐⭐⭐ | 主备同步慢、连接延迟高 | ping -c 100 对端PodIP 看延迟与丢包 |
💡 调优优先级:先 CPU、再内存、再 IO、最后网络。前三项调完,性能基本能回来 80% 以上。
三、CPU 配额极致调优:从限流到独占,性能拉满
CPU 是最容易被忽略但影响最大的一项。很多人以为 limits 设多大就能用多大,实则 K8s 的 CFS 调度机制,会让你的数据库在高峰期被偷偷「限流」。
3.0 先排查:你是不是被 CFS 限流了?
很多人性能差了半天,连是不是 CPU 限流都不知道。两步就能确认:
# 进入容器查看CPU限流统计
kubectl exec -it dmdb-0 -n dmdb -- cat /sys/fs/cgroup/cpu/cpu.stat
# 关键字段:
# nr_periods:总调度周期数
# nr_throttled:被限流的周期数
# throttled_time:累计被限流时间(纳秒)
如果 nr_throttled 持续增长,不用怀疑,你的数据库正在被 CFS 砍性能。
3.1 基础级:Guaranteed QoS,稳定资源优先级
K8s 有三种 QoS 等级,数据库必须用最高级 Guaranteed,这是底线:
- BestEffort:不设 requests 和 limits,优先级最低,节点资源紧张时最先被杀
- Burstable:requests < limits,最常用但也是性能抖动的元凶,高峰期会被 CFS 限流
- Guaranteed:requests = limits,优先级最高,调度时不超售,驱逐优先级最低
✅ 正确配置:CPU 和内存的 requests 与 limits 完全一致
resources:
requests:
cpu: "8"
memory: "16Gi"
limits:
cpu: "8"
memory: "16Gi"
⚠️ 巨坑提醒:很多人图省事只写 limits 不写 requests,默认会变成 Burstable 等级,照样会被限流。必须同时写且数值完全相等。
3.2 进阶级:CPU 管理器静态策略,物理核心绑定
光有 Guaranteed 还不够,多个 Pod 共享 CPU 核心时,上下文切换、缓存失效依然会带来 10%-20% 的性能损耗。
开启 Kubelet 的 CPU 管理器静态策略,数据库 Pod 会被分配独占物理 CPU 核心,性能直接提升 15% 以上:
- 节点 kubelet 追加参数:
--cpu-manager-policy=static - 重启 kubelet,清空旧的 CPU 分配状态文件
- Pod 保持 Guaranteed 等级,且 CPU 为整数核,自动进入独占分配池
验证方式:
# 进入容器查看绑定的CPU核心
cat /sys/fs/cgroup/cpuset/cpuset.cpus
# 输出固定核心范围(如 4-11)即为绑定成功
3.3 极致级:独占节点 + 固定主频,零争抢
核心业务数据库可以更进一步,彻底消除 CPU 层面的争抢:
- 节点打污点,只调度数据库实例,不混部其他业务
- 预留 0、1 号核给系统进程、Kubelet、容器运行时
- 关闭 CPU 节能模式,固定主频为性能模式
- 关闭 NUMA 自动平衡,数据库绑定单 NUMA 节点
极致调优后,CPU 层面的性能损耗可控制在 2% 以内,基本与物理机无差异。
3.4 cgroup v2 适配注意事项
K8s 1.25+ 版本默认启用 cgroup v2,CPU 调度机制有变化:
- CFS 配额精度更高,但限流统计路径变了
- 旧版镜像可能无法正确读取 CPU 限制,导致数据库错误估算可用核心
- 建议使用适配 cgroup v2 的数据库镜像,或手动设置数据库并行度参数
3.5 金仓 / 达梦适配要点
- 两者均为 OLTP 场景,对 CPU 延迟敏感度极高,必须 Guaranteed 等级
- 并发高的场景优先上 CPU 绑定,减少上下文切换带来的事务延迟
- 不要盲目超配 CPU,数据库不是 CPU 密集型,8 核足够支撑大部分中小业务,优先保证独占性
四、内存配额极致调优:共享内存 + 大页,告别 OOM 与抖动
内存是容器化数据库的第一重灾区,尤其是达梦,对共享内存依赖性极强,配置错了直接启动失败。
4.0 先排查:内存问题怎么定位
# 1. 看共享内存大小
df -h /dev/shm
# 2. 看是否发生过OOM
kubectl describe pod dmdb-0 -n dmdb | grep -i oom
# 3. 看容器内存实际使用
kubectl top pod dmdb-0 -n dmdb --containers
4.1 救命配置:扩容共享内存 /dev/shm
容器默认 /dev/shm 只有 64MB,而达梦的 MEMORY_TARGET、人大金仓的 shared_buffers 都依赖共享内存,配置稍大就会报「共享内存不足」。
✅ 必须用 emptyDir 挂载扩容共享内存:
volumeMounts:
- name: shm
mountPath: /dev/shm
volumes:
- name: shm
emptyDir:
medium: Memory
sizeLimit: 3Gi
💡 容量配置标准:
- 达梦 DM9:sizeLimit ≥ MEMORY_TARGET × 1.2,预留冗余空间
- 人大金仓 V9:sizeLimit ≥ shared_buffers × 1.5,覆盖其他共享内存段
4.2 性能翻倍:静态大页 + 禁用透明大页
这是很多团队忽略的点,但对内存性能影响巨大:
- 禁用透明大页(THP):THP 会导致内存碎片化、IO 抖动,数据库场景百害而无一利,节点层面必须永久关闭
- 开启静态大页(HugePages):使用 2M/1G 大页,大幅降低 TLB 缺失,内存访问性能提升 20%-30%
⚠️ 关键前提:节点必须先预留好大页总数量,Pod 才能申请使用,不是光配 Pod 就行。 节点配置示例:
# 节点永久开启大页(2M大页,预留1024个=2G)
echo "vm.nr_hugepages = 1024" >> /etc/sysctl.conf
sysctl -p
✅ 容器大页配置示例:
volumeMounts:
- name: hugepage
mountPath: /dev/hugepages
volumes:
- name: hugepage
emptyDir:
medium: HugePages
resources:
limits:
hugepages-2Mi: 2Gi # 大页容量,必须与数据库参数匹配
memory: 16Gi
对应数据库参数调整:
- 达梦:
ENABLE_HUGE_PAGES = 1,大页总容量 ≥ MEMORY_TARGET - 金仓:
huge_pages = on,大页总容量 ≥ shared_buffers + 其他共享内存
4.3 OOM 防坑:内存预留公式与 QoS 保障
很多人把内存 limits 卡得刚好等于数据库内存,结果频繁 OOM Kill。数据库不是把所有内存都自己用了,还要预留:
- 30% 给文件系统缓存、连接进程、后台进程
- 额外预留 10% 应对突发峰值
✅ 通用配置公式: 容器内存 limits = 数据库最大内存占用 ÷ 0.6
比如达梦 MEMORY_TARGET 设 8G,容器内存 limits 至少设 16G,留足系统余量。
4.4 cgroup v2 内存适配坑点
cgroup v2 是当前最高频的内存坑:
- 很多旧版数据库镜像无法识别 cgroup v2 的内存限制,会误以为可用内存是节点总内存
- 数据库按节点内存分配缓冲区,最终超过 cgroup 限制,被内核 OOM Kill
- 解决方案:要么升级适配 cgroup v2 的数据库版本,要么显式设置数据库内存参数,禁止自动计算
4.5 金仓 / 达梦内存差异对照表
| 维度 | 人大金仓 V9 | 达梦 DM9 |
|---|---|---|
| 共享内存依赖 | 中等,主要是 shared_buffers | 极高,整个内存池都依赖 /dev/shm |
| 大页开关 | huge_pages = on | ENABLE_HUGE_PAGES = 1 |
| OOM 风险 | 中等,内存超用相对温和 | 高,连接数暴涨时内存飙升快 |
| 系统预留比例 | 建议 40% | 建议 50% |
| cgroup v2 适配 | V9 新版已适配 | 部分老版本需手动指定内存 |
五、IO 配额调优:绕过存储层损耗,逼近裸盘性能
IO 是数据库的生命线,容器化场景下 IO 路径变长,配置不当性能直接腰斩。
5.1 底线原则:数据绝对不能放容器根目录
容器根文件系统是 overlay2,走的是联合文件系统,IO 栈多了好几层,不仅性能差,还会随着容器删除丢失数据。
✅ 所有数据目录必须通过 PVC 挂载独立存储,且分目录挂载:
- 数据目录:主数据文件,随机读写为主
- 日志目录:重做日志、运行日志,顺序写入为主
- 归档目录:归档日志,顺序写入、冷数据
- 备份目录:备份文件,大文件顺序读写
分盘挂载的核心好处:避免日志写入和数据读写争抢 IO 资源,日志顺序写不会阻塞数据随机读。
5.2 存储选型性能天梯图 + 实测对比
性能从高到低排序,生产环境按优先级选:
| 存储方案 | 随机读 IOPS(4K) | 写入延迟 | 可靠性 | 推荐场景 |
|---|---|---|---|---|
| 本地 SSD + Local PV | 80000+ | <0.1ms | 节点级 | 核心生产、极致性能要求 |
| 分布式块存储(Ceph RBD) | 30000-50000 | 0.5-1ms | 集群级 | 大多数生产、需要漂移 |
| 分布式文件存储 | 8000-15000 | 2-5ms | 集群级 | 归档、备份、非核心 |
| NFS | <3000 | >10ms | 低 | ❌ 绝对禁止生产 OLTP |
💡 落地建议:核心库优先本地 SSD + 主备高可用,兼顾性能与容灾;非核心库用分布式块存储,运维更灵活。
5.3 挂载参数与存储类优化
- 挂载参数加
noatime,nodiratime,关闭文件访问时间记录,减少元数据写入 - 块存储关闭不必要的校验和加密,降低 CPU 损耗
- StorageClass 回收策略设 Retain,数据安全优先
- 本地存储使用 VolumeBindingMode: WaitForFirstConsumer,避免 PV 与 Pod 不在同一节点
5.4 IO 资源隔离与优先级保障
节点混部场景下,数据库 IO 优先级必须最高:
- 节点级配置 IO 权重,数据库进程优先级最高
- 使用存储 QoS 类,为数据库 PVC 分配更高的 IOPS 与带宽配额
- 禁止低优先级业务大量打盘,影响数据库性能
⚠️ 注意:K8s 原生 Pod resources 不支持直接配置 blkio 权重,需通过节点级 cgroup 配置或存储厂商 QoS 能力实现,不要在 resources 里乱写不支持的字段。
5.5 金仓 / 达梦 IO 适配要点
- 达梦重做日志写入频繁,日志盘必须用高性能存储,避免日志刷盘成为瓶颈
- 人大金仓 WAL 机制与 PostgreSQL 一致,WAL 盘单独挂载可显著提升写入性能
- 两者都建议开启异步提交(业务允许的前提下),进一步降低写入延迟
六、网络调优:主备同步延迟从毫秒级压到微秒级
网络对单节点读写性能影响不大,但直接决定主备同步延迟、集群切换速度。
6.1 网络插件选型与损耗对比
| 网络插件 | 模式 | 额外延迟 | 推荐指数 |
|---|---|---|---|
| Calico | BGP 三层直连 | <0.1ms | ⭐⭐⭐⭐⭐ |
| Macvlan | 二层直通 | <0.05ms | ⭐⭐⭐⭐⭐ |
| Flannel | host-gw | ~0.2ms | ⭐⭐⭐ |
| Flannel | VXLAN 隧道 | ~0.5ms+ | ⭐ |
💡 数据库场景优先选无隧道的三层 / 二层方案,VXLAN 隧道封装会增加 30% 以上的网络延迟,主备同步场景感知非常明显。
6.2 主备组网最优路径:直连不走 Service
主备同步不要走 ClusterIP Service,kube-proxy 的转发会增加不必要的延迟和单点风险。
✅ 最优方式:通过 Headless Service 的固定 DNS 域名直连对端 Pod IP,走 Pod 网络直连,减少一层转发。
# 主备同步直接用
dmdb-0.dmdb-headless.dmdb.svc.cluster.local
dmdb-1.dmdb-headless.dmdb.svc.cluster.local
6.3 内核参数级调优清单
节点级优化 TCP 参数,数据库场景效果显著:
# 禁用Nagle算法,降低小报文延迟
net.ipv4.tcp_nodelay = 1
# 开启端口复用,提升短连接性能
net.ipv4.tcp_tw_reuse = 1
# 增大TCP读写缓冲区
net.core.rmem_max = 16777216
net.core.wmem_max = 16777216
# 缩短死连接检测时间
net.ipv4.tcp_keepalive_time = 300
net.ipv4.tcp_keepalive_intvl = 30
6.4 网络延迟排查命令
# 测试主备Pod之间延迟
kubectl exec -it dmdb-0 -n dmdb -- ping -c 100 dmdb-1.dmdb-headless.dmdb.svc.cluster.local
# 测试端口连通性与建连时间
kubectl exec -it dmdb-0 -n dmdb -- time nc -zv dmdb-1.dmdb-headless.dmdb.svc.cluster.local 5236
七、数据库参数联动调优:容器配额必须与库参数匹配
很多人容器配额调了,数据库参数还是老一套,结果性能上不去,甚至出问题。容器资源变了,数据库参数必须跟着联动调整。
7.1 人大金仓 V9 配套参数清单
对应容器 8 核 16G 配置,参数优化参考:
| 参数 | 推荐值 | 说明 |
|---|---|---|
| shared_buffers | 4GB | 容器内存的 25%,与大页容量匹配 |
| effective_cache_size | 12GB | 预估系统缓存大小,影响执行计划 |
| work_mem | 16MB | 单操作内存,按连接数折算 |
| maintenance_work_mem | 512MB | 维护操作内存 |
| wal_buffers | 64MB | WAL 缓冲区 |
| max_connections | 500 | 连接数不宜过大 |
| huge_pages | on | 开启大页,与容器配置对应 |
7.2 达梦 DM9 配套参数清单
对应容器 8 核 16G 配置,参数优化参考:
| 参数 | 推荐值 | 说明 |
|---|---|---|
| MEMORY_TARGET | 8GB | 容器内存的 50%,预留系统余量 |
| BUFFER | 4096 | 数据缓冲区大小(MB) |
| MAX_BUFFER | 8192 | 最大缓冲区 |
| LOG_BUFFER | 256 | 日志缓冲区(MB) |
| MAX_CONNECTIONS | 500 | 最大连接数 |
| ENABLE_HUGE_PAGES | 1 | 开启大页 |
| CHECKPOINT_INTERVAL | 300 | 检查点间隔,平滑 IO |
7.3 参数配比原则
- 内存参数总和 ≤ 容器内存的 60%,必须留足系统与进程开销
- CPU 并行度参数 ≤ 容器 CPU 核数,避免过度并行导致争抢
- IO 相关参数匹配存储性能,高性能存储可以调大刷盘阈值
- 参数调整后必须压测验证,禁止盲目照搬网上模板
八、实测对比:调优前后全维度性能数据对照表
📊 测试环境:K8s 1.26 集群,工作节点 16C32G 本地 SSD,cgroup v2,人大金仓 V9 / 达梦 DM9 企业版,压测工具 sysbench,100 并发,标准 OLTP 读写混合场景。
| 性能指标 | 人大金仓 V9 调优前 | 人大金仓 V9 调优后 | 提升幅度 | 达梦 DM9 调优前 | 达梦 DM9 调优后 | 提升幅度 |
|---|---|---|---|---|---|---|
| 峰值 TPS | 1210 | 2830 | 134% | 1080 | 2670 | 147% |
| 平均响应延迟 | 8.2ms | 2.4ms | 降低 71% | 9.1ms | 2.7ms | 降低 70% |
| 99 分位延迟 | 118ms | 14ms | 降低 88% | 147ms | 17ms | 降低 88% |
| 主备同步延迟 | 78ms | 11ms | 降低 86% | 102ms | 14ms | 降低 86% |
| CPU 利用率波动 | ±36% | ±7% | 波动收窄 81% | ±41% | ±6% | 波动收窄 85% |
| 缓冲区命中率 | 82% | 98.7% | 提升 16.7% | 79% | 98.2% | 提升 19.2% |
| 物理机对比值 | 41% | 93% | - | 38% | 94% | - |
💡 结论:全维度调优后,两款数据库性能均提升一倍以上,延迟大幅降低,稳定性显著提升,整体性能达到物理机的 92%-95%,完全满足生产要求。
九、开箱即用:三级场景完整配置模板
9.1 开发测试版(够用就行,成本优先)
适用场景:开发环境、测试环境、非核心边缘系统
- QoS 等级:Burstable(允许一定超售)
- 不绑定 CPU、不开大页
- 单 PVC 整合数据日志
达梦 DM9 精简配置片段
resources:
requests:
cpu: "1"
memory: "2Gi"
limits:
cpu: "4"
memory: "8Gi"
volumes:
- name: shm
emptyDir:
medium: Memory
sizeLimit: 1Gi
volumeClaimTemplates:
- metadata:
name: dmdb-data
spec:
accessModes: ["ReadWriteOnce"]
storageClassName: "csi-rbd"
resources:
requests:
storage: 50Gi
9.2 中小生产版(稳定优先,性价比高)
适用场景:中小规模生产、非核心交易系统
- QoS 等级:Guaranteed
- 共享内存扩容、禁用透明大页
- 数据、日志、归档分盘
- Pod 反亲和性分散节点
人大金仓 V9 生产标配
spec:
template:
spec:
securityContext:
runAsUser: 1000
runAsGroup: 1000
fsGroup: 1000
runAsNonRoot: true
affinity:
podAntiAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
- labelSelector:
matchExpressions:
- key: app
operator: In
values: ["kingbase"]
topologyKey: kubernetes.io/hostname
containers:
- name: kingbase
image: your-registry/kingbase-v9:latest
resources:
requests:
cpu: "4"
memory: "8Gi"
limits:
cpu: "4"
memory: "8Gi"
volumeMounts:
- name: kingbase-data
mountPath: /opt/kingbase/data
- name: kingbase-log
mountPath: /opt/kingbase/log
- name: kingbase-arch
mountPath: /opt/kingbase/arch
- name: shm
mountPath: /dev/shm
volumes:
- name: shm
emptyDir:
medium: Memory
sizeLimit: 2Gi
volumeClaimTemplates:
- metadata:
name: kingbase-data
spec:
accessModes: ["ReadWriteOnce"]
storageClassName: "local-ssd"
resources:
requests:
storage: 100Gi
- metadata:
name: kingbase-log
spec:
accessModes: ["ReadWriteOnce"]
storageClassName: "local-ssd"
resources:
requests:
storage: 30Gi
- metadata:
name: kingbase-arch
spec:
accessModes: ["ReadWriteOnce"]
storageClassName: "local-ssd"
resources:
requests:
storage: 50Gi
9.3 核心生产版(极致性能,高可用保障)
适用场景:金融核心、政务核心、高并发交易系统
- CPU 静态绑定独占核心
- 开启静态大页
- 节点独占,不混部
- 完整主备高可用架构
- 全链路性能调优
达梦 DM9 核心生产配置片段
spec:
template:
spec:
nodeSelector:
dedicated: database
tolerations:
- key: "dedicated"
operator: "Equal"
value: "database"
effect: "NoSchedule"
securityContext:
runAsUser: 5236
runAsGroup: 5236
fsGroup: 5236
containers:
- name: dmdb
image: your-registry/dm9:v9.1.2.100
resources:
requests:
cpu: "8"
memory: "16Gi"
limits:
cpu: "8"
memory: "16Gi"
hugepages-2Mi: 3Gi
volumeMounts:
- name: dmdb-data
mountPath: /dm/data
- name: dmdb-log
mountPath: /dm/log
- name: dmdb-arch
mountPath: /dm/arch
- name: shm
mountPath: /dev/shm
- name: hugepage
mountPath: /dev/hugepages
volumes:
- name: shm
emptyDir:
medium: Memory
sizeLimit: 3Gi
- name: hugepage
emptyDir:
medium: HugePages
volumeClaimTemplates:
- metadata:
name: dmdb-data
spec:
accessModes: ["ReadWriteOnce"]
storageClassName: "local-ssd"
volumeBindingMode: WaitForFirstConsumer
resources:
requests:
storage: 200Gi
- metadata:
name: dmdb-log
spec:
accessModes: ["ReadWriteOnce"]
storageClassName: "local-ssd"
resources:
requests:
storage: 50Gi
- metadata:
name: dmdb-arch
spec:
accessModes: ["ReadWriteOnce"]
storageClassName: "local-ssd"
resources:
requests:
storage: 100Gi
十、调优验证:怎么证明你调优真的生效了
调完不是结束,必须验证效果。三步验证法,确保性能真的提升了。
10.1 资源层验证
确认资源限制生效,没有隐形限流:
# 1. 确认QoS等级
kubectl get pod dmdb-0 -n dmdb -o jsonpath='{.status.qosClass}'
# 输出 Guaranteed 即为正确
# 2. 确认CPU未被限流
kubectl exec -it dmdb-0 -n dmdb -- cat /sys/fs/cgroup/cpu/cpu.stat
# 压测期间 nr_throttled 不增长即为正常
# 3. 确认共享内存大小
kubectl exec -it dmdb-0 -n dmdb -- df -h /dev/shm
10.2 数据库层验证
确认数据库内部指标健康:
-- 金仓:查看缓冲区命中率
select sum(blks_hit)*100/sum(blks_hit+blks_read) as hit_ratio from pg_stat_database;
-- 达梦:查看缓冲区命中率
select (1 - sum(phys_reads)/sum(logical_reads))*100 as hit_ratio from v$bufferpool;
正常生产环境命中率应在 98% 以上,低于 95% 说明内存配置不足。
10.3 业务层压测验证
用 sysbench 做标准压测,对比调优前后的 TPS、延迟:
# 压测准备:创建测试表
sysbench oltp_read_write --db-driver=pgsql \
--pgsql-host=kingbase-svc.kingbase.svc.cluster.local \
--pgsql-port=54321 --pgsql-user=system --pgsql-password=xxx \
--pgsql-db=testdb --tables=10 --table-size=100000 prepare
# 执行压测
sysbench oltp_read_write --threads=100 --time=300 run
十一、终极避坑:12 条配额红线绝对不能碰
⚠️ 红线 1:绝对不能用 BestEffort 等级跑数据库 不设任何资源限制,看起来自由,实际上节点资源紧张时第一个被杀的就是数据库,数据损坏风险极高。
⚠️ 红线 2:绝对不能 CPU requests 与 limits 不一致 Burstable 等级的 CFS 限流是隐形性能杀手,节点空闲也跑不满性能,延迟抖动无解。
⚠️ 红线 3:绝对不能用默认 64M 共享内存跑数据库 达梦大概率启动失败,金仓性能暴跌,这是新手必踩第一坑。
⚠️ 红线 4:绝对不能把数据放在容器根目录 overlay2 文件系统 IO 性能差,且 Pod 删除数据一并丢失,性能和安全双输。
⚠️ 红线 5:绝对不能开透明大页跑数据库 THP 会导致内存碎片化、IO 随机抖动,数据库场景必须永久关闭。
⚠️ 红线 6:绝对不能内存 limits 卡得刚好等于数据库参数 系统、连接进程、文件缓存都要吃内存,卡太死必 OOM,至少预留 40% 余量。
⚠️ 红线 7:绝对不能用 NFS 跑 OLTP 生产库 锁机制差、延迟高、并发低,跑起来处处卡顿,生产事故早晚的事。
⚠️ 红线 8:绝对不能主备 Pod 调度到同一节点 不配反亲和性,节点宕机主备一起挂,高可用架构直接形同虚设。
⚠️ 红线 9:绝对不能节点没配大页就给 Pod 开大页 节点不预留大页,Pod 直接调度失败,且报错不明显,排查非常浪费时间。
⚠️ 红线 10:绝对不能只调容器不调数据库参数 容器资源翻倍,数据库参数不动,等于白调,性能不会有明显提升。
⚠️ 红线 11:绝对不能忽略 cgroup v2 适配 K8s 1.25 + 默认 cgroup v2,旧版数据库镜像识别错误会导致频繁 OOM,必须提前验证适配。
⚠️ 红线 12:绝对不能迷信自愈忽略备份 调优再到位也防不住逻辑错误、误删数据,备份是最后一道防线,绝对不能省。
十二、常见性能故障排查速查表
| 故障现象 | 最可能原因 | 排查命令 | 解决方案 |
|---|---|---|---|
| TPS 上不去,CPU 利用率卡固定值 | CFS 限流,Burstable 等级 | 查看 cpu.stat 的 throttled 计数 | 改为 Guaranteed 等级,requests=limits |
| 数据库启动报错:共享内存不足 | /dev/shm 太小 | df -h /dev/shm | emptyDir 挂载扩容共享内存 |
| 数据库随机重启,事件显示 OOM | 内存预留不足,或 cgroup v2 不兼容 | kubectl describe 看 OOM 事件 | 增大内存 limits,调低数据库内存参数 |
| 写入延迟高,IO util 打满 | 存储性能差,或日志数据同盘 | iostat -x 1 看 await | 更换高性能存储,日志数据分盘 |
| 主备同步延迟高,带宽空闲 | 网络插件隧道封装延迟高 | ping 测主备延迟 | 切换 BGP 网络,走直连路径 |
| 延迟周期性抖动,无规律 | 透明大页导致内存碎片 | cat /sys/kernel/mm/transparent_hugepage/enabled | 节点永久禁用透明大页 |
| 压测 CPU 使用率低但 TPS 上不去 | CPU 上下文切换严重,共享核心 | vmstat 1 看 cs 数值 | 开启 CPU 管理器静态策略,绑定独占核心 |
| 升级 K8s 后频繁 OOM | cgroup v2 适配问题 | 查看 cgroup 版本 | 升级数据库镜像,显式设置内存参数 |
总结
容器化从来都不是数据库性能差的借口。绝大多数性能问题,本质都是没搞懂 K8s 资源机制,想当然按物理机思路配参数。抓住 CPU、内存、IO 三个核心维度,把配额配对、把数据库参数联动调对、把坑填上,容器化数据库完全可以达到接近物理机的性能水平。
信创数据库上云原生是大趋势,与其质疑容器能不能跑数据库,不如把配置做扎实,真正发挥云原生的弹性与运维优势。
政务选金仓,金融选达梦;MySQL 迁移选金仓,Oracle 迁移选达梦。
📚 专栏推荐:专注 SpringBoot3 + 人大金仓 + 达梦信创实战,持续输出生产级部署、性能调优、踩坑避坑干货,关注不迷路。
觉得文章有用的话,欢迎点赞、收藏、关注三连,后续更新更多信创数据库云原生落地的硬核内容。
更多推荐
所有评论(0)