在这个过程中内核线程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、执行命令
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。
.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。
— 2 — 深入挖掘 Linux 内核的网络包处理过程 为了理解为什么问题会出现在 kube 节点服务的接收端,我们来看下 Linux 是如何处理网络包的。...在最简单原始的实现中,网卡接收到一个网络包以后会向 Linux 内核发送一个中断,告知有一个网络包需要被处理。...许多年前,Linux 新增了一个 NAPI,Networking API 用于代替过去的传统方式,现代的网卡驱动使用这个新的 API 可以显著提升高速率下包处理的性能。...通过整理 Linux 内核处理网络包的路径,我们发现这个处理过程确实有可能发生停顿。如果 softirq 处理调用之间的间隔变长,那么网络包就有可能处于网卡的 RX 队列中一段时间。...现在我们可以使用一些工具来帮助我们实时追踪 Linux 内核的运行状态,为此我可以可以使用 bcc。
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 ?
在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 在系统初始化时注册了两种 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];
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 服务器正常启动后,提供服务时会调用程序,占用进程。这时候我们如何查看系统中有哪些进程在被调用呢?我们可以通过以下命令来查看。...SN Jan23 0:00 [ksoftirqd/0] root 4 0.0 0.0 0 0 ? ...SN Jan23 0:00 [ksoftirqd/2] root 10 0.0 0.0 0 0 ? ...kill 命令的工作原理是,向 Linux 系统的内核发送一个系统操作信号和某个程序的进程标志号,然后系统内核就可以对进程标志号指定的进程进行操作了。...在 Linux 下,最强大的进程管理命令莫过于 ps 和 top 了,我们应该掌握它们的详细语法,在工作中灵活地使用它们。 注:以上内容整理自《构建高可用的 Linux 服务器》一书。
领取专属 10元无门槛券
手把手带您无忧上云