将网卡软中断绑定指定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亲和性。
axi中断控制器用法
axi中断控制器用法
AXI(Advanced eXtensible Interface)中断控制器是用于处
理中断请求的IP核,通常用于处理外部设备发送的中断信号。
在使
用AXI中断控制器时,需要进行以下步骤:
1. 实例化,首先,在设计中实例化AXI中断控制器IP核。
这
可以通过Vivado等工具进行,也可以手动在Verilog或VHDL中进
行实例化。
2. 连接中断信号,将外部设备发送的中断信号连接到AXI中断
控制器的相应输入端口。
这通常涉及到设计中断控制器的硬件接口,确保中断信号能够正确地传递到中断控制器。
3. 配置中断控制器,根据实际需求,对AXI中断控制器进行配置。
这包括设置中断触发方式(边沿触发或电平触发)、中断屏蔽、中断优先级等参数。
4. 中断处理,在FPGA设计中,需要编写中断处理程序来响应
中断事件。
这通常涉及到在处理器(如ARM Cortex-A系列处理器)
中配置中断控制器,并编写中断服务程序(ISR)来处理中断请求。
5. 集成到系统中,最后,将配置好的AXI中断控制器集成到整
个系统中,确保中断能够正确地被处理并响应。
总之,使用AXI中断控制器需要对硬件和软件进行合理的配置
和集成,以确保外部设备发送的中断信号能够被正确地处理和响应。
这样可以实现系统对外部事件的及时响应和处理。
CPU状态信息us,sy,ni,id,wa,hi,si,st含义
CPU状态信息us,sy,ni,id,wa,hi,si,st含义使⽤系统命令top即可看到如下类似信息:Cpu(s): 0.0%us, 0.5%sy, 0.0%ni, 99.5%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st但不知什么含义?google之I try to explain these:us: is meaning of "user CPU time"sy: is meaning of "system CPU time"ni: is meaning of" nice CPU time"id: is meaning of "idle"wa: is meaning of "iowait"hi:is meaning of "hardware irq"si : is meaning of "software irq"st : is meaning of "steal time"中⽂翻译为:us ⽤户空间占⽤CPU百分⽐sy 内核空间占⽤CPU百分⽐ni ⽤户进程空间内改变过优先级的进程占⽤CPU百分⽐id 空闲CPU百分⽐wa 等待输⼊输出的CPU时间百分⽐hi 硬件中断si 软件中断st: 实时===========================================================================================================================================测试中发现服务器整体负载较低,但有cpu负载特别⾼,其中⼀个cpu⼏乎⼀半是软中断si,特别忙,⽽还有的cpu特别空闲。
Java代码1. top - 16:12:08 up 31 days, 3:52, 1 user, load average: <span style="color: #ff0000;">0.11, 0.11, 0.06</span>2. Tasks: 242 total, 4 running, 238 sleeping, 0 stopped, 0 zombie3. Cpu0 : 12.3%us, 14.6%sy, 0.0%ni, 70.2%id, 0.0%wa, 0.0%hi, 3.0%si, 0.0%st4. Cpu1 : 21.6%us, 22.9%sy, 0.0%ni, 7.3%id, 0.0%wa, 0.0%hi, <span style="color: #ff0000;">48.2%si</span>, 0.0%st5. Cpu2 : 16.5%us, 19.1%sy, 0.0%ni, 43.9%id, 0.0%wa, 0.0%hi, 20.5%si, 0.0%st6. Cpu3 : 2.3%us, 2.6%sy, 0.0%ni, 94.1%id, 0.0%wa, 0.0%hi, 1.0%si, 0.0%st7. Cpu4 : 0.3%us, 0.3%sy, 0.0%ni, 99.3%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st先⽤mpstat -I SUM -P ALL 5 来看⼀下每个cpu的终端情况,发现cpu1和cpu2处理的中断确实很多,是什么dd在使⽤这两个cpu做中断呢?Java代码1. # mpstat -I SUM -P ALL 52. Linux 2.6.32-220.13.1.el6.x86_64 (talus186) 12/26/2013 _x86_64_ (12 CPU)3.4. 04:15:18 PM CPU intr/s5. 04:15:23 PM all 62422.606. 04:15:23 PM 0 0.007. 04:15:23 PM 1 21566.208. 04:15:23 PM 2 12123.009. 04:15:23 PM 3 0.0010. 04:15:23 PM 4 1.00使⽤ cat /proc/interrupts 查看中断情况,间隔⼏秒后再次cat /proc/interrupts,然后⽐较对应值的变化,发现eth0-1、eth0-2等使⽤cpu1、cpu2做中断,这两个对应的中断号分别是95,96...Java代码1. 95: 33 325897741 0 30997484 72 0 93968731 0 0 0 426 864 IR-PCI-MSI-edge eth0-12. 96: 50 206 66609822 117 0 0 0 0 0 0 0 24437509 IR-PCI-MSI-edge eth0-2注:⽹卡(包括磁盘等外设)需要cpu服务时,都会抛出⼀个中断,中断告诉cpu发⽣了什么事情,cpu就要停⽌⽬前的⼯作来处理这个中断。
将网卡软中断绑定指定CPU
使用以下sh命令将中断与cpu1绑定echo "00000002"> /proc/irq/122/smp_affinityecho "00000002"> /proc/irq/130/smp_affinityecho "00000002"> /proc/irq/138/smp_affinityecho "00000002"> /proc/irq/146/smp_affinityecho "00000002"> /proc/irq/154/smp_affinityecho "00000002"> /proc/irq/162/smp_affinityecho "00000002"> /proc/irq/170/smp_affinityecho "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代表cpu60000 0080代表cpu7…0000 1000代表cpu120000 2000代表cpu130000 4000代表cpu140000 8000代表cpu15122 130 138…代表中断号,可以通过cat /proc/interrupts 查看,比如:CPU0 CPU1 CPU2 CPU3 CPU4 CPU5 CPU6 CPU7 CPU8 CPU9 CPU10 CPU11 CPU12 CPU13 CPU14 CPU150: 2836021658 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 IO-APIC-edge timer1: 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 IO-APIC-edge i80428: 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 IO-APIC-edge rtc9: 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 IO-APIC-level acpi14: 0 0 0 0 0 0 0 0 0 0 0 0 0 00 0 IO-APIC-edge ata_piix15: 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 IO-APIC-edge ata_piix74: 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 IO-APIC-level ehci_hcd:usb1, uhci_hcd:usb782: 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:usb590: 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 IO-APIC-level uhci_hcd:usb4, uhci_hcd:usb698: 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 IO-APIC-level ata_piix122: 2763140 230754 215676 358665 0 201511 0 0 0 0 0 0 293421 557226 0 0 PCI-MSI-X eth0-0130: 1461917 384097 0 530340 0 340883 0 0 0 0 0 0 544599 1028591 0 0 PCI-MSI-X eth0-1138: 9408263 386733 0 532291 0 339515 0 0 0 887092 0 0 543892 133412 0 0 PCI-MSI-X eth0-2146: 1389996 385305 0 523059 0 338329 0 0 0 872085 0 0 538788 133612 0 0 PCI-MSI-X eth0-3154: 2246010 780522 0 516565 0 1184495 0 0 0 0 0 0 122112 129627 0 0 PCI-MSI-X eth0-4162: 3004146 795611 0 523047 0 1208300 0 0 0 0 0 0 125758 133923 0 0 PCI-MSI-X eth0-5170: 1629295 1631921 0 517097 0 330875 0 0 0 0 0 0 122532 129621 0 0 PCI-MSI-X eth0-6178: 1373049 1673169 0 527089 0 340378 0 0 0 0 0 0 126040 134264 0 0 PCI-MSI-X eth0-7186: 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 PCI-MSI-X cnic201: 2708756 0 0 0 0 00 0 0 0 0 0 0 0 0 0 IO-APIC-level megasasNMI: 32838 13281 12893 12890 14718 14028 13263 13258 14212 21869 13291 13185 14386 16830 13786 13480LOC: 2836199593 2836199609 2836199536 2836199460 2836199384 2836199304 2836199225 2836199152 2836199059 2836198967 2836198896 2836198831 2836198747 2836198675 2836198597 2836198524ERR: 0MIS: 0由于旧版本内核不支持RPS,所以不能实现软中断均匀分布,故只能将固定的中断与cpu绑定。
浅谈linux性能调优之十七:进程绑定与中断绑定
浅谈linux性能调优之十七:进程绑定与中断绑定1.使用taskset设置CPU亲和性taskset搜索并设定运行进程的CPU亲和性(根据进程ID)。
它还可用于启动给定CPU亲和性的进程,这样就可将指定的进程与指定的CPU或者一组CPU捆绑CPU 亲和性使用位掩码表示。
最低位对应第一个逻辑 CPU,且最高位对应最后一个逻辑CPU。
这些掩码通常是十六进制,因此0x00000001 代表处理器 1,0x00000003 代表处理器 3 。
要设定运行进程的 CPU 亲和性,请执行以下命令,使用处理器或者您要捆绑到的处理器掩码替换 mask,使用您要更改亲和性的进程的进程 ID 替换 pid。
# taskset -p mask pid要启动给定亲和性的进程,请运行以下命令,使用处理器或者您要捆绑的处理器的掩码替换 mask,使用程序、选项以及您要运行的程序参数替换 program。
# taskset mask -- program与其将处理器指定为位码,您还可以使用 -c 选项提供逗号分开的独立处理器,或者一组处理器列表,类似如下:# taskset -c 0,5,7-9 -- myprogram有关 taskset 的详情请参考 man page:man taskset。
2.硬件中断发生频繁,是件很消耗 CPU 资源的事情,在多核 CPU 条件下如果有办法把大量硬件中断分配给不同的 CPU (core) 处理显然能很好的平衡性能。
现在的服务器上动不动就是多 CPU 多核、多网卡、多硬盘,如果能让网卡中断独占1个 CPU (core)、磁盘 IO 中断独占1个 CPU 的话将会大大减轻单一 CPU 的负担、提高整体处理效率。
中断请求(IRQ)是用于服务的请求,在硬件层发出。
可使用专用硬件线路或者跨硬件总线的信息数据包(消息信号中断,MSI)发出中断。
启用中断后,接收IRQ 后会提示切换到中断上下文。
内核中断调度代码会搜索 IRQ 号码机器关联的注册中断服务路由(ISR)列表,并按顺序调用 ISR。
软中断和硬中断的区别?
软中断和硬中断的区别?⽬录硬中断1.由与系统相连的外设(⽐如⽹卡、硬盘)⾃动产⽣的。
主要是⽤来通知操作系统系统外设状态的变化。
⽐如当⽹卡收到数据包的时候,就会发出⼀个中断。
我们通常所说的中断指的是硬中断(hardirq)。
2. 硬中断是外部设备对CPU的中断;3. 硬中断是由硬件产⽣的,⽐如,像磁盘,⽹卡,键盘,时钟等。
每个设备或设备集都有它⾃⼰的IRQ(中断请求)。
基于IRQ,CPU可以将相应的请求分发到对应的硬件驱动上(注:硬件驱动通常是内核中的⼀个⼦程序,⽽不是⼀个独⽴的进程)。
4. 处理中断的驱动是需要运⾏在CPU上的,因此,当中断产⽣的时候,CPU会中断当前正在运⾏的任务,来处理中断。
在有多核⼼的系统上,⼀个中断通常只能中断⼀颗CPU(也有⼀种特殊的情况,就是在⼤型主机上是有硬件通道的,它可以在没有主CPU的⽀持下,可以同时处理多个中断。
)。
5. 硬中断可以直接中断CPU。
它会引起内核中相关的代码被触发。
对于那些需要花费⼀些时间去处理的进程,中断代码本⾝也可以被其他的硬中断中断。
6. 对于时钟中断,内核调度代码会将当前正在运⾏的进程挂起,从⽽让其他的进程来运⾏。
它的存在是为了让调度代码(或称为调度器)可以调度多任务。
软中断1.通常是硬中断服务程序对内核的中断;2.为了满⾜实时系统的要求,中断处理应该是越快越好。
linux为了实现这个特点,当中断发⽣的时候,硬中断处理那些短时间就可以完成的⼯作,⽽将那些处理事件⽐较长的⼯作,放到中断之后来完成,也就是软中断(softirq)来完成。
3. 软中断的处理⾮常像硬中断。
然⽽,它们仅仅是由当前正在运⾏的进程所产⽣的。
4. 通常,软中断是⼀些对I/O的请求。
这些请求会调⽤内核中可以调度I/O发⽣的程序。
对于某些设备,I/O请求需要被⽴即处理,⽽磁盘I/O请求通常可以排队并且可以稍后处理。
根据I/O模型的不同,进程或许会被挂起直到I/O完成,此时内核调度器就会选择另⼀个进程去运⾏。
软中断和硬中断(转)
软中断和硬中断(转)1、中断:通常被定义成⼀个事件,该事件改变处理器执⾏的指令顺序。
这样的事件与cpu芯⽚外部电路产⽣的电信号相对应。
2、中断的产⽣:每个能够发出中断请求的硬件设备控制器都有⼀条称为IRQ的输出线(中断线)。
所有的IRQ线都与⼀个中断控制器的输⼊引脚相连,中断控制器与cpu的intr引脚相连。
3、中断向量:每个中断由0-255之间的⼀个8位数来标识。
称为中断向量。
4、中断描述符表:IDT是⼀个系统表,它与每⼀个中断或者异常向量相联系,每⼀个向量在表中有相应的中断处理程序的⼊⼝地址。
cpu的idtr寄存器执⾏IDT表的物理基地址。
5、中断的硬件处理:在内核被init进程初始化后,cpu运⾏在保护模式下。
当执⾏⼀条指令后,sc和eip这对寄存器包含了下⼀条将要执⾏的指令的逻辑地址。
在执⾏这条指令之前,cpu控制单元会检查在运⾏前⼀条指令时是否发⽣了⼀个中断。
如果发⽣了,cpu控制单元处理中断。
软中断:软中断是利⽤硬件中断的概念,⽤软件⽅式进⾏模拟,实现宏观上的异步执⾏效果。
硬中断是外部设备对cpu的中断。
软中断通常是硬中断服务程序对内核的中断。
(中断服务程序和中断处理程序不同)信号则是由内核或者其他进程对某个进程的中断。
理解:因为每个进程空间或者线程空间都是在⼀定程度上相对逻辑独⽴的,类似于外部设备DMA相对于cpu。
所以从理论上说,是可以实现中断的。
扩展:信号量与消息队列都是提供给⽤户程序的,是内核服务的⼀种封装。
进程内核栈和⽤户栈:每个进程都有两个栈:⽤户栈和内核栈。
当进程在⽤户空间运⾏时,cpu堆栈指针寄存器⾥⾯的内容是⽤户堆栈地址。
同理,进程在内核空间运⾏时,eip值是内核栈空间地址。
进程⽤户栈和内核栈的切换,当进程因为中断或者系统调⽤⽽陷⼊内核态执⾏时,进程所使⽤的堆栈也要从⽤户栈转到内核栈。
检查信号中断时在内核态即将进⼊⽤户态的时候,⽽不是任何时候都检查的。
软中断时软件实现的中断,也就是程序运⾏时其他程序对它的中断。
- 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绑定。