有其他团队反应,一个四核的方案在应用跑起来的时候,发现cpu的“负载”很高,使用top命令发现有的内核进程百分比很高。
其中[]框起来的是内核线程,其余是用户态线程
NOTE:首先科普,所谓top命令测出的”负载”即百分比并不是真正某个线程或是进程占用cpu的程度,它的算法是去统计当前任务列表中的进程占用cpu的时间,然后去统计一下。 一般我们认为top就会反映真实的cpu的占用情况,其实并不是这样的。load average 统计的是当期活跃的进程及不可中断的进程
发现有的进程占比很高后,我们认为一般是在内核线程中是使用 msleep 会导致 load average 增加 , 而 msleep_interruptible 则不会 由于使用了不可中断的sleep导致内核线程在sleep期间无法退出,而使用sleep_interruptable这种可被打断的函数,例如contrl+c时是kill不掉这个内核进程的。 所以要将sleep换为sleep_interruptable(),这样做后可以将top的统计结果降下来。但实际对cpu的占用并没有改变,只是这个使用sleep_interruptable的内核线程可以被中段了而已。
Q: 此时还有一个担心,driver中很多地方都会使用sleep作用一个延时的动作,如果换为msleep_interruptible后,可以保证我延时时间的不变吗? A: 换了函数后,只是表示它可以被信号打断,但是一般正常情况下并没有信号去打断这个进程,所以这个延时还是有效的,延时时间不会打折扣,只是让这线程具备被打断的属性而已。
sleep的使用场景: 一般在内核线程中,最好使用一个可中断的msleep_interruptible(2),最好2ms以上。因为线程的调度节拍由HZ来决定,这个可以配置,一般为1000,即1ms。,所以sleep 1ms 会让cpu切换很吃力, 所以最好出让cpu 2ms 以上。
