【银河麒麟高级服务器操作系统实例】tcp_mem分析处理全过程内核参数调优参考

news2024/11/16 17:52:10

了解更多银河麒麟操作系统全新产品,请点击访问

麒麟软件产品专区:https://product.kylinos.cn

开发者专区:https://developer.kylinos.cn

文档中心:https://documentkylinos.cn

现象描述

系统中出现大量的TCP: out of memory -- consider tuning tcp_mem的报错,同时有多次call trace 产生。

根据提示 查询内核参数,net.ipv4.tcp_mem = 25401 33869 50802 值的很小,出现此问题时,cpu负载很高,tcp连接断续,请求处理不及时。

现象分析

tcp_mem报错分析

查看前线收集的sosreport日志,对于频繁出现TCP: out of memory -- consider tuning tcp_mem的错误,通常表明系统TCP缓冲区已满,无法继续申请对应的缓存。

net.ipv4_tcp_mem和业务需求不符,对这种情况我们通常会调整其数值。但对当前问题我们发现了一个异常的地方,net.ipv4_tcp_mem的数值在不手动设定的情况下系统初始化是和机器总内存大小相关的,查看本机内存大小为128G,对比上述的tcp_mem的数值明显不符。

继续查看系统内核版本,发现为SP2-4.19.90-24.4内核,该版本内核存在内存managed统计错位这一已知问题,该问题会造成系统内存碎片化、容易触发OOM、tcp_mem初始化异常等故障,下面我们详细进行说明。

 内存managed统计错位bug说明

银河麒麟服务器系统内核基于openeuler内核开发,而openeuler内核在优化内存时引入了一个bug(commit eb761d6521c32c006a4987260394a61c6684fb35: mm: parallelize deferred struct page initialization within each node),该bug会导致zone的managed_pages统计出现错位。

具体查看系统的/proc/zoneinfo我们可以发现Node 0 Normal区域的managed出现统计异常,其managed远小于spanned、present;而Node 0 Movable区域这个本不该管理内存的区域managed异常的大,对应的内存回收水位也极高。其余几个Node的情况也是如此,这就是上述BUG导致的managed_pages统计出现错位的问题了。

而zone的managed_pages统计出现错位会进一步造成其他影响,一是影响各个zone的内存回收水位的计算,因为内存回收水位是按照各个zone managed_pages的比例来分配的,zone Normal原本管理的内存被统计到zone Movable后,可以看到其内存回收水位min/low/high变成了27/59/91这个极小的值,这又影响了后续系统的内存回收。linux系统的内存回收是当对应zone的剩余内存低于low水位被触发,直至回收到high水位停止,这么小的内存回收水位将导致即使触发内存回收也回收不了多少内存就停止了,高压力下zone Normal将始终保持在一个几乎没有空闲内存可以使用的情况。

二是net.ipv4.tcp_mem的初始化也是只考虑DMA/DMA32/Normal三个区域的managed内存和high水位情况,net.ipv4.tcp_mem等于这三个区域的(managed-high)/16/4*3。和上面的情况类似,zone Normal原本管理的内存被统计到zone Movable后,系统的net.ipv4.tcp_mem初始化数值也将变得异常的低。这也就使得后续有大量tcp链接时,tcp_mem不足、无法分配内存,使得tcp链接的稳定性受到影响。

对于这个bug目前麒麟软件及openeuler都已在官网发布了内核修复公告,银河麒麟操作系统内核在SP1 23.30、SP2 25.22版本得到修复,SP3内核不存在这个BUG。

call trace报错分析

问题发生时,系统日志中除了除了有大量的TCP: out of memory -- consider tuning tcp_mem的报错,同时有多次call trace 产生。

通过整理这些call trace日志我们发现日志集中出现,所有call trace日志打印都是hung_task_timeout_secs 120s超时触发的。

查看这些call trace日志的内容如下所示:

根据上述信息,我们可以发现这些call trace都是nfs模块相关处理中触发的,从堆栈信息来看此时服务器CPU正在处理nfs相关任务,如nfs_updatepage(nfs数据更新)、nfs_file_write(nfs文件写操作)、nfs_flush_incompatible(nfs缓存处理)、nfs_check_verifier(nfs数据完整性验证)等,但上述任务由于长时间处于bit_wait_io、io_schedule这些I/O等待状态中未完成,直到触发hung_task 120S超时便打印的相关日志。

综合当前系统的业务情况,其kubelet pod使用了大量nfs存储,问题时间点系统tcp_mem耗尽,这导致pod与nfs存储的tcp通信出现问题,大量nfs相关任务超时从而在日志中打印了call trace日志。

sa日志分析

继续查看sa日志,首先关注CPU使用情况,我们发现系统%iowait开始上升,结合之前的message日志分析,这应该是由于大规模的NFS文件系统操作延时导致。

再看NFS客户端请求数据,NFS客户端RPC请求数突然开始大幅度上升,这应该就是导致系统tcp_mem耗尽的原因,大量tcp缓存被用于维持nfs链接。

直到系统tcp_mem耗尽,系统无法处理新的tcp链接,已有的tcp链接也会因为内存压力不得不频繁地回收和重新分配内存。NFS客户端RPC请求数开始迅速下降,直到40分钟后才恢复正常。

总结

综上所述,本次tcp_mem异常报错问题产生的原因为当前使用的低版本内核存在的managed_pages统计出现错位的bug。该bug导致Zone Normal原本管理的内存被统计到Zone Movable,而net.ipv4.tcp_mem的初始化只考虑DMA/DMA32/Normal三个区域的managed内存和high水位情况,net.ipv4.tcp_mem等于这三个区域的(managed-high)/16/4*3,因此最终系统net.ipv4.tcp_mem的初始化值会偏小。

net.ipv4.tcp_mem数值较小,在网络压力较大时会出现tcp缓存耗尽的情况。这将导致系统无法处理新的tcp链接,已有的tcp链接也会因为内存压力不得不频繁地回收和重新分配内存,这将影响系统的业务性能和稳定性。对此我们建议升级内核修复相关内核bug,若当前情况不方便升级内核建议手动调整对应内核参数。

备注:内核参数调优参考

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2143874.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Mina protocol - 体验教程

Mina protocol - 体验教程 一、零知识证明( Zero Knowledge Proof )1、零知识证明(ZKP)的基本流程工作流程: 2、zkApp 的优势:3、zkApp 每个方法的编译过程: 二、搭建第一个zkapp先决条件1、下载或者更新 zkApp CLI​2…

基于Springboot美食推荐小程序的设计与实现(源码+数据库+文档)

一.项目介绍 pc端: 支持用户、餐厅老板注册 支持管理员、餐厅老板登录 管理员: 管理员模块维护、 餐厅管理模块维护、 用户管理模块维护、 商品管…

Qt:NULL与nullptr的区别(手写nullptr)

前言 发现还是有人不知道NULL 与nullptr的区别,故写此文章。 正文 对于NULL 先看NULL的源码 我们可以看出这段代码是一个典型的预处理器宏定义块,用于处理 NULL 宏的定义。 先看开头 #if defined (_STDDEF_H) || defined (__need_NULL)这行代码检…

git报错,error: bad signature 0x00000000fatal: index file corrupt

报错 git -c diff.mnemonicprefixfalse -c core.quotepathfalse --no-optional-locks checkout daily --progress error: bad signature 0x00000000 fatal: index file corrupt 原因 git 仓库中索引文损坏 处理 1.该备份的先备份 2.删除索引并重置 rm -f .git/index git r…

医学数据分析实训 项目五 分类分析--乳腺癌数据分析与诊断

文章目录 项目六:分类分析实践目的实践平台实践内容(一)数据理解及准备(二)模型建立、预测及优化任务一:使用 KNN算法进行分类预测任务二:使用贝叶斯分类算法进行分类预测任务三:使用…

Linux基础3-基础工具4(git,冯诺依曼计算机体系结构)

上篇文章:Linux基础3-基础工具3(make,makefile,gdb详解)-CSDN博客 本章重点: 1. git简易使用 2. 冯诺依曼计算机体系结构介绍 一. git使用 1.1 什么是git? git是用于管理代码版本的一种工具,我们在如GitHub&#xf…

C++ | (二)类与对象(上)

燕子去了,有再来的时候;杨柳枯了,有再青的时候;桃花谢了,有再开的时候。但是,聪明的,你告诉我,我们的假期为什么一去不复返呢? 目录 一、初识类 1.1 类的定义 1.2 C中…

面试真题-TCP的三次握手

TCP的基础知识 TCP头部 面试题:TCP的头部是多大? TCP(传输控制协议)的头部通常是固定的20个字节长,但是根据TCP选项(Options)的不同,这个长度可以扩展。TCP头部包含了许多关键的字…

depcheck 检查项目中依赖的使用情况 避免幽灵依赖的产生

depcheck 检查项目中依赖的使用情况 避免幽灵依赖的产生 什么是幽灵依赖 (幻影依赖) 形成原因 幽灵依赖是指node_modules中存在 而package.json中没有声明过的依赖 但却能够在项目的依赖树中找到并使用的模块 Node.js 的模块解析规则: Node.js 采用了一种非传统的模…

C++速通LeetCode简单第20题-多数元素

方法一&#xff1a;暴力解法&#xff0c;放multiset中排序&#xff0c;然后依次count统计&#xff0c;不满足条件的值erase清除。 class Solution { public:int majorityElement(vector<int>& nums) {int ans 0;multiset<int> s;for(int i 0;i < nums.s…

「iOS」viewController的生命周期

iOS学习 ViewController生命周期有关方法案例注意 ViewController生命周期有关方法 init - 初始化程序&#xff1b;loadView - 在UIViewController对象的view被访问且为空的时候调用&#xff1b;viewDidLoad - 视图加载完成后调用&#xff1b;viewWillAppear - UIViewControll…

给大模型技术从业者的建议,入门转行必看!!

01—大模型技术学习建议‍‍‍ 这个关于学习大模型技术的建议&#xff0c;也可以说是一个学习技术的方法论。 首先大家要明白一点——(任何)技术都是一个更偏向于实践的东西&#xff0c;具体来说就是学习技术实践要大于理论&#xff0c;要以实践为主理论为辅&#xff0c;而不…

换个手机IP地址是不是不一样?

在当今这个信息爆炸的时代&#xff0c;手机已经成为我们生活中不可或缺的一部分。而IP地址&#xff0c;作为手机连接网络的桥梁&#xff0c;也时常引起我们的关注。你是否曾经好奇&#xff0c;换个手机&#xff0c;IP地址会不会也跟着变呢&#xff1f;本文将深入探讨这个问题&a…

Android15之编译Cuttlefish模拟器(二百三十一)

简介&#xff1a; CSDN博客专家、《Android系统多媒体进阶实战》一书作者 新书发布&#xff1a;《Android系统多媒体进阶实战》&#x1f680; 优质专栏&#xff1a; Audio工程师进阶系列【原创干货持续更新中……】&#x1f680; 优质专栏&#xff1a; 多媒体系统工程师系列【…

直流斩波电路

目录 1. 降压斩波电路&#xff08;Buck Converter&#xff09; 2. 升压斩波电路&#xff08;Boost Converter&#xff09; 3. 升降压斩波电路&#xff08;Buck-Boost Converter&#xff09; 4. Cuk斩波电路&#xff08;Cuk Converter&#xff09; 直流斩波电路是一种将直流…

Unity3D下如何播放RTSP流?

技术背景 在Unity3D中直接播放RTSP&#xff08;Real Time Streaming Protocol&#xff09;流并不直接支持&#xff0c;因为Unity的内置多媒体组件&#xff08;如AudioSource和VideoPlayer&#xff09;主要设计用于处理本地文件或HTTP流&#xff0c;而不直接支持RTSP。所以&…

上海人工智能实验室开源视频生成模型Vchitect 2.0 可生成20秒高清视频

上海人工智能实验室日前推出的Vchitect2.0视频生成模型正在悄然改变视频创作的游戏规则。这款尖端AI工具不仅简化了视频制作流程&#xff0c;还为创作者提供了前所未有的灵活性和高质量输出。 Vchitect2.0的核心优势在于其强大的生成能力和高度的可定制性。用户只需输入文字描…

用Matlab求解绘制2D散点(x y)数据的最小外接圆、沿轴外接矩形

用Matlab求解绘制2D散点&#xff08;x y&#xff09;数据的最小外接圆、沿轴外接矩形 0 引言1 原理概述即代码实现1.1 最小外接圆1.2 沿轴外接矩形 2 完整代码3 结语 0 引言 本篇简单介绍下散点数据最小外接圆、沿轴外接矩形的简单原理和matlab实现过程。 1 原理概述即代码实现…

C语言-数据结构 有向图拓扑排序TopologicalSort(邻接表存储)

拓扑排序算法的实现还是比较简单的&#xff0c;我们需要用到一个顺序栈辅助&#xff0c;采用邻接表进行存储&#xff0c;顶点结点存储入度、顶点信息、指向邻接结点的指针&#xff0c;算法过程是&#xff1a;我们先将入度为0的顶点入栈&#xff0c;然后弹出栈顶结点&#xff0c…

使用CUBE_MX使用I2C通信,实现对EEPROM的读写

一、使用CUBE_MX配置 1.配置I2C 2.配置USART1 3.重中之重(在KEIL5打开串口使用的库) 二、KEIL5配置 #include "main.h" #include "i2c.h" #include "gpio.h" #include "usart.h"#include <stdio.h>void SystemClock_Config(vo…