深入讲解Linux上TCP的几个内核参数调优

news2025/8/12 18:32:27

 

生产内核(production kernel):产品或者线上服务器当前运行的内核。

捕获内核(capture kernel):系统崩溃时,使用kexec启动的内核,该内核用于捕获生产内核当前内存中的运行状态和数据信息。

Kdump是系统崩溃的时候,用来转储运行内存的一个工具。系统一旦崩溃,生产内核就没法正常工作,这时Kdump启动捕获内核,将此时内存中的所有运行状态和数据信息收集到一个dump core文件中,以便之后分析崩溃原因。一旦内存信息收集完成,系统将自动重启。

Kdump的核心实现基于Kexec(Kernel execution),kexec类似于Linux的exec系统调用。

Kexec可以快速启动一个新的内核(捕获内核),它会跳过BIOS或者Bootloader等引导程序的初始化阶段,这个特性可以让系统崩溃时快速切换到捕获内核,这样生产内核的内存就得到保留,Kdump的工作流程如下图所示:

捕获内核启动后,会像一般内核一样,去运行为它创建的ramdisk上的init程序。而各种转储机制都可以事先在init中实现。

为了在生产内核崩溃时能顺利启动捕获内核,捕获内核以及它的ramdisk是事先放到生产内核的内存中的(保留内存)。

生产内核的内存是通过/proc/vmcore这个文件交给捕获内核的,为了生成它,用户工具在生产内核中分析出内存的使用和分布等情况,然后把这些信息综合起来生成一个ELF头文件保存起来。捕获内核被引导时会被同时传递这个ELF文件头的地址,通过分析它,捕获内核就可以生成出/proc/vmcore。有了/proc/vmcore这个文件,捕获内核的ramdisk中的脚本就可以通过通常的文件读写和网络来实现各种策略了。

  资料直通车:Linux内核源码技术学习路线+视频教程内核源码

学习直通车:Linux内核源码内存调优文件系统进程管理设备驱动/网络协议栈

Crash是一个用于分析内核转储文件的工具,和Kdump配套使用。Kdump会在内存中保留一块区域,这个区域用于存放捕获内核,生产内核运行过程中崩溃时,Kdump通过Kexec机制自动启动捕获内核,对生产内核的完整信息(CPU寄存器、栈帧数据等)进行保存,生产内核重启后,使用Crash工具来分析这个转储的文件。

使用对象:Linux物理机或者虚拟机;

使用场景:主要用于分析Linux系统崩溃问题;注意,在系统无法热启动的情况下,Kdump是不适用的,如硬件的异常导致CPU宕机,也就是只能通过重新关闭开启电源才能启动的情况。

本实验所使用的环境为VirtualBox+Ubuntu18.04。

Ubuntu配置的内核已经使能Kdump的支持,仅需要安装linux-crashdump包即可,运行命令如下:

sudo apt install linux-crashdump

该软件包含crash,kdump-tools,grub等相关依赖,安装中选择默认启动,如下图所示。

安装过程中会修改kernel cmdline已预留kdump转储转储内核内存空间,可以通过修改/etc/default/grub.d/kdump-tools.cfg文件修改保留内存的大小,默认为192M,如下图所示:

配置完成后更新grub(sudo update-grub),重启操作系统(reboot)。

使用kdump-config show命令查看kdump相关配置,如下图所示。

使用如下命令简单快速测试:

echo c > /proc/sysrq-trigger

如果Kdump配置正确,上述命令会让系统快速重启并且启动捕获内核进行转储,转储完成后会自动切换为生产内核,在进入生产内核的操作系统后,查看/var/crash目录中是否有根据年月日时分命名的文件夹,如下所示。

进入时间对应的目录,目录包含dmesg文件和dump文件,文件后缀为内核崩溃的时间,其中dmesg是生产内核发生崩溃时生成的内核日志信息,dump时捕获内核转储的文件,如下图所示。

打开Crash工具进行分析,Crash工具的使用方式如下:

crash [dump] [vmlinux]

Crash需要指定两个文件:

dump:转储的内核文件,通常在/var/crash目录下;

vmlinux:带调试内核符号信息的内核映像。

注意,Ubuntu系统默认不包含vmlinux文件,笔者已经对Ubuntu系统的内核进行更换,更换过程中生成带调试符号的vmlinux文件,具体步骤可以关注《话说Linux》订阅号,查看文章《Linux内核更换》。

crash启动dump文件界面如下。

9.1 help命令

help命令用于在线查看crash命令的帮助,在crash命令行中输入help命令可以查看crash支持的所有子命令。

help命令不仅可以查看crash支持的命令,还可以查看某个子命令的帮助说明,如查看bt命令的帮助说明。

9.2 bt命令

bt命令查看一个进程的内核栈的函数调用关系,包括所有异常栈的信息,常用参数如下。

  • -f:显示每一栈帧里的数据。
  • -l:显示文件名和行号。
  • -t:显示栈中所有的文本符号。
  • pid:显示指定pid的进程的内核栈的函数调用信息。

上图可以看到,bt命令将系统崩溃瞬间正在运行的进程内核栈信息全部显示出来。当前进程的id是4265,task_struct数据结构的地址是0xffff8d026b198000,当前进程运行在CPU1上,当前进程的运行命令是bash。后面的栈帧列出了该进程在内核态的调用关系,执行顺序是自下而上。

9.3 mod命令

mod命令不仅可以用来显示当前系统加载的内核模块信息,还可以用来加载某个内核模块的符号信息和调试信息等,常用参数如下。

  • -s:加载某个内核模块的符号信息。
  • -S:从某个指定目录加载所有内核模块的符号信息,默认目录是/lib/modules/目录查找并加载内核模块的符号信息。
  • -d:删除某个内核模块的符号信息。

9.4 dis命令

dis命令用来输出反汇编结果,常用参数如下。

  • -l:显示反汇编和对应源代码的行号。
  • -r:(反向)显示从例程开始到指定地址(包括指定地址)的所有指令。
  • -s:显示对应的源代码。

如输出sysrq_handle_crash()接口的反汇编结果。

以下是查看sysrq_handle_crash()接口源码的信息。

9.5 rd命令

rd命令用来读取内存地址中的值,常用参数如下。

  • -a:显示ASCII。
  • -d:显示十进制。
  • -p:读取物理地址。
  • -s:显示符号。
  • -32:显示32位宽的值。
  • -64:显示64位宽的值。

以下命令用于读0xffff8d026b198000内存中的值,并连续输出16个内存地址中的值。

9.6 struct命令

struct命令用于显示内核中数据结构的定义或者具体的值,常用的参数如下。

  • struct_name:数据结构的名称。
  • .member:数据结构的某个成员。
  • -o:显示成员在数据结构中的偏移量。

以下命令用于显示task_struct数据结构的定义。

以下命令用于显示task_struct数据结构中每个成员的偏移量。

此外,struct命令后面还可以指定一个地址,用来按照数据结构的格式显示每个成员的值,例如已知task_struct数据结构的地址为0xffff8d026b198000,因此可以通过struct命令查看该数据结构中每个成员的值。

9.7 irq命令

irq命令用于显示中断的相关信息,常用参数如下。

  • index:显示某个指定IRQ的信息。
  • -a:显示中断的亲和性。
  • -b:显示中断的下半部信息。
  • -s:显示系统中断信息。

9.8 task命令

task命令用于显示进程的task_struct数据结构和thread_info数据结构的内容。以下命令用于显示task_struct数据结构信息,其中-x表示以十六进制显示。

9.9 vm命令

vm命令用于显示进程地址空间的相关信息,常用参数如下。

  • -p:显示虚拟地址和物理地址。
  • -m:显示mm_struct数据结构。
  • -v:显示进程中所有vma(vm_area_struct)数据结构的值。
  • -R:搜索特定字符串或者数值。

以下命令用于显示当前进程的虚拟地址空间信息。

9.10 kmem命令

kmem命令用来显示系统内存信息,常用参数如下。

  • -g:显示page数据结构里flagsde标志位。
  • -i:显示系统内存使用情况。
  • -p:显示每个页面的使用情况。
  • -s:显示slab使用情况。
  • -v:显示vmalloc使用情况。
  • -z:显示没个zone使用情况。
  • -V:显示系统vm_stat情况。

9.11 sym命令

sym命令用于解析内核符号信息,常用选项如下所示。

  • -l:显示所有符号信息。
  • -m:显示某个内核模块的所有符号信息。
  • -q:查询符号信息。

以下代码用于查看oops模块的所有符号信息。

9.12 list命令

list命令用来遍历链表,并且可以输出链表成员的值,常用的参数如下。

  • -h:指定链表头的地址。
  • -s:用来输出链表成员的值。

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

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

相关文章

收藏10000+,网络安全行业应该考哪些证?

证书是网安从业者知识水平能力的一个体现,考证同时也是拓展自身知识的一个方法。事实证明,有相关证书会让你的职业生涯锦上添花。 市面上的安全证书是非常多的,从大的角度来讲可以分为国际证书和国内证书两大类,国际证书简单来…

抖店订单发货回传的实际开发笔记

目录 前言 一、订单发货接口 二、商家对接接口步骤 1.业务逻辑分析 2.业务逻辑代码 总结 前言 主要是以前有对接过抖店开放平台,所以现在想要记录一下,做一个笔记,好好归纳一下,当时对接订单发货接口,是怎么实现的…

使用pip安装模块时,提示MemoryError

在使用pip安装依赖模块时,报错如下: 解决方法: 添加 --no-cache-dir参数 pip3 --no-cache-dir install -r *** 安装时遇到的其他问题: 设置python源命令: pip3 config set global.index-url https://pypi.tuna.tsing…

老K,硬核“锅”气

把一个有社会价值的事情,经过持续地思考和行动做成第一,并产生商业价值。之前,老K是这么做的; 现在“硬科技 + Food”就是老K新的选择与坚守。 作者|皮爷 出品|产业家 最近一年,一级市场交投清淡&…

SpringMVC学习篇(十一)

SpringMVC文件上传(普通版) 1 准备工作 1.1 导入文件上传需要的依赖 <dependency><groupId>commons-fileupload</groupId><artifactId>commons-fileupload</artifactId><version>1.4</version> </dependency>1.2 在springM…

5G无线技术基础自学系列 | 物理下行共享信道

素材来源&#xff1a;《5G无线网络优化实践》 一边学习一边整理内容&#xff0c;并与大家分享&#xff0c;侵权即删&#xff0c;谢谢支持&#xff01; 附上汇总贴&#xff1a;5G无线技术基础自学系列 | 汇总_COCOgsta的博客-CSDN博客 NR PDSCH采用OFDM符号调制方式&#xff0…

构建有效和安全的远程工作模式

IDSA的一项研究发现&#xff0c;79%的企业遭受了与身份相关的违规行为。在 ManageEngine&#xff0c;我们了解身份对企业组织的整体安全状况的重要性。在这个身份安全周&#xff0c;我们准备了一系列文章来传播身份安全重要性以及哪些简单措施可以帮助提高企业组织对身份安全的…

【node进阶】深入浅出websocket即时通讯(一)

✅ 作者简介&#xff1a;一名普通本科大三的学生&#xff0c;致力于提高前端开发能力 ✨ 个人主页&#xff1a;前端小白在前进的主页 &#x1f525; 系列专栏 &#xff1a; node.js学习专栏 ⭐️ 个人社区 : 个人交流社区 &#x1f340; 学习格言: ☀️ 打不倒你的会使你更强&a…

游戏黑卡代充36技术及库存系统案例分析

黑卡充值常隐匿于「代充」服务中&#xff0c;且形式多变&#xff0c;从外币汇率差、退款到36漏洞、黑卡/盗刷信用卡充值&#xff0c;甚至还出现了专门的库存系统。 「36漏洞」是利用iOS小额支付漏洞实现的刷单套利业务。苹果为提高用户体验&#xff0c;在 APP Store 购买商品时…

【Hack The Box】linux练习-- Sunday

HTB 学习笔记 【Hack The Box】linux练习-- Sunday &#x1f525;系列专栏&#xff1a;Hack The Box &#x1f389;欢迎关注&#x1f50e;点赞&#x1f44d;收藏⭐️留言&#x1f4dd; &#x1f4c6;首发时间&#xff1a;&#x1f334;2022年11月17日&#x1f334; &#x1f3…

电容笔用什么品牌?电容笔10大品牌排行榜

尽管苹果公司的原装电容笔使用起来非常的流畅&#xff0c;非常的方便&#xff0c;但是它的价格却非常昂贵&#xff0c;这让很多学生党望而却步&#xff0c;还有这款电容笔的重量也不轻&#xff0c;长时间使用手会感觉疲劳。如果是来学习的&#xff0c;那就未必买如此贵的电容笔…

Java抽象类(abstract)

抽象类 当父类的某些方法&#xff0c;需要声明&#xff0c;但是又不确定如何实现时&#xff0c;可以将其声明为抽象方法&#xff0c;那么这个类就是抽象类 1)用abstract关键字来修饰一个类时,这个类就叫抽象类 访问修饰符 abstract 类名 {}2)用abstract关键宇来修饰一个方法时…

C. Division(分解质因数)

Problem - 1445C - Codeforces 奥列格最喜欢的科目是历史和数学&#xff0c;而他最喜欢的数学分支是除法。 为了提高他的除法技巧&#xff0c;奥列格想出了t对整数pi和qi&#xff0c;并决定为每对整数找到最大的整数xi&#xff0c;这样。 pi能被xi整除。 xi不能被qi整除。 奥…

基于NodeJs+Express+MySQL 实现的个人博客完整项目

目录 一、创建项目并初始化 项目结构 二、安装项目所需要的包 三、创建所需要的数据库表 表 user 用于存放账户密码 表 notepad 用于存放文章数据 表 leaving 用于存放留言板的数据 三、编写app.js文件 1、导入所有需要的包 2、创建web服务器 3、创建db文件夹&#…

智能制造APS,赋能「钣金行业」提升数字化战斗力!

导语&#xff1a; 钣金加工是典型的离散制造行业&#xff0c;具有品种多、批量小、交期短、质量要求高的发展趋势&#xff0c;这对钣金车间的生产管理提出了新的挑战。推进行业数字化、智能化改造&#xff0c;实现质效双提升&#xff0c;打破增长瓶颈&#xff0c;成为钣金行业…

Git常用命令与分支管理

Git常用的命令有以下6个&#xff1a;fetch/clone命令&#xff0c;add命令&#xff0c;commit命令&#xff0c;checkout命令&#xff0c;push命令&#xff0c;pull命令。 workspace&#xff1a;工作区staging area&#xff1a;暂存区loacl repository&#xff1a;本地仓库remot…

计算机毕业设计springboot+vue+elementUI会员制医疗预约服务管理信息系统

项目介绍 会员制医疗预约服务管理信息系统是针对会员制医疗预约服务管理方面必不可少的一个部分。在会员制医疗预约服务管理的整个过程中&#xff0c;会员制医疗预约服务管理系统担负着最重要的角色。为满足如今日益复杂的管理需求&#xff0c;各类的管理系统也在不断改进 本系…

字节面试问到CPU的多级缓存架构,诸佬们怎么回答?

前言&#xff1a;大家好&#xff0c;我是小威&#xff0c;24届毕业生&#xff0c;上周在面试字节中&#xff0c;问到了一个关于CPU多级缓存架构的问题&#xff0c;当时答得并不是很好&#xff0c;之后查阅了资料&#xff0c;对此进行了复盘总结。 如果文章有什么需要改进的地方…

全网最详细SpringBoot、SpringCloud整合阿里云OSS对象存储服务

1、进入阿里云官网 https://www.aliyun.com/ 2、搜索“对象存储OSS” 3、进入“管理控制台” 4、进入“Bucket列表”&#xff0c;点击“创建Bucket” 5、根据实际情况选择&#xff0c;最后点击“确定” 这里插入一个可以通过代码创建Bucket的测试类&#xff0c;如下&#xff…

什么是供应商管理?为什么它很重要?

**供应商管理**是确保企业付给供应商的钱获得最大价值的过程&#xff0c;且目标是确保与供应商签订的所有合同都能满足企业业务的需求。 乍一看&#xff0c;供应商管理似乎是一件很容易总结的事情&#xff0c;建立适当的关系&#xff0c;管理需求&#xff0c;并与供应商进行清…