当前位置: 首页 > 科技观察

LinusTorvalds再次修改了页锁逻辑,将if替换为while

时间:2023-03-12 02:51:51 科技观察

几个月前,LinusTorvalds重写了Linux5.9中的wait_on_page_bit_common()相关逻辑,以解决页锁竞争的公平性问题。在此之前,pagelockholder在执行“unlock_page()”时,只会唤醒等待队列中的一个独占进程(FIFO,且该进程正在执行“lock_page”),但该进程不一定正在运行,尤其是在load,只有获得CPU时间才能真正运行。同时,其他没有进入等待队列的正在运行的进程可以直接获取页面锁。虽然这个进程仍然有效地使用了页面,但是会导致很不公平的情况。在某些情况下,被唤醒的等待进程运行后发现页面锁还没有释放,于是重新进入等待队列,并且是最后一个。在极端情况下,该过程可能会重复该过程并等待数十秒。所以LinusTorvalds对其进行了修改,在等待进程醒来时将锁交给它,不管它是否正在运行。但是,这并不能完全解决问题。此后,偶尔会出现BUG_ON(),因为上面的“wait-to-set”过程不是原子的,所以被唤醒的过程仍有可能“被第三方介入”。如果要将“wait-to-set”过程修改为原子操作,需要修改大约50个函数,所以上周LinusTorvalds将wait_on_page_writeback()函数中的if改为while来解决这个问题。它基本上回到了它开始的地方,但频率要低得多,所以它仍然是可控的。不过据外媒报道,PostgreSQL在该版本的基准测试中性能下降了5%-10%。对此,LinusTorvalds认为,此次掉线并非补丁所致,可能与测试机型或机器性能有关。有关的。Linux5.11-rc3现已发布。有兴趣的同学可以进行相关测试。更多详细信息,请参考以下commit:mm:makewait_on_page_writeback()waitformultiplependingwritebacksmm:rewritewait_on_page_bit_common()logic然后更改pagelock逻辑,将if替换为while