- ubuntu12.04环境下使用kvm ioctl接口实现最简单的虚拟机
- Ubuntu 通过无线网络安装Ubuntu Server启动系统后连接无线网络的方法
- 在Ubuntu上搭建网桥的方法
- ubuntu 虚拟机上网方式及相关配置详解
CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界.
这篇CFSDN的博客文章一次内核问题引起的 Kubernetes 节点故障解决纪实由作者收集整理,如果你对这篇文章有兴趣,记得点赞哟.
在线上环境中的某个应用出现了接口缓慢的问题!.
就凭这个现象, 能列出来的原因数不胜数. 本篇博客主要叙述一下几次排查以及最后如何确定原因的过程, 可能不一定适用于其他集群, 就当是提供一个参考吧. 排查过程比较冗长, 过去太久了, 我也不太可能回忆出所有细节, 希望大家见谅. 。
网络请求流入集群时, 对于我们集群的结构
不要问为什么有了 Ingress 还有 Nginx. 这是历史原因, 有些工作暂时需要由 Nginx 承担. 。
请求变慢一般马上就会考虑, 程序是不是变慢了, 所以在发现问题后, 首先在 uwsgi 中增加 简单的小接口, 这个接口是处理快并且马上返回数据, 然后定时请求该接口. 在运行几天之后, 确认到该接口的访问速度也很慢, 排除程序中的问题, 准备在链路中查找原因. 。
由于我们的 Nginx 有 2 层, 需要针对它们分别确认, 看看究竟是哪一层慢了. 请求量是比较大的, 如果针对每个请求去查看, 效率不高, 而且有可能掩盖真正原因, 所以这个过程采用统计的方式. 统计的方式是分别查看两层 Nginx 的日志情况. 由于我们已经在 elk 上接入了日志. elk 中筛选数据的脚本简单如下
根据 trace_id 可以获取到 Nignx 日志以及 Ingress 日志, 通过 elk 的 api 获得. 。
我分别针对 request_time(nginx) , request_time(ingress) , 以及 requet_time(nginx) - request_time(ingress) ,做了统计. 。
最后的统计结果大概如下
我们总共有约 3000 条数据.
从图 1 图 2 结合来看, 部分请求在 Ingress 侧处理的时间其实比较短的.
从统计结果来看, Nginx => Ingress 以及 Ingress => upstream, 都存在不同程度的延迟, 超过 1s 的应用, 大约有 2/3 的延迟来自 Ingress=>upstream, 1/3 的延迟来自 Nginx=>Ingress. 。
抓包调查主要针对 Ingress=>uwsgi , 由于数据包延迟的情况只是偶发性现象, 所以需要抓取所有的数据包再进行过滤… 这是一条请求时间较长的数据, 本身这个接口返回应该很快. 。
Ingress侧数据包 。
uwsgi侧数据包 。
回顾一下TCP三次握手
首先从Ingress侧查看, 连接在21.585446开始, 22.588023时, 进行了数据包重新发送的操作.
从Node侧查看, node在ingress数据包发出后不久马上就收到了syn, 也立刻进行了syn的返回, 但是不知为何1s后才出现在ingress处.
有一点比较令人在意, 即便是数据包发生了重传, 但是也没有出现丢包的问题, 从两台机器数据包的流转来看, 此次请求中, 大部分的时间是因为数据包的延迟到达造成的, 重传只是表面现象, 真正的问题是发生了数据包的延迟. 。
从随机抓包的情况来看, 不止是 SYN ACK 发生了重传
有些 FIN ACK 也会, 数据包的延迟是有概率的行为!!.
单单看这个抓包可能只能确认是发生了丢包, 但是如果结合Ingress与Nginx的日志请求来看, 如果丢包发生在tcp连接阶段, 那么在Ingress中, 我们就可以查看 upstream_connect_time 这个值来大致估计下超时情况. 当时是这么整理的记录
我初步猜测这部分时间主要消耗在了 TCP 连接建立时, 因为建立连接的操作在两次 Nginx 转发时都存在, 而我们的链路全部使用了短连接, 下一步我准备增加 $upstream_connect_time 变量, 记录建立连接花费的时间. http://nginx.org/en/docs/http/ngx_http_upstream_module.html 。
既然可以了解到tcp连接的建立时间比较久, 我们可以用它来作为一个衡量指标, 我把wrk也修改了下, 增加了对于连接时间的测量, 具体的PR见这里(https://github.com/wg/wrk/pull/447), 我们可以利用这一项指标衡量后端的服务情况. 。
上面的工作前前后后我进行了几次, 也没有什么头绪, 遂找到公司的其他K8S大佬咨询问题, 大佬提供了一个思路
宿主机延迟也高的话,那就暂时排除宿主机到容器这条路径。我们这边此前排查过一个延迟问题, 是由于 k8s 的监控工具定期 cat proc 系统下的 cgroup 统计信息, 但由于 docker 频繁销毁重建以及内核 cache 机制,使得每次 cat 时间很长占用内核导致网络延迟, 可否排查一下你们的宿主机是否有类似情形?不一定是 cgroup,其他需要频繁陷入到内核的操作都可能导致延迟很高 。
这个跟我们排查的 cgroup 太像了,宿主机上有一些周期性任务,随着执行次数增多,占用的内核资源越来越多,达到一定程度就影响了网络延迟 。
大佬们也提供了一个内核检查工具(可以追踪和定位中断或者软中断关闭的时间)
https://github.com/bytedance/trace-irqoff 。
有问题的ingress机器 的latency特别多,好多都是这样的报错, 其他机器没有这个日志
而后, 我针对机器中的kubelet进行了一次追踪, 从火焰图中可以确认, 大量的时间耗费在了读取内核信息中.
其中具体的代码如下
根据大佬所给的方向, 基本能够确定问题发生的真正原因: 机器上定时任务的执行过多, 内核缓存一直增加, 导致内核速度变慢了. 它一变慢, 引发了tcp握手时间变长, 最后造成用户体验下降. 既然发现了问题, 解决方案也比较容易搜索到了, 增加任务, 检查内核是否变慢, 慢了的话就清理一次
这次的排查过程是由于应用层出现了影响用户体验的问题后, 进一步延伸到了网络层, 其中经历了漫长的抓包过程, 也增加了自己的脚本用于指标衡量, 随后又通过内核工具定位到了具体应用, 最后再根据应用的 pprof 工具制作出的火焰图定位到了更加精确的异常位置, 期间自己一个人没法处理问题, 遂请其他大佬来帮忙, 大佬们见多识广, 可以给出一些可能性的猜想, 还是很有帮助的. 。
当你发现某台机器无论做什么都慢, 而cpu和内核却不是瓶颈的时候, 那有可能是内核慢了. 。
希望本文能对大家未来排查集群问题时有所帮助. 。
本文转载自:「k8s技术圈」,原文:https://tinyurl.com/y5wx3m5x,版权归原作者所有.
最后此篇关于一次内核问题引起的 Kubernetes 节点故障解决纪实的文章就讲到这里了,如果你想了解更多关于一次内核问题引起的 Kubernetes 节点故障解决纪实的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
有人可以解释一下为什么这个脚本不起作用吗? function destroy(ID) { if (confirm("Deleting is a very bad thing! Sure?")
我正在尝试使 WCF Silverlight 故障按此方式工作: MSDN aricle 将 SL 故障添加到我的 Web.config 文件后,我收到以下警告: The element 'behav
这是我要删除的 Haskell 函数 2::Int和 5::Int从列表中: remPrimesFactors25 :: [Int] -> [Int] remPrimesFactors25 [] =
当我想用 ffmpeg 连接和录制两个 mp4 视频时,我遇到了这个问题。我得到的输出是: [concat @ 0x2566e80] DTS 4079 #0:0 (h264 (native) ->
我想在delphi中编写一个程序来模拟以特定速度移动的鼠标指针(类似于AutoIT MouseMove函数)。要么是我的代码错误,要么是 SetCursorPos 在被调用太多次后出现故障。这是我的功
我将“wa、or 和 id”(来自这些州的访问者)设置为重定向到 website1.com - 当我访问该网站时,它会将我重定向到 website1.com(因此它知道我在 WA) 。但如果我将 wa
我们目前正在争论通过 WCF channel 抛出错误与传递指示状态或服务响应的消息是否更好。 故障带有 WCF 的内置支持,您可以使用内置的错误处理程序并做出相应的 react 。然而,这会带来开销
不确定我在这里做错了什么,如果有任何帮助,我们将不胜感激。 尝试创建一个名为“control”的新变量,并在行变量等于这些数字时将其编码为 1,否则编码为 0。 data$control= ifels
我想在应用洞察中记录成功调用的百分比。我看到这篇文章https://learn.microsoft.com/en-us/azure/azure-monitor/app/sampling我认为固定速率采
我正在尝试使用 SVD 和特征分解来使用动态模式分解进行一些数据分析。我遇到了一个简单的问题,即从 Matlab 和 Python 获得不同的结果。我很困惑,不知道为什么 Python 给我错误的结果
This question already has an answer here: mysqli_fetch_assoc() expects parameter / Call to a member
我刚刚开始我的一个实验室,在那里我计算类(class)的 GPA,其信息存储在结构的链接列表中。截至目前,我正在尝试打印所有类(class)信息,以确保它们已正确初始化并添加到链接列表中。 我遇到了一
我正在尝试学习如何使用 visual studio 为 C++ 制作 GUI。但是我在使用 GetWindowText() 函数时遇到了一些问题。它不会将 LPTSTR 标题更改为文本框中的文本,并且
我有一个奇怪的问题。它似乎只出现在测试者的 iPhone 5s 上。它可以在运行最新 iOS (8.3) 的 iPhone 5、6 和 6 plus 上正常运行。 这是代码 -(NSString *)
我正在尝试更新 Core Data 中的一些记录。我正在采取以下步骤来完成它 带谓词的获取函数从核心数据中检索记录 将结果集存储在对象数组中 遍历数组并更新每条记录 调用保存上下文 我遇到了两个问题
我通过 Storyboard设计了 tableView,在一个单元格中我有一个按钮和一个标签。按钮在 Storyboard上有标签 1 和标签在 Storyboard上有标签 2。在 cellForR
我实现了这个方法,当在文本字段中输入了未经授权的字符或已使用的用户名时,向用户发送多个警报 View : func textFieldShouldEndEditing(textField: UITex
伙计们,我在运行程序时遇到了这个非常奇怪的错误。这是重要的代码: 变量(编辑): const short int maxX = 100; const short int maxZ = 100; con
我有这个修改过的 Matrix Javascript 代码,我想摆脱第一次运行的所有与自身重叠的字符串。有人知道我该如何管理吗?另外,我想在我的网页上多次使用此代码,我需要声明新变量,不是吗?但是当我
有谁知道是否有网站(甚至非 Microsoft)有关于 COMExceptions/HRESULTS 的详细信息。 当我尝试在使用 Copy() 函数后保存我的 Excel 工作簿时,我收到此错误:
我是一名优秀的程序员,十分优秀!