paper: https://pdos.csail.mit.edu/6.824/papers/farm-2015.pdf
课程:https://www.bilibili.com/video/BV1R7411t71W?p=14
1. 用自己的话概括
虽然自称“分布式计算平台”,但看着就是个分布式内存数据库。
实验品,想在追求极限性能的同时保证可用性、一致性等。因此灵魂就是堆各种工程上的优化技巧来优化性能(主要是用特殊硬件做优化):
- 因此只考虑单机房,不考虑跨地域(跨地域会导致性能下滑,做那么多工程优化带来的优化量级远小于跨机房损耗,导致这些优化白做,没有写论文的价值了)
- 写磁盘是瓶颈,那就不写磁盘,用nvram
- 传统rpc(网络IO)走kernal,其实可以做些操作系统层的优化,优化网络IO
2. NVRAM
首先要优化掉的是磁盘访问,不然优化rpc收益不大。
平时不写磁盘、只写RAM,RAM带上电池,断点时电池能撑几分钟,在这几分钟内刷盘。
缺点是:虽然对断电容错,但对crash不容错,如果机器crash重启了数据还是丢了。解决思路是repliicate,每次写多个系统的RAM(假设全体crash的概率低)
个人觉得这还是有丢数据风险,其实可以优化一下,比如主节点写log,但是从节点写NVRAM
3. 网络优化(RPC优化)
3.1. kernal bypass:DPDK
3.1.1. 解释
传统网络io要系统调用、走kernal,要多次拷贝数据
image.png
优化思路是让用户空间不通过kernel直接操作网卡,相应的就得在用户空间实现各种网络协议(例如tcp)
image.png
3.1.2. 业界对kernel bypass的使用情况
同事说之前他们做网关会用DPDK,一般也只有网关这种追求极限性能的场景愿意魔改底层基础设施来做优化。
查了下比如网络防火墙会用kernel bypass,但是
DPDK框架本身提供的能力还是比较裸的,要使用DPDK实现防火墙功能,必须重新实现TCP/IP协议栈,这对于任何人来说都不是一件容易的事情
于是有很多更上层的网络协议封装
https://blog.csdn.net/gengzhikui1992/article/details/86712367
Q: 微服务RPC的瓶颈一般在什么地方?值不值得做这种优化?
A: 不太值得,瓶颈在处理请求的部分。相当于走kernel这部分不占大头,大头在用户空间、在处理请求的部分(序列化反序列化、业务处理等)
比如知乎讨论如果让计算机不使用操作系统做服务器性能上是否会更有优势?
3.2. RDMA
3.2.1. 解释
装上特殊的RDMA网卡,机器能远程直接访问别的机器的内存,往里面读写数据但不需要对方机器中断、不需要对方机器和app感知到
image.png
FaRM使用的是one-sided RDMA(单向?)
3.2.2. How to combine RDMA with transaction,sharding and replica?
FaRM答案的是能拿RDMA来做读操作、读远程内存里的db数据,但是不拿来做写操作。
这就导致FaRM不能用锁来做并发控制:读操作不能做锁逻辑,读操作必须是足够简单、一定读到正确数据,所以FaRM用乐观并发控制。
魔改了一套分布式事务协议,2pc+主备冗余做分布式事务,乐观并发控制做可串行化隔离级别(个人理解是Serializable snapshot isolation),里面有各种优化、把正常请求改成用RDMA读远程内存
具体太复杂了,看视频吧。大概流程用自己的话解释一下:
- 先把用到的数据查出来(作为本地快照),在自己的快照上做修改、不管是否有可能冲突
- 到真正要commit的时候,开始2pc协议
- prepare: 把数据发给每个节点,让他们做validation,验证成功的话要上锁(并不是说OCC就不需要锁了),相当于做出了承诺、不能再反悔
- commit/abort:全投票成功的话就commit。这里不仅发消息给主,还发给从
- 全commit完了之后发消息告诉每个参与者,可以把这次事务相关的log删了。个人理解这次网络通信其实可以优化掉,比如跟着下次消息piggyback
这里 也有别人的笔记.
个人感想
-
硬件优化的炫技全家桶。
容错分布式系统近几年能火起来是因为google带头,嫌传统高性能计算集群或者某些高端数据库的专用硬件太贵了,想用商用机器、普通硬件做分布式存储、计算,通过设计出精巧的软件,用一堆普通机器做原来只有高端硬件能做的事。但现在软件设计的很成熟了,大家又开始往里面加塞硬件优化。
用新硬件优化数据库似乎是学术界的一个研究热点,见讨论https://www.zhihu.com/question/318554064 -
不一定非得用NVRAM
现实世界中很多内存型数据系统可以用这些网络优化技巧,比如分布式缓存,比如全局自增id的发号服务(预先从db申请号段,内存发号)
网友评论