《云原生网络数据面可观测性最佳实践》——五、 典型问题华山论剑——3. 某客户反馈pod偶发性健康检查失败

简介: 《云原生网络数据面可观测性最佳实践》——五、 典型问题华山论剑——3. 某客户反馈pod偶发性健康检查失败

问题背景

谋客户反馈ingress偶发性健康检查失败问题,nginx-ingress-controller" failed (failure): Get "http://xx.xx.xxx.xx:10254/healthz": context deadline exceeded (Client.Timeout exceeded while awaiting headers)

排查过程

重传较高,其中rto引发重传较多,fastretrans有降低 image.pngimage.png

passiveopens和activeopens显著降低

image.png

image.png

 listenoverflow指标没有明显变化。

 

其他包括socket wqueue和rqueue堆积等监控客户未获取到,此外还能看到conntrack相关的查找数和softnet流量显著降低。以上监控表明客户的健康检查失败问题并非流量突增导致的,单个pod的流量突降可能的原因有:

 

ingress off-cpu事件久问题

cgroup限制

 

根因原理

cgroup cpu出现throttled现象。

image.png

image.png

 

容器的核心原理之一在于使用cgroup限制进程使用的资源,其核心原理在于调度时根据cgroup维护的cfs_rq决定是否按照cfs调度算法正常进行程序的调度:

// 每次出现cpu上下文切换或者hrtimer定时器触发是都会检测单个cfs_rq的时间偏是否小于0
// 如果已经小于0,即使用cpu超过配额,会设置throttle
static void check_enqueue_throttle(struct cfs_rq *cfs_rq)
{
/* ensure the group is not already throttled */
if (cfs_rq_throttled(cfs_rq))
return;
/* update runtime allocation */
account_cfs_rq_runtime(cfs_rq, 0);
if (cfs_rq->runtime_remaining <= 0)
throttle_cfs_rq(cfs_rq);
}
// 在执行enqueue到调度队列操作时,会根据cfs_rq的throttled来决定是否真正做enqueue操作
static void
enqueue_task_fair(struct rq *rq, struct task_struct *p, int flags)
{
for_each_sched_entity(se) {
cfs_rq = cfs_rq_of(se);
pdate_load_avg(cfs_rq, se, UPDATE_TG);
se_update_runnable(se);
update_cfs_group(se);
cfs_rq->h_nr_running++;
cfs_rq->idle_h_nr_running += idle_h_nr_running;
if (cfs_rq_is_idle(cfs_rq))
idle_h_nr_running = 1;
/* 这里会根据task_struct的cgroup找到对应css_set的task_group调度实体,从而获取到cfs_rq */
if (cfs_rq_throttled(cfs_rq))
goto enqueue_throttle;
}
enqueue_throttle:
assert_list_leaf_cfs_rq(rq);
hrtick_update(rq);
}

 用户进程出现被cgroup进行throttle现象时,等同于无法被调度,即调度出现卡顿,用户程序执行会变慢。

 

在cpu子系统的statistic数据中:

 

- nr_periods:已经过去执行间隔数量

- nr_throttled: 该组已被节流/限制次数

- throttled_time: 该组实体被限流总时间长度(纳秒)

 

对于网络操作来说:

 

-收包操作,在内核上下文中执行,不会被cgroup throttle影响

-发包操作,由用户态程序trap到内核态进行操作,会被cgroup throttle影响

 

综上原理,当cgroup throttle出现时,会造成的现象是:

 

用户态程序不会及时从socket rqueue中获取已经送达报文,即

用户态程序已经写入到socket wqueue报文,由于nagle算法,tcp small queue等原因在内核生成报文当时还未发送报文堆积,造成类似于“数据包无法打到对端”类似现象,即RTO重传较高,但是乱序引发fast retrans重传反而会降低

 

上述两个现象进一步会造成:

 

握手失败,如健康检查失败等等

会话超时,如ingress 出现499等

 

解决办法

对于独占节点服务如ingress等,不需要通过requests/limits进行资源限制,由于cfs算法公平逻辑,偶发cpu飙升出现短暂卡顿并不会导致整个节点持续性负载过高,但是对于ingress这样网络敏感服务,容易引发偶发网络问题从而影响业务

如果客户对于放开限制有疑问话,可以建议客户使用

https://www.alibabacloud.com/help/zh/container-service-for-kubernetes/latest/use-cpu-burst-to-improve-container-performance通过slo-manager方式提供cpu burst能力

如果客户没有采用ACK Pro,

可以参考https://help.aliyun.com/document_detail/306980.html对cgroup本身进行允许burst配置,但是此方式需要客户自行操作

 

FAQ:为什么CPU整体占用率较低,还是会有throttled现象?

 

从上方介绍cgroup限制cpu的原理可以发现,cgroup统计计算一段时间内的vruntime分配情况来决定是否进行CPU限制,而常见的CPU使用率判断方式是根据一段时间内用户程序ONCPU状态的采样统计计算获得,是一个采样周期内的平均估算,因此出现偶发的CPU上升波动引发throttle与整体的CPU使用率不高没有直接的互斥关系。

相关文章
|
4月前
|
监控 Cloud Native 安全
浅谈云原生可观测性
【1月更文挑战第23天】
|
5月前
|
Kubernetes 安全 Cloud Native
云原生|kubernetes|pod或容器的安全上下文配置解析
云原生|kubernetes|pod或容器的安全上下文配置解析
117 0
|
1月前
|
存储 Cloud Native Serverless
云原生最佳实践系列 7:基于 OSS Object FC 实现非结构化文件实时处理
阿里云OSS对象存储方案利用函数计算FC,在不同终端请求时实时处理OSS中的原图,减少衍生图存储,降低成本。
|
1月前
|
负载均衡 Cloud Native 安全
云原生最佳实践系列 6:MSE 云原生网关使用 JWT 进行认证鉴权
本文档介绍了如何在 MSE(Microservices Engine)云原生网关中集成JWT进行全局认证鉴权。
|
1月前
|
消息中间件 NoSQL Kafka
云原生最佳实践系列 5:基于函数计算 FC 实现阿里云 Kafka 消息内容控制 MongoDB DML 操作
该方案描述了一个大数据ETL流程,其中阿里云Kafka消息根据内容触发函数计算(FC)函数,执行针对MongoDB的增、删、改操作。
|
2月前
|
消息中间件 Cloud Native 网络安全
云原生最佳实践系列 3:基于 SpringCloud 应用玩转 MSE
该文档介绍了基于云原生应用的产品构建的微服务架构实践。
|
2月前
|
负载均衡 Kubernetes Cloud Native
云原生最佳实践系列2:基于 MSE 云原生网关同城多活
通过使用阿里云的云原生微服务引擎 MSE,可以实现注册中心的同城容灾多活微服务应用。MSE 提供了云原生网关和注册中心,支持机房级故障的秒级自动转移、非对等部署下的全局流量负载均衡以及流量精细化管控。
662 39
|
3月前
|
人工智能 运维 监控
「云原生可观测团队」获选「InfoQ 年度技术内容贡献奖」
「云原生可观测团队」获选「InfoQ 年度技术内容贡献奖」
|
4月前
|
存储 Prometheus 监控
成本更低、更可控,云原生可观测新计费模式正式上线
成本更低、更可控,云原生可观测新计费模式正式上线
|
4月前
|
运维 供应链 安全
从方法论到最佳实践,深度解析企业云原生 DevSecOps 体系构建
本文主要介绍了云原生安全的现状以及企业应用在云原生化转型中面临的主要安全挑战以及相对成熟的一部分安全体系方法论,深度解析企业云原生 DevSecOps 体系构建。

热门文章

最新文章