在这个过程中内核线程ksoftirqd起到了至关重要的作用。 下面附上高清大图。...ksoftirqd在接收traffic时非常重要 其实不单从veth接收数据包会涉及到ksoftirqd,普通的物理网卡、loopback虚拟网卡的数据包接收都会涉及到这个内核线程。...借助这张图,我想应该可以比较形象地阐述这个观点:如果iptables设置得非常多的话,会导致ksoftirqd/4处理每一个skb的时间变长,进而使得它消费RingBuffer的速度变慢,对外的表现就是机器的吞吐量上不去...ksoftirqd在发送数据时也非常重要 ksoftirqd在数据包发送的时候也非常的重要。发送过程二哥没有画图,我借助一张别人的图来给大家看一下ksoftirqd在数据包发送过程中所扮演的重要角色。...当skb被放到队列后,这个线程触发了软中断,接下来就由ksoftirqd负责后续的数据发送过程。
知其然,更要知其所以然, ksoftirqd 进程会导致 CVM CPU 99%,背后的凶手是谁,让我们逐步揭开这个面纱。 业务表现:API请求变慢,影响用户访问。...现状 业务请求慢,首先查看对应服务器的资源占用情况,发现 ksoftirqd/0 进程 CPU 使用率为99.2%,是什么原因导致的呢?...ksoftirqd/0进程是一个内核线程,它负责处理第一个CPU(CPU0)上的软中断。当ksoftirqd/0的CPU使用率异常高时(在这个案例中为99.2%),通常意味着系统正在处理大量的软中断。...以下是一些排查ksoftirqd/0高CPU使用率的步骤: 检查网络流量:首先应该检查服务器是否正在处理大量的网络流量。可以使用iftop、nload或iptraf等工具来监控网络流量。...寻求专家帮助:如果以上步骤都无法确定问题所在,可能需要寻求Linux系统专家的帮助,他们可以提供更深入的系统分析和故障排除服务。 开始分析 iptraf - 交互式彩色界面的网络监控工具。
由于ksoftirqd/0是linux内核进程,因此必须使用readlink /proc/[pid]/exe来分辨出伪装的恶意进程,避免误杀 [root@ecs tmp]# readlink /proc.../0] ├─19411 [ksoftirqd/0] ├─19412 [ksoftirqd/0] └─25480 [ksoftirqd/0] 清理掉所有守护进程并删除configs.conf木马文件后,继续观察半小时...-5.15.10/bin linux_amd 18034 root rtd DIR 253,1 4096 2 / linux_amd 18034 root...txt REG 253,17 5398528 6816523 /mnt/server/activemq-5.15.10/bin/linux_amd64 (deleted) linux_amd...] linux_amd 18034 root 5r FIFO 0,9 0t0 261080142 pipe linux_amd 18034 root 6w
好了,大概了解了网卡驱动、硬中断、软中断和ksoftirqd线程之后,我们在这几个概念的基础上给出一个内核收包的路径示意: 图2 Linux内核网络收包总览 当网卡上收到数据以后,Linux中第一个工作的模块是网络驱动...2.1 创建ksoftirqd内核线程 Linux的软中断都是在专门的内核线程(ksoftirqd)中进行的,因此我们非常有必要看一下这些进程是怎么初始化的,这样我们才能在后面更准确地了解收包过程。...); 当ksoftirqd被创建出来以后,它就会进入自己的线程循环函数ksoftirqd_should_run和run_ksoftirqd了。...3.2 ksoftirqd内核线程处理软中断 图9 ksoftirqd内核线程 内核线程初始化的时候,我们介绍了ksoftirqd中两个线程函数ksoftirqd_should_run和run_ksoftirqd...五 总结 网络模块是Linux内核中最复杂的模块了,看起来一个简简单单的收包过程就涉及到许多内核组件之间的交互,如网卡驱动、协议栈,内核ksoftirqd线程等。
软中断和实时性 翻译自:Software interrupts and realtime Linux内核的软中断("softirq")机制有些奇怪,在早期的Linux和处理机制下比较晦涩,且仅有极少的内核开发人员会直接接触软中断...在很早以前,Linux存在32个硬中断向量,并为每个向量分配一个设备驱动或相关的任务。...,后续由ksoftirqd 进程处理软中断。...Ksoftirqd 可以被(硬件或软件)中断上下文之外的软中断打断,这种处理是必要的,否则Ksoftirqd 在处理下一个软中断前可以运行任意时间。...参考: Linux中断 - softirq
Linux 2.4以后的内核版本采用的下半部实现方式是软中断,由ksoftirqd内核线程全权处理。...4.1 创建ksoftirqd内核线程 Linux的软中断都是在专门的内核线程(ksoftirqd)中进行的,因此我们非常有必要看一下这些进程是怎么初始化的,这样我们才能在后面更准确地了解收包过程。...5.2 ksoftirqd内核线程处理软中断 ksoftirqd内核线程: 内核线程初始化的时候,我们介绍了ksoftirqd中两个线程函数ksoftirqd_should_run和run_ksoftirqd...首先在开始收包之前,操作系统要做许多的准备工作(以Linux为例): 1)创建ksoftirqd线程,为它设置好它自己的线程函数,后面指望着它来处理软中断呢; 2)协议栈注册,linux要实现许多协议,...理解了整个收包过程以后,我们就能明确知道Linux收一个包的CPU开销了: 1)首先第一块是用户进程调用系统调用陷入内核态的开销; 2)其次第二块是CPU响应包的硬中断的CPU开销; 3)接着第三块是ksoftirqd
场景 最新发现linux服务器一直很卡,导致无法编译和其它相关操作。 排查分析 经top 查看原来是一个叫269 的进程一直抢占CPU,占比高达4000%。...8 root 20 0 0 0 0 S 0.0 0.0 0:00.00 ksoftirqd...17 root 20 0 0 0 0 S 0.0 0.0 0:00.00 ksoftirqd...安装深信服软件 1、点击下载安装文件,或执行下载命令wget –no-check-certificate https://11.10.105.30:443/download_installer_linux.php...-O linux_edr_installer.tar.gz进行下载 2、将安装包拷贝至终端 3、在终端解压安装包 tar -xzvf linux_edr_installer.tar.gz 4、执行命令
.store = &ksoftirqd, .thread_should_run = ksoftirqd_should_run,....thread_fn = run_ksoftirqd, .thread_comm = "ksoftirqd/%u", }; spawn_ksoftirqd...->for_each_online_cpu(cpu) { //每个cpu创建一个ksoftirqd __smpboot_create_thread(plug_thread, cpu)...内核模块代码:kthread_demo.c #include #include #include #include... #include static struct task_struct *tsk; static int kthread_fn(
【提示】:在linux操作系统中,一般有以下5种状态的进程信息:D:不可中断睡眠态(通常出现在IO阻塞)、R:运行态、S:睡眠态、T:已停止、z:僵尸态 第三行:%Cpu(s): 0.1 us, 0.0...si:Linux kernel通过用一种软件的方法(可延迟函数)来模拟硬件的中断模式,通常叫做软中断。常见的软件中断一般都是和网络有关。...当软中断出现瓶颈的时候,系统有个进行叫ksoftirqd,每个CPU都有自己对应的ksoftirqd/n(n为CPU的逻辑ID),每个ksoftirqd的内核线程都会去运行对应的ksoftirqd(函数...所以,当网络出现阻塞的时候,软件中断程序ksoftirqd肯定会出现瓶颈。此时我们可以通过ps aux|grep ksoftirqd查看ksoftirqd的瓶颈。
网络启动的准备工作 首先在开始收包之前,Linux要做许多的准备工作: 1.创建ksoftirqd线程,为它设置好它自己的线程函数,后面就指望着它来处理软中断呢。...在这个初始化过程中,把自己的DMA准备好,把NAPI的poll函数地址告诉内核 4.启动网卡,分配RX,TX队列,注册中断对应的处理函数 创建ksoftirqd内核线程 Linux的软中断都是在专门的内核线程...= "ksoftirqd/%u", }; 当ksoftirqd被创建出来以后,它就会进入自己的线程循环函数ksoftirqd_should_run和run_ksoftirqd了。...创建ksoftirqd内核线程 linux内核通过调用subsys_initcall来初始化各个子系统,在源代码目录里你可以grep出许多对这个函数的调用。...内核线程初始化的时候,我们介绍了ksoftirqd中两个线程函数ksoftirqd_should_run和run_ksoftirqd。
Linux的软中断都是跑在专门的内核线程(ksoftirqd)中的,每个CPU核对应一个这样的内核线程。ISR还会在1.b处触发ksoftirqd/4运行。...1.b 处的箭头所指的图示和标有ksoftirqd/4的大方框是一个,这样是为了让整个图好看一些,这其实也是一种(通用)画图技巧。...我把这个过程中每一层的入口函数都标示出来了,便于感兴趣的朋友自行到Linux内核代码搜索。...从这张图可以看到skb从RingBuffer被取出来,到最后落到位于TCP层的socket接收队列里,都是在ksoftirqd/4这个内核线程里完成的。...步骤2.c所触发的软中断使得ksoftirqd/4开始消费input_pkt_queue里的skb。
Linux 中的 ps 命令是 Process Status 的缩写。ps 命令用来列出系统中当前运行的那些进程。...linux 上进程有 5 种状态: 运行(正在运行或在运行队列中等待) 中断(休眠中,受阻,在等待某个条件的形成或接受到信号) 不可中断(收到信号不唤醒和不可运行,进程必须等待直到有中断发生) 僵死(进程已终止...00:00:00 ksoftirqd/1 6 ? 00:29:57 events/0 7 ?...00:00:00 [ksoftirqd/0] root 4 1 0 Nov02 ?...00:00:00 [ksoftirqd/1] root 6 1 0 Nov02 ?
— 2 — 深入挖掘 Linux 内核的网络包处理过程 为了理解为什么问题会出现在 kube 节点服务的接收端,我们来看下 Linux 是如何处理网络包的。...在最简单原始的实现中,网卡接收到一个网络包以后会向 Linux 内核发送一个中断,告知有一个网络包需要被处理。...许多年前,Linux 新增了一个 NAPI,Networking API 用于代替过去的传统方式,现代的网卡驱动使用这个新的 API 可以显著提升高速率下包处理的性能。...通过整理 Linux 内核处理网络包的路径,我们发现这个处理过程确实有可能发生停顿。如果 softirq 处理调用之间的间隔变长,那么网络包就有可能处于网卡的 RX 队列中一段时间。...现在我们可以使用一些工具来帮助我们实时追踪 Linux 内核的运行状态,为此我可以可以使用 bcc。
在linux系统中,ps是简单而强大的进程查看命令,而ps -aux和ps -ef是打印出所有进程。...其中的参数详解如下:ps -aux是以BSD方式显示a显示所有用户的进程(show processes for all users)u 显示用户(display 在linux系统中,ps是简单而强大的进程查看命令...S 2014 7:34 [ksoftirqd/0] root 5 0.0 0.0 0 0 ?...00:07:34 [ksoftirqd/0] root 5 2 0 2014 ?...00:01:44 [ksoftirqd/1] root 10 2 0 2014 ?
2 概念 2.1 软中断概念 linux的中断会打断CPU当前的工作,中断一般都设计的短小精悍。...但是也为了解决中断处理程序执行时间过长和中断丢失的问题,Linux的中断分为两个阶段: 上半部用来快速处理中断,它在中断禁止模式下运行,主要处理硬件相关和时间敏感的工作 下半部用来延迟处理上半部未完成的工作...而下半部以内核线程的方式执行,并且每个CPU都对应一个软中断内核线程,名字为 “ksoftirqd/CPU 编号”,比如说, 0 号 CPU 对应的软中断内核线程的名字就是 ksoftirqd/0。...不过要注意的是,软中断不只包括了刚刚所讲的硬件设备中断处理程序的下半部,一些内核自定义的事件也属于软中断,比如内核调度和RCU 锁(Read-Copy Update 的缩写,RCU是 Linux 内核中最常用的锁之一...S Oct10 0:01 [ksoftirqd/1] 这些线程的名字外面都有中括号,这说明 ps 无法获取它们的命令行参数(cmline)。
linux为了实现这个特点,当中断发生的时候,硬中断处理那些短时间就可以完成的工作,而将那些处理事件比较长的工作,放到中断之后来完成,也就是软中断(softirq)来完成。...(3)中断嵌套 Linux下硬中断是可以嵌套的,但是没有优先级的概念,也就是说任何一个新的中断都可以打断正在执行的中断,但同种中断除外。软中断不能嵌套,但相同类型的软中断可以在不同CPU上并行执行。...__softirq_pending) 唤醒ksoftirqd内核线程处理软中断。...每个处理器都有一个这样的线程,名字为ksoftirqd/n,n为处理器的编号。...flags |= PF_KSOFTIRQD; /* I am ksoftirqd */ while(!
Linux内核对网络包的接收过程大致可以分为接收到RingBuffer、硬中断处理、ksoftirqd软中断处理几个过程。...在Linux的整个网络栈中,RingBuffer起到一个任务的收发中转站的角色。对于接收过程来讲,网卡负责往RingBuffer中写入收到的数据帧,ksoftirqd内核线程负责从中取走处理。...只要ksoftirqd线程工作的足够快,RingBuffer这个中转站就不会出现问题。但是我们设想一下,假如某一时刻,瞬间来了特别多的包,而ksoftirqd处理不过来了,会发生什么?...对于我们的Linux的处理软中断的ksoftirqd来说,它也和番茄工作法思路类似。一旦它被硬中断触发开始了工作,它会集中精力处理一波儿网络包(绝不只是1个),然后再去做别的事情。...# sysctl -a | grep net.core.netdev_budget = 300 这个的意思说的是,ksoftirqd一次最多处理300个包,处理够了就会把CPU主动让出来,以便Linux
linux为了实现这个特点,当中断发生的时候,硬中断处理那些短时间 就可以完成的工作,而将那些处理事件比较长的工作,放到中断之后来完成,也就是软中断(softirq)来完成。...(3) 中断嵌套 Linux下硬中断是可以嵌套的,但是没有优先级的概念,也就是说任何一个新的中断都可以打断正在执行的中断,但同种中断 除外。...__softirq_pending) 唤醒ksoftirqd内核线程处理软中断。...每个处理器都有一个这样的线程,名字为ksoftirqd/n,n为处理器的编号。...flags |= PF_KSOFTIRQD; /* I am ksoftirqd */ while(!
Linux 在系统初始化时注册了两种 softirq 处理函数,分别为 TASKLET_SOFTIRQ 和 HI_SOFTIRQ. void __init softirq_init() { .....上面我们讲到 Linux 内核会为每个 CPU 都创建一个内核线程 ksoftirqd,当需要中断线程化处理的时候,会通过 wakeup_softirqd 唤醒内核线程来执行。...来唤醒内核,即执行 run_ksoftirqd 函数,如果此时有软中断处理请求,就调用 __do_softirq 来进行处理。...在 Linux 内核中有两种 tasklet,一种是高优先级 tasklet,一种是普通 tasklet。...Linux定义了两种的tasklet队列,分别为 tasklet_vec 和 tasklet_hi_vec,定义如下: struct tasklet_head tasklet_vec[NR_CPUS];
领取专属 10元无门槛券
手把手带您无忧上云