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

相关文章
|
15天前
|
Kubernetes Cloud Native Ubuntu
庆祝 .NET 9 正式版发布与 Dapr 从 CNCF 毕业:构建高效云原生应用的最佳实践
2024年11月13日,.NET 9 正式版发布,Dapr 从 CNCF 毕业,标志着云原生技术的成熟。本文介绍如何使用 .NET 9 Aspire、Dapr 1.14.4、Kubernetes 1.31.0/Containerd 1.7.14、Ubuntu Server 24.04 LTS 和 Podman 5.3.0-rc3 构建高效、可靠的云原生应用。涵盖环境准备、应用开发、Dapr 集成、容器化和 Kubernetes 部署等内容。
41 5
|
28天前
|
监控 Cloud Native 持续交付
云原生架构下微服务的最佳实践与挑战####
【10月更文挑战第20天】 本文深入探讨了云原生架构在现代软件开发中的应用,特别是针对微服务设计模式的最优实践与面临的主要挑战。通过分析容器化、持续集成/持续部署(CI/CD)、服务网格等关键技术,阐述了如何高效构建、部署及运维微服务系统。同时,文章也指出了在云原生转型过程中常见的难题,如服务间的复杂通信、安全性问题以及监控与可观测性的实现,为开发者和企业提供了宝贵的策略指导和解决方案建议。 ####
46 5
|
28天前
|
Kubernetes Cloud Native 持续交付
云原生架构下的微服务设计原则与最佳实践##
在数字化转型的浪潮中,云原生技术以其高效、灵活和可扩展的特性成为企业IT架构转型的首选。本文深入探讨了云原生架构的核心理念,聚焦于微服务设计的关键原则与实施策略,旨在为开发者提供一套系统性的方法论,以应对复杂多变的业务需求和技术挑战。通过分析真实案例,揭示了如何有效利用容器化、持续集成/持续部署(CI/CD)、服务网格等关键技术,构建高性能、易维护的云原生应用。文章还强调了文化与组织变革在云原生转型过程中的重要性,为企业顺利过渡到云原生时代提供了宝贵的见解。 ##
|
1月前
|
人工智能 Cloud Native 安全
从云原生到 AI 原生,网关的发展趋势和最佳实践
本文整理自阿里云智能集团资深技术专家,云原生产品线中间件负责人谢吉宝(唐三)在云栖大会的精彩分享。讲师深入浅出的分享了软件架构演进过程中,网关所扮演的各类角色,AI 应用的流量新特征对软件架构和网关所提出的新诉求,以及基于阿里自身实践所带来的开源贡献和商业能力。
176 11
|
1月前
|
存储 运维 监控
云原生应用的可观察性:理解、实现与最佳实践
【10月更文挑战第10天】随着云原生技术的发展,可观察性成为确保应用性能和稳定性的重要因素。本文探讨了云原生应用可观察性的概念、实现方法及最佳实践,包括监控、日志记录和分布式追踪的核心组件,以及如何通过选择合适的工具和策略来提升应用的可观察性。
|
2月前
|
Cloud Native 关系型数据库 Serverless
基于阿里云函数计算(FC)x 云原生 API 网关构建生产级别 LLM Chat 应用方案最佳实践
本文带大家了解一下如何使用阿里云Serverless计算产品函数计算构建生产级别的LLM Chat应用。该最佳实践会指导大家基于开源WebChat组件LobeChat和阿里云函数计算(FC)构建企业生产级别LLM Chat应用。实现同一个WebChat中既可以支持自定义的Agent,也支持基于Ollama部署的开源模型场景。
442 16
|
3月前
|
Kubernetes 安全 Serverless
Kubernetes云原生问题之在Serverless Container中,Pod运行如何解决
Kubernetes云原生问题之在Serverless Container中,Pod运行如何解决
73 5
|
4月前
|
存储 监控 Cloud Native
kubevela可观测体系问题之KubeVela云原生时代可观测性挑战的问题如何解决
kubevela可观测体系问题之KubeVela云原生时代可观测性挑战的问题如何解决
|
5月前
|
弹性计算 监控 Cloud Native
构建多模态模型,生成主机观测指标,欢迎来战丨2024天池云原生编程挑战赛
本次比赛旨在如何通过分析 ECS 性能数据和任务信息,综合利用深度学习、序列分析等先进技术,生成特定机器的性能指标。参赛者的解决方案将为云资源管理和优化决策提供重要参考,助力云计算资源的高效稳定运行和智能化调度。
653 15
|
3月前
|
Kubernetes 监控 Shell
在K8S中,我们公司用户反应pod连接数非常多,希望看一下这些连接都是什么信息?什么状态?怎么排查?容器里面没有集成bash环境、网络工具,怎么处理?
在K8S中,我们公司用户反应pod连接数非常多,希望看一下这些连接都是什么信息?什么状态?怎么排查?容器里面没有集成bash环境、网络工具,怎么处理?
下一篇
无影云桌面