将网卡软中断绑定指定CPU
Linux 内核软中断(softirq)执行分析

Linux 内核软中断(softirq)执行分析Author: sinisterEmail: sinister@Homepage:Date: 2007-01-11本文对 Linux 内核软中断的执行流程进行了分析,并尽可能的结合当前运行环境详细地写出我的理解,但这并不表明我的理解一定正确。
这本是论坛里的一篇帖子,发出来是为了抛砖引玉,如果您在阅读本文时发现了我的错误,还望得到您的指正。
今天无意中看了眼 2.6 内核的软中断实现,发现和以前我看到的大不相同(以前也是走马观花,不大仔细),可以说改动很大。
连 softirq 的调用点都不一样了,以前是三个调用点,今天搜索了一下源代码,发现在多出了ksoftirqd 后,softirq 在系统中的调用点仅是在 ISR 返回时和使用了local_bh_enable() 函数后被调用了。
网卡部分的显示调用,我觉得应该不算是系统中的调用点。
ksoftirqd 返回去调用 do_softirq() 函数应该也只能算是其中的一个分支,因为其本身从源头上来讲也还是在 ISR 返回时irq_exit() 调用的。
这样一来就和前些日子写的那份笔记(Windows/Linux /Solaris 软中断机制)里介绍的 Linux 内核部分的软中断有出处了,看来以后讨论 Linux kernel 代码一定要以内核版本为前题,要不非乱了不可。
得买本 Linux 方面的书了,每次上来直接看相关代码也不是回事,时间也不允许。
//// do_IRQ 函数执行完硬件 ISR 后退出时调用此函数。
//void irq_exit(void){account_system_vtime(current);trace_hardirq_exit();sub_preempt_count(IRQ_EXIT_OFFSET);//// 判断当前是否有硬件中断嵌套,并且是否有软中断在// pending 状态,注意:这里只有两个条件同时满足// 时,才有可能调用 do_softirq() 进入软中断。
计算机原理软硬中断实例

计算机原理软硬中断实例
软中断和硬中断是计算机系统中处理外部事件的两种不同方式。
软中断是由CPU执行的特殊指令,用于请求操作系统执行特定
的任务或服务。
例如,在Linux系统中,软中断可以由用户空间程
序通过系统调用触发,以请求操作系统执行特定的内核功能。
另一
个例子是在网络编程中,当数据包到达时,操作系统会生成软中断
来处理网络数据包。
硬中断是由计算机硬件设备(如网卡、键盘、定时器等)发送
给CPU的信号,用于通知CPU发生了特定的事件。
例如,当键盘被
按下时,键盘控制器会发送一个硬中断给CPU,以通知操作系统有
按键事件发生。
一个常见的软中断和硬中断的实例是计时器中断。
硬件定时器
可以定期发送硬中断给CPU,以便操作系统可以执行定时任务,比
如更新系统时间或执行周期性的操作。
另一方面,操作系统也可以
设置一个软定时器,当定时器时间到达时,CPU会执行相应的软中
断处理程序。
总的来说,软中断和硬中断都是计算机系统中用于处理外部事件的重要机制,它们在操作系统和硬件之间起着桥梁的作用,确保系统能够及时、有效地响应外部事件。
linux软中断 处理流程

linux软中断处理流程:
当发生软件中断时,CPU会根据设置好的中断向量表将控制权转移到相应的中断服务程序。
这些中断服务程序通常由操作系统内核提供并预先注册在中断向量表中。
中断服务程序首先保存被打断进程的上下文信息,包括寄存器状态、指令计数等。
然后,它可以执行特定于该中断类型的任务或调用其他函数来完成需要的工作。
在中断服务程序执行期间,不能有新的中断请求被接收和处理,因为多重中断可能导致未知结果。
此外,也不能同时运行两个中断服务程序,否则可能引起死锁或数据错误。
中断服务程序执行完毕后,它必须还原之前保存的上下文信息,使得被打断的进程能够正确地返回到原始位置继续执行。
CPU从中断服务程序返回后,会继续执行被打断进程的下一条指令。
Linux支持多种类型的软件中断,每种类型都对应一个中断号。
中断号与中断服务程序的关联是通过编写中断处理程序来实现的。
若想自定义软件中断,可以按照Linux内核源代码中的interrupts 子目录下的文件进行修改和添加。
在Linux内核中,软件中断主要用于处理网络、磁盘I/O、定时器等事件,以及其他需要高效处理的情况。
intel x86中断路由

intel x86中断路由
在Intel x86架构中,中断路由是指处理器如何处理和路由来自外部设备的中断信号。
中断是计算机系统中一种重要的机制,用于处理外部设备发送的信号,如键盘、鼠标、硬盘等设备的输入输出操作。
在x86架构中,中断路由是由中断控制器(PIC)和高级可编程中断控制器(APIC)来管理的。
在早期的x86架构中,使用的是8259A芯片作为中断控制器,它有两个级联的控制器,分别是主片和从片。
主片负责处理前8个中断,从片负责处理后8个中断。
这种级联的方式在一定程度上限制了系统的扩展性和性能。
随着计算机系统的发展,Intel推出了高级可编程中断控制器(APIC),它提供了更灵活的中断处理方式。
APIC支持更多的中断向量,可以处理更多的设备中断,并且支持多处理器系统。
APIC通过Local APIC和I/O APIC来实现中断路由,它可以更好地支持多处理器系统,并提供更好的性能和可扩展性。
在现代的x86系统中,APIC已经成为标准配置,它可以通过软件编程来配置中断路由,实现更灵活的中断处理。
通过配置APIC,
可以将中断路由到特定的处理器核心,实现更好的负载均衡和性能优化。
总之,中断路由在x86架构中是一个重要的概念,它影响着系统的性能和可扩展性。
随着计算机系统的发展,中断路由的方式也在不断演进,以适应越来越复杂的系统架构和应用需求。
对于系统开发者和管理员来说,了解和掌握中断路由的原理和配置方法是非常重要的。
软中断实现原理

软中断实现原理软中断是操作系统中一种用于处理异常和系统调用的机制。
它提供了一种用户空间程序与内核空间之间交互的方式,允许用户程序主动触发中断,并通过中断处理程序在内核中执行特定的操作。
本文将详细解释软中断的基本原理。
1. 中断的基本概念在计算机系统中,中断是一种由硬件或软件触发的事件,用于打断CPU正常的执行流程,转而执行特定的处理程序。
中断可以分为硬件中断和软件中断。
硬件中断是由外部设备(如时钟、键盘、硬盘等)发送给CPU的信号,用于通知CPU某个事件已经发生。
当CPU接收到硬件中断信号时,会暂停当前的执行,跳转到相应的中断处理程序中执行相关操作。
软件中断(也称为陷阱)是由CPU执行指令而触发的中断。
软件中断通常用于实现系统调用和处理异常情况(如除零错误、非法指令等)。
软件中断通过特殊的指令(例如int指令)触发,将控制权转移到事先定义好的中断处理程序中。
2. 软中断的作用软中断是一种特殊的软件中断,它在操作系统中扮演着重要的角色。
软中断的作用包括:•实现系统调用:软中断提供了一种用户程序与操作系统内核之间通信的方式。
用户程序可以通过触发软中断,请求操作系统执行某个特定的功能,如文件操作、进程管理等。
•处理异常情况:软中断可以用于处理异常情况,如除零错误、非法指令等。
当发生异常时,CPU会自动触发相应的软中断,并将控制权转移到相应的中断处理程序中。
3. 软中断的实现原理软中断的实现原理涉及到中断向量表、中断描述符表和中断处理程序等概念。
3.1 中断向量表中断向量表是一个存储中断处理程序入口地址的数据结构。
它是一个固定大小的数组,每个元素对应一个中断向量。
中断向量是一个唯一的整数,用于标识不同的中断类型。
当CPU接收到一个中断信号时,会根据中断信号的类型,在中断向量表中查找相应的中断处理程序的入口地址,并跳转到该地址开始执行中断处理程序。
3.2 中断描述符表中断描述符表是一个存储中断描述符的数据结构。
taskset:让进程运行在指定的CPU上

taskset:让进程运⾏在指定的CPU上观察发现4核CPU,只有第1个核⼼(CPU#0)⾮常忙,其他都处于idle状态。
不了解Linux是如何调度的,但⽬前显然有优化的余地。
除了处理正常任务,CPU#0还需要处理每秒⽹卡中断。
因此,若能将CPU#0分担的任务摊派到其他CPU核⼼上,可以预见,系统的处理能⼒将有更⼤的提升。
两个名词SMP (Symmetrical Multi-Processing):指在⼀个计算机上汇集了⼀组处理器(多CPU),各CPU之间共享内存⼦系统以及总线结构。
SMP意为对称多处理系统,内有许多紧耦合多处理器,这种系统的最⼤特点就是共享所有资源。
另外与之相对⽴的标准是MPP (Massively Parallel Processing),意为⼤规模并⾏处理系统,这样的系统是由许多松耦合处理单元组成的,要注意的是这⾥指的是处理单元⽽不是处理器。
每个单元内的CPU都有⾃⼰私有的资源,如总线、内存、硬盘等。
在每个单元内都有操作系统和管理数据库的实例复本。
这种结构最⼤的特点在于不共享资源 []CPU affinity:中⽂唤作“CPU亲和⼒”,是指在CMP架构下,能够将⼀个或多个进程绑定到⼀个或多个处理器上运⾏。
[]⼀、在Linux上修改进程的“CPU亲和⼒”在Linux上,可以通过命令进⾏修改,安装taskset⼯具。
# yum install util-linux-ng对运⾏中的进程,⽂档上说可以⽤下⾯的命令,把CPU#1 #2 #3分配给PID为2345的进程:# taskset -cp 1,2,3 2345但我尝试没奏效,于是我关掉了MySQL,并⽤taskset将它启动:# taskset -c 1,2,3 /etc/init.d/mysql start对于其他进程,也可如此处理(nginx除外,详见下⽂)。
之后⽤top查看CPU的使⽤情况,原来空闲的#1 #2 #3,已经在⾟勤⼯作了。
Windows系统Intel网卡绑定指导
Windows系统Intel网卡绑定指导
1.需要首先安装Intel的Proset工具(一般在网卡的驱动安装程序中包含)如下图:
2.安装后系统提示需要重新启动系统,重启后打开“设备管理器”,,右键点击要绑定的网
口并选择“属性”。
3.在弹出的属性界面可以看到“分组”标签页。
注意:如果此步骤中并未出现“分组”标签页,说明Proset未安装成功,需要在本地KVM上卸载网卡驱动并重新安装Proset。
4.勾选中“将此适配器与其他适配器组合”,并点击新建,为新组制定名称,点击“下一
步”。
5.选择要绑定的网络适配器,点击下一步。
6.选择组类型为“适应性负载均衡”,点击下一步。
7.点击“完成”。
8.待连接完成后,可以看到新的本地连接。
深入理解“软中断”
深⼊理解“软中断”前⾔软中断(softirq)导致 CPU 使⽤率升⾼也是最常见的⼀种性能问题所以软中断这个硬⾻头必须啃下去!回忆下什么是中断中断是系统⽤来响应硬件设备请求的⼀种机制它会打断进程的正常调度和执⾏然后调⽤内核中的中断处理程序来响应硬件设备的请求场景类⽐,加深印象⽐如说你订了⼀份外卖,但是不确定外卖什么时候送到,也没有别的⽅法了解外卖的进度,但是,配送员送外卖是不等⼈的,到了你这⼉没⼈取的话,就直接⾛⼈了;所以你只能苦苦等着,时不时去门⼝看看外卖送到没,⽽不能⼲其他事情;不过呢,如果在订外卖的时候,你就跟配送员约定好,让他送到后给你打个电话,那你就不⽤苦苦等待了,就可以去忙别的事情,直到电话⼀响,接电话、取外卖就可以了、打电话:其实就是⼀个中断,没接到电话的时候,你可以做其他的事情只有接到了电话(也就是发⽣中断),你才要进⾏另⼀个动作:取外卖中断的优势⼀种异步的事件处理机制,可以提⾼系统的并发处理能⼒中断运⾏时间短由于中断处理程序会打断其他进程的运⾏,为了减少对正常进程运⾏调度的影响,中断处理程序就需要尽可能快地运⾏如果中断要处理的事情很多,中断服务程序就有可能要运⾏很长时间中断处理程序在响应中断会临时关闭中断。
这就会导致上⼀次中断处理完成之前,其他中断都不能响应,也就是说中断有可能会丢失响应中断场景类⽐假如你订了 2 份外卖,⼀份主⾷和⼀份饮料,并且是由 2 个不同的配送员来配送。
这次你不⽤时时等待着,两份外卖都约定了电话取外卖的⽅式。
但是,问题⼜来了,当第⼀份外卖送到时,配送员给你打了个长长的电话,商量发票的处理⽅式。
与此同时,第⼆个配送员也到了,也想给你打电话。
但是很明显,因为电话占线(也就是关闭了中断响应),第⼆个配送员的电话是打不通的。
所以,第⼆个配送员很可能试⼏次后就⾛掉了(也就是丢失了⼀次中断)软中断中断处理过程分割为了解决中断处理程序执⾏过长和中断丢失的问题,Linux 会将中断处理过程分成两个阶段,也就是上半部和下半部上半部:快速处理中断,它在中断禁⽌模式下运⾏,主要处理跟硬件紧密相关的或时间敏感的⼯作下半部:延迟处理上半部未完成的⼯作,通常以内核线程的⽅式运⾏承上启下上⾯说到的响应中断场景上半部就是你接听电话,告诉配送员你已经知道了,其他事⼉见⾯再说,然后电话就可以挂断了下半部才是取外卖的动作,以及见⾯后商量发票处理的动作。
Intel网卡丢包处理SOP
网卡丢包处理方法SOP一、如何查看丢包:使用查看ifconfig ethx 查看某一个端口的发包、丢包情况使用netstat –i可以查看系统下所有网口的发包、丢包情况如上图如果红色圈出部分数字不是0,则产生了丢包;二、发生丢包时,建议更改项,按照1-5优先级别,如果更改1就不再丢包无需执行后面的2-5步。
1、Intel万兆网卡,建议首先检查网卡驱动,建议下载最新驱动,在系统下使用关闭irqbalance 服务,service irqbanlance stop;并使用驱动中scripts目录下的set_irq_affinity将中断与CPU 绑定一下,./set_irq_affinity ethx执行即可。
2、对于Redhat6及以上版本,IOMMU默认是ON,建议改为OFF,通过修改/boot/grub/menu.lst 文件(默认为on 图片中已更改为off)3、Intel CPU系统下关闭P State 功能,对于Redhat 系统可以通过service cpuspeed stop来实现,Suse系统可以通过脚本pstate.sh来关闭;Cat /proc/cpuinfo |grep MHz来查看CPU当前运行的频率,确保当前运行的频率就是CPU 主频;4、BIOS下更改项:建议将Cstate 、VT_d、SR-IOV、HT设置为Disabled。
5、更改网卡的rx和tx ring buffer(通过ethtool –S ethx |grep rx_no_buffer_count 可以查看是否是因为buffer不足造成的丢包,如果这个数字不为零,则说明存在buffer满而丢包的情况),通过ethtool –g ethx可以该网卡的rx和tx ring buffer最大允许值和当前值,通过ethtool –G ethx rx xxx可以更改rx的ring buffer值,当丢包时可以适当增加,建议是在当前基础上按2倍方式逐渐增大,找到一个不丢包的临界值图例中看到RX和TX最大都是4096,当前值均是256,通过命令全部更改为了512。
linux cpu绑核原理
Linux CPU绑核原理一、概述Linux操作系统的CPU绑定技术是一种优化系统性能的方法,它允许将进程或线程绑定到特定的CPU核心上执行,以提高系统的处理能力和响应速度。
通过将进程或线程绑定到特定的CPU核心上,可以避免进程或线程在多个核心之间频繁切换,从而减少上下文切换的开销,提高系统的整体性能。
二、绑核的必要性随着多核处理器的普及,CPU的性能不再只取决于核心的数量,而是越来越依赖于任务在核心之间的分配。
如果任务能够在最优的核心上执行,系统性能将会得到显著提升。
因此,CPU绑定技术成为了一种必要的优化手段。
三、绑核的原理Linux内核提供了CPU亲和性(CPU Affinity)的概念,通过设置进程或线程的CPU亲和性,可以控制进程或线程在哪些CPU核心上执行。
具体来说,Linux内核为每个进程或线程维护一个执行掩码(Affinity Mask),用于指定进程或线程可以运行在哪些CPU核心上。
通过修改这个执行掩码,可以实现CPU 绑定。
当进程或线程被调度到运行时,操作系统会检查该进程或线程的CPU亲和性设置,将其安排在可用的最优核心上。
最优核心的确定方式取决于操作系统的调度策略和系统负载情况。
四、绑核的方法Linux提供了多种方法来实现CPU绑定,以下是一些常用的方法:1.通过schedtool工具绑定:schedtool是一个用于修改进程调度参数的工具,可以用来设置进程的CPU亲和性。
使用schedtool可以指定进程在哪些核心上运行,从而实现CPU绑定。
例如,以下命令将进程ID为12345的进程绑定到核心0和核心2上:schedtool -c 0,2 -e 123452.通过taskset命令绑定:taskset命令用于设置进程的CPU亲和性。
通过指定进程ID和要绑定的核心列表,可以控制进程在哪些核心上运行。
例如,以下命令将进程ID为12345的进程绑定到核心0上:taskset -c 0 123453.通过修改进程的亲和性属性:Linux内核提供了亲和力属性(sched_setaffinity)接口,可以通过编程方式修改进程的CPU亲和性。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
使用以下sh命令将中断与cpu1绑定
echo "00000002"> /proc/irq/122/smp_affinity
echo "00000002"> /proc/irq/130/smp_affinity
echo "00000002"> /proc/irq/138/smp_affinity
echo "00000002"> /proc/irq/146/smp_affinity
echo "00000002"> /proc/irq/154/smp_affinity
echo "00000002"> /proc/irq/162/smp_affinity
echo "00000002"> /proc/irq/170/smp_affinity
echo "00000002"> /proc/irq/178/smp_affinity
其中0000 0002是CPU位掩码
0000 0001代表cpu0 (0001)
0000 0002代表cpu1 (0010)
0000 0004代表cpu2 (0100)
0000 0008代表cpu3 (1000)
0000 0010代表cpu4 …
0000 0020代表cpu5 …
0000 0040代表cpu6
0000 0080代表cpu7
…
0000 1000代表cpu12
0000 2000代表cpu13
0000 4000代表cpu14
0000 8000代表cpu15
122 130 138…代表中断号,可以通过cat /proc/interrupts 查看,比如:
CPU0 CPU1 CPU2 CPU3 CPU4 CPU5 CPU6 CPU7 CPU8 CPU9 CPU10 CPU11 CPU12 CPU13 CPU14 CPU15
0: 2836021658 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 IO-APIC-edge timer
1: 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 IO-APIC-edge i8042
8: 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 IO-APIC-edge rtc
9: 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 IO-APIC-level acpi
14: 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 IO-APIC-edge ata_piix
15: 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 IO-APIC-edge ata_piix
74: 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 IO-APIC-level ehci_hcd:usb1, uhci_hcd:usb7
82: 3528529 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 IO-APIC-level ehci_hcd:usb2, uhci_hcd:usb3, uhci_hcd:usb5
90: 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 IO-APIC-level uhci_hcd:usb4, uhci_hcd:usb6
98: 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 IO-APIC-level ata_piix
122: 2763140 230754 215676 358665 0 201511 0 0 0 0 0 0 293421 557226 0 0 PCI-MSI-X eth0-0
130: 1461917 384097 0 530340 0 340883 0 0 0 0 0 0 544599 1028591 0 0 PCI-MSI-X eth0-1
138: 9408263 386733 0 532291 0 339515 0 0 0 887092 0 0 543892 133412 0 0 PCI-MSI-X eth0-2
146: 1389996 385305 0 523059 0 338329 0 0 0 872085 0 0 538788 133612 0 0 PCI-MSI-X eth0-3
154: 2246010 780522 0 516565 0 1184495 0 0 0 0 0 0 122112 129627 0 0 PCI-MSI-X eth0-4
162: 3004146 795611 0 523047 0 1208300 0 0 0 0 0 0 125758 133923 0 0 PCI-MSI-X eth0-5
170: 1629295 1631921 0 517097 0 330875 0 0 0 0 0 0 122532 129621 0 0 PCI-MSI-X eth0-6
178: 1373049 1673169 0 527089 0 340378 0 0 0 0 0 0 126040 134264 0 0 PCI-MSI-X eth0-7
186: 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 PCI-MSI-X cnic
201: 2708756 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 IO-APIC-level megasas
NMI: 32838 13281 12893 12890 14718 14028 13263 13258 14212 21869 13291 13185 14386 16830 13786 13480
LOC: 2836199593 2836199609 2836199536 2836199460 2836199384 2836199304 2836199225 2836199152 2836199059 2836198967 2836198896 2836198831 2836198747 2836198675 2836198597 2836198524
ERR: 0
MIS: 0
由于旧版本内核不支持RPS,所以不能实现软中断均匀分布,故只能将固定的中断与cpu绑定。