EKS环境下Oracle RDS数据库CPU利用率受限问题排查求助
排查EKS环境下RDS CPU利用率偏低的步骤
针对你遇到的EKS环境中RDS CPU利用率远低于同VPC EC2实例的问题,可按以下方向逐步排查:
1. 验证容器CPU资源是否受限
- 查看容器实际CPU使用情况:执行
kubectl top pods,对比容器的CPU使用率与请求值(1核)。如果容器CPU已接近或超过请求值,且节点剩余CPU不足,即使未设置CPU限制,Kubernetes的调度器也可能限制容器的CPU突发能力,导致应用无法发起更多数据库请求。 - 检查节点资源占用:执行
kubectl describe node <节点名称>,查看节点的CPU总容量、已分配资源及剩余可用资源,确认是否有其他Pod抢占了节点CPU。
2. 确认数据库实际连接数
- 在Oracle RDS中执行以下查询,查看活跃用户连接数:
对比EC2环境下的活跃连接数,如果EKS环境的连接数远低于EC2,说明应用侧未发起足够的数据库请求,问题根源在应用而非数据库。SELECT COUNT(*) FROM v$session WHERE STATUS = 'ACTIVE' AND TYPE = 'USER';
3. 排查网络层面限制
- 安全组与网络ACL:确认EKS节点的安全组是否允许出站到RDS端口(默认1521)的所有连接,同时检查RDS的安全组是否允许来自EKS节点的入站连接。即使同VPC,安全组规则过严可能限制并发连接数。
- 节点网络性能:在EKS节点上使用
iftop或nload工具监控网络带宽,对比EC2实例的带宽使用情况,确认是否存在带宽瓶颈。 - CNI连接跟踪限制:执行
sysctl net.netfilter.nf_conntrack_count和sysctl net.netfilter.nf_conntrack_max,如果连接数接近最大值,会导致新连接被丢弃,影响并发请求。可通过调整nf_conntrack_max参数扩大上限。
4. 验证DNS解析正确性
- 进入应用容器执行
nslookup db-svc,确认解析结果为RDS的私网IP。如果DNS解析延迟或返回错误IP,会导致数据库连接延迟,降低应用并发能力。
5. 检查容器QoS与调度优先级
- 查看Pod的QoS类别:执行
kubectl describe pod <Pod名称>,确认QoS为Burstable(因为仅设置了CPU请求)。如果节点上存在Guaranteed QoS的Pod,会优先占用CPU资源,导致应用容器的CPU调度优先级降低。 - 检查CPU管理器配置:如果EKS启用了静态CPU管理,确认容器的CPU请求是否为整数核,且节点有足够的专属CPU核心分配给容器。
6. 对比EC2与EKS的应用性能
- 在EKS容器内直接压测应用(例如使用
wrk -t12 -c400 -d30s http://localhost),记录QPS和响应时间,与EC2环境的压测结果对比。如果EKS的应用QPS远低于EC2,说明容器化后的应用本身存在性能瓶颈,需排查镜像依赖、系统参数配置等问题。
7. 检查RDS端的等待事件
- 在Oracle RDS中执行以下查询,查看是否存在阻塞或非空闲等待事件:
如果存在大量等待事件(如SELECT EVENT, COUNT(*) FROM v$session_wait WHERE EVENT NOT LIKE '%idle%' GROUP BY EVENT;enq: TX - row lock contention),即使CPU使用率低,也可能是数据库内部阻塞导致应用无法充分利用数据库资源。
内容的提问来源于stack exchange,提问作者sethu2912
相关产品推荐
相关产品推荐

