yanfeizhang / coder-kung-fu

开发内功修炼

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

关于ksoftirqd的解释

15915935280 opened this issue · comments

想咨询下,我之前理解的ksoftirqd进程不是 为了防止过多软中断导致用户进程处理饥饿状态的一种 策略吗?并非每次收包,都是经过它处理的吧?

历史上不知道是咋样的,反正现在根据源码来看每次收包确实都走了ksoftiqrd了

隔了一年,这块我也看到了。软中断走ksoftirqd线程不是一定的。在触发中断后,是允许软中断的触发点发生在中断上下文,即中断上半部处理完成后可以触发软中断raise_softirq()接着去处理软中断内容。
当然内核做了很多均衡操作,比如软中断处理期间又有中断并塞入了新的软中断到队列里,内核会比如说记录软中断处理时间、当前是否有进程need_sched、软中断处理loop次数超过一定限制等一些判断条件(不同内核版本不一样),决定是否要把软中断推迟到ksoftirqd线程里面去处理。

image
image
linux/v3.10.108

还有一点的是,ksoftirqd线程PR是20,NI是0,和普通用户起的进程的等级是一样的,如果每次都在ksoftirqd线程才会处理,网络延迟会很高的。

ksoftirqd我一直以为是走实时调度呢,刚查看了一下,确实如@shiyiyuedeyu所说,竟然是走的完全公平调度器。

chrt -p xxx

pid 10's current scheduling policy: SCHED_OTHER
pid 10's current scheduling priority: 0