《云原生网络数据面可观测性最佳实践》——五、 典型问题华山论剑——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使用率不高没有直接的互斥关系。

相关文章
|
9月前
|
Kubernetes 安全 Cloud Native
云原生|kubernetes|pod或容器的安全上下文配置解析
云原生|kubernetes|pod或容器的安全上下文配置解析
599 0
|
11天前
|
算法 安全 大数据
【算法合规新时代】企业如何把握“清朗·网络平台算法典型问题治理”专项行动?
在数字化时代,算法推动社会发展,但也带来了信息茧房、大数据杀熟等问题。中央网信办发布《关于开展“清朗·网络平台算法典型问题治理”专项行动的通知》,针对六大算法问题进行整治,明确企业需落实算法安全主体责任,建立健全审核与管理制度,并对算法进行全面审查和备案。企业应积极自查自纠,确保算法合规透明,防范风险,迎接新机遇。
|
5月前
|
人工智能 安全 Cloud Native
阿里云云原生安全能力全线升级,护航百万客户云上安全
【重磅发布】9月20日,在杭州云栖大会上,阿里云宣布云原生安全能力全线升级,首次发布云原生网络检测与响应产品NDR(Network Detection Response,简称NDR)。同时,阿里云还宣布将持续增加免费的安全防护能力,帮助中小企业客户以极低投入完成基础的云上安全风险治理。
224 15
|
9月前
|
存储 Kubernetes 调度
k8s常见的排错指南Node,svc,Pod等以及K8s网络不通问题
k8s常见的排错指南Node,svc,Pod等以及K8s网络不通问题
3225 1
|
6月前
|
Kubernetes 安全 Serverless
Kubernetes云原生问题之在Serverless Container中,Pod运行如何解决
Kubernetes云原生问题之在Serverless Container中,Pod运行如何解决
85 5
|
7月前
|
弹性计算 运维 安全
面对蓝屏,阿里云云原生能力可以帮客户做点啥?
Windows大面积蓝屏,问题源于“CSAgent.sys”加载错误设定的“C-00000291*.sys”文件。阿里云充分利用云原生能力,通过ECS实例自助排查和OOS批量操作快速修复受损机器。
|
6月前
|
Kubernetes 监控 Shell
在K8S中,我们公司用户反应pod连接数非常多,希望看一下这些连接都是什么信息?什么状态?怎么排查?容器里面没有集成bash环境、网络工具,怎么处理?
在K8S中,我们公司用户反应pod连接数非常多,希望看一下这些连接都是什么信息?什么状态?怎么排查?容器里面没有集成bash环境、网络工具,怎么处理?
|
6月前
|
Kubernetes 监控 网络协议
在K8S中,如果因为网络原因导致Pod异常,该如何排查?
在K8S中,如果因为网络原因导致Pod异常,该如何排查?
|
6月前
|
Kubernetes 应用服务中间件 Docker
在K8S中,Pod网络访问与Docker容器端口映射有何不同?
在K8S中,Pod网络访问与Docker容器端口映射有何不同?
|
9月前
|
算法 数据可视化 搜索推荐
数据分享|Python用Apriori算法关联规则分析亚马逊购买书籍关联推荐客户和网络图可视化
数据分享|Python用Apriori算法关联规则分析亚马逊购买书籍关联推荐客户和网络图可视化
102 11

热门文章

最新文章