首页 > 编程知识 正文

linux内核结构详解,浏览器内核原理

时间:2023-05-06 05:09:45 阅读:111363 作者:1256

在传统的poll机制中,继续poll操作可以提高高IO传输设备(如NVME设备)的IO性能。 然而,继续轮询一个设备将过度消耗CPU,并且在某些情况下可能恶化IO性能。 为了解决这种传统poll过度消耗CPU的问题,在内核中引入了hybird poll,与传统poll在IO提交后立即进行poll不同,在hybird poll机制中引入了poll delay。

假设后端设备在10微秒内完成一个IO。 在submit_bIO中提交IO后,开始轮询。 最初几个us的poll会浪费cpu。 一个更有效率的方法是在submit_bIO上提交io后,先sleep几微秒,然后在io完成前几微秒开始poll。 这样,就不需要在IO提交后的前期白白占用cpu进行徒劳的轮询。 (消耗cpu )的结构是hybird poll,该poll cycle分为两部分。 1、前期执行休眠。 2、后期实行传统poll。

hybird poll相关的配置参数:

/sys/block/dev/queue/io _ poll _ delay

-1 Never enter hybrid sleep,Alwayspoll(http://www.Sina.com/) ) ) ) ) ) )。

0 usehalfofthecompletionmeanforthisrequesttypeforthesleepdelay (http://www.Sina.com/) )。

0 usethisspecificvalueasthesleepdelay (http://www.Sina.com/) )。

使用传统poll操作,执行的不停的poll操作,不会sleep

When read,thisfileshowswhetherpollingisenabled (1) or disabled (0)0).writing‘0’tothisfilewilldisablepollingforthised

默认值,表示使用hybird poll,但前期sleep时间不确定,需要内核计算这个时间,然后sleep这个计算出来的时间的一半后再执行传统的poll

If polling is enabled,thiscontrolswhatkindofpollingwillbeperformed.itdefaultsto-1,whichisclassicpolling.in this mode, thecpuwillrepeatedlyaskforcompletionswithoutgivingupanytime.ifs etto 0,a hybrid pollingmode is used, wherethekernelwillattempttomakeaneducatedguessatwhentheiowillcomplete.basedonthisguess,thekernelwillputtheprocessisssuingiogios beforeenteringaclassicpolloop.thismodemightbealittleslowerthanpureclassicpolling,butitwillbemoreefficient.ifsettoavavaluelued thekernelwillputtheprocessissuingiotosleepforthisamountofmicrosecondsbefficient.ifsettosleeepforthisamountofmicrosecondsbe

总之,使用hybrid poll提交IO的线程在IO path中休眠并唤醒是在IO完成之前唤醒,然后使用poll快速感知IO完成。 如果使用poll模式而不是在IO完成后通过bIO回调唤醒,则会增加响应IO完成后操作的延迟。

将hybird poll与传统poll的原理图进行比较如下。

如上所述,如果io_poll_delay=0,则hybird sleep的时间由内核计算。 sleep的时间是内核记录的当前设备过去请求时间平均值的一半,在内核代码上,不同size的请求(即包含不同扇区数的请求)内核分别记录平均时间

在request提交到设备之前,调用blk_mq_start_request以记录request提交到设备的时间(rq-io_start_time_ns )

request要在完成函数__blk_mq_end_request中记录request的时间,以及将该request的时间(now - rq-io_start_time_ns )记录在一个percpu的. mean记录具有相同size的request的时间平均值,cpu_stat[bucket].nr_samples记录采样数,CPU_stat[bucket] .为

在进入传统poll前,内核将设置发出IO请求的进程先睡眠特定的微秒,不使用内核计算的平均时间,然后再执行传统的poll,这样做的前提是我们能够知道设备完成一个IO的大概耗时

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。