摘要

信创数据库上 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 性能异常的典型征兆

出现以下任意一种情况,不用怀疑,就是配额配错了:

  1. TPS 上不去,但节点 CPU 整体利用率很低
  2. 延迟忽高忽低,周期性卡顿,无规律可循
  3. 数据库经常莫名重启,事件里显示 OOM Kill
  4. 主备同步延迟持续偏高,网络带宽远没跑满
  5. 同样配置,容器性能比物理机差 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% 以上:

  1. 节点 kubelet 追加参数:--cpu-manager-policy=static
  2. 重启 kubelet,清空旧的 CPU 分配状态文件
  3. 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 性能翻倍:静态大页 + 禁用透明大页

这是很多团队忽略的点,但对内存性能影响巨大:

  1. 禁用透明大页(THP):THP 会导致内存碎片化、IO 抖动,数据库场景百害而无一利,节点层面必须永久关闭
  2. 开启静态大页(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 参数配比原则

  1. 内存参数总和 ≤ 容器内存的 60%,必须留足系统与进程开销
  2. CPU 并行度参数 ≤ 容器 CPU 核数,避免过度并行导致争抢
  3. IO 相关参数匹配存储性能,高性能存储可以调大刷盘阈值
  4. 参数调整后必须压测验证,禁止盲目照搬网上模板

八、实测对比:调优前后全维度性能数据对照表

📊 测试环境: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 + 人大金仓 + 达梦信创实战,持续输出生产级部署、性能调优、踩坑避坑干货,关注不迷路。

觉得文章有用的话,欢迎点赞、收藏、关注三连,后续更新更多信创数据库云原生落地的硬核内容。

更多推荐