CMU15445 buffer_pool_manager Leaderboard 2023 Fall

如何测试的
在这里插入图片描述
1.有8个Scan线程,会顺序修改数据页。
2.有8个Get线程,会随机访问数据页。

推荐的优化如下
推荐的优化

1.使用更好的缓存页替换策略。Get函数对不同的数据页的访问频次不一样,(实现的LRU-K策略在没有达到K次访问时遵循LRU策略,这忽略了数据页未达到K的访问次数),你可以考虑访问类型(对某个数据页的访问类型就分为上述提到的Get和Scan),升级LRU-K。
2.并行I/O,相较于一次执行一个刷盘任务,并行刷盘会提高很多。你需要保证对数据页的访问是线程安全的。
3.为了实现并行I/O,需要FetchPgae函数和Evict函数能并发执行。你可能需要使用条件变量来维护free_list。
4.不要使用奇技淫巧,比如把数据页下来,以及其他需要额外空间来存储数据页的方案。
5.我们提供无锁线程安全的队列moodycamel::ReaderWriterQueue,你也可以自己实现Promise来减少线程通信的开销。

总结来说就是两点,1.升级LRU-K策略,2.实现磁盘的并发刷脏。

A1针对升级LRU-K,

在达到K次之前,我们按照LFU的策略而不是LRU策略,这样就考虑了不同缓存页的访问次数(如果不这样很难有数据页达到K次)。

A2针对磁盘的并发刷脏

需要设计细粒度锁,原先我是对buffer_pool上一把大锁,这样在刷脏时也会阻塞其他线程,那么现在就需要刷脏的时候不持有大锁,需要保证对同一数据页刷脏操作需要同步,对不同数据页刷脏的操作可以异步。所以一个想法可以对每个数据页对应一个mutex。获取锁的我们可以采用Crabbing Locking策略来完成,先上大锁,在执行刷脏的时候,释放大锁,并对每个数据页对应的mutex上锁。(这里可能需要修改FetchPage代码的顺序,来保证数据成员的线程安全性,简单来说就是把修改数据成员的操作放在释放大锁前)

到此我的优化基本思路就结束了,其他实现细节留给读者,相信说到这里,完成了P0,P1,P2的读者以及知道如何简单完成Leaderboard了。
完成优化2后,我的QPS从2K+升到了10K+.
完成优化1后,我的QPS从10K+升到了20K+.

截至26/02/2024,RANK1的QPS是50K,之后的都是20K~30K。哥们QPS是21K目前排第5。

待完善

我的实现并没有用到moodycamel::ReaderWriterQueue,也没有自己实现Promise,甚至没有用到条件变量和支持并发Evict(个人认为Evict函数没有并发的必要,因为函数本身执行的很快,没有耗费时间的地方,感觉优化前后作用可能不是很大)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值