开源了自己写的共识库Dragonboat。在各类反馈里发现一些用户对硬盘性能有不少基础性误解,但仔细想来这些坑自己一样踏过。本文从一个软件工程师角度,仅从软件使用角度来看,分享一路走来踏过的几个硬盘性能误解,方便大家绕坑而行。

SATA 对 NVME

故事首先是从使用Google云提供的本地NVME盘开始的。“本地NVME盘“,故名思议,应该是高性能的吧?它IOPS数据靓丽,带着Google招牌的光环,一定不会水啊。跑了一下Dragonboat的跑分模式,得分惨不忍堵,NVME盘跑出的性能比7年前的SATA SSD都烂。

诸如共识算法,各类数据库以及各类需要WAL的软件都需要确保数据确实被保存到硬盘上了,确保比如掉电重启后,数据依旧完好可用。fsync()就是起到这个作用,它确保操作系统缓存内的写数据以及磁盘上缓存的写数据,被确实保存能挺过掉电重启。数据库里一个写数据的transaction和共识算法里一个Proposal的完成,都需要确保数据已落盘,共识算法更需要数据在多数机器上完成落盘。fsync()的延迟性能对上述系统的吞吐均有最直接影响。Google云本地NVME盘的蜗牛速度,是不是fsync()特别慢引起的呢?

祖传工具pg_test_fsync该登场了

正确测试fsync()相关的各项性能,一大圈工具使用下来加上自己撸的,发现还是PostgreSQL数据库自带的这个pg_test_fsync工具最直观好用。下图是pg_test_fsync在Google云提供的本地NVME盘的跑分结果,Google云本地NVME盘的靓丽IOPS数据下,fsync()每次近需要4.4毫秒,和高速的机械盘一个量级。其他用户也发现了这一奇葩问题。


作为对比,Intel S3700/S3710,Intel 320和镁光500DC等等常见SATA固态硬盘的测试结果显示它们的fsync()延迟是0.15-0.2毫秒左右,比Goole云本地NVME盘足足低几十倍。Intel S3700的pg_test_fsync结果是这样的:

而NVME的Intel P3700的结果如下,差别是客观的,但并不是上述那种几十倍的差距:

以共识算法来说,其理论延迟极限是一次fsync()的延迟加上一次网络RTT延迟。简单计算可知,上述Google云的NVME的fsync()延迟决定了其单client的共识吞吐不可能超过每秒230次,而如果换用SATA的S3700,得益于其0.2毫秒的fsync(),单client共识吞吐理论上限即刻提升为5000次。SATA的S3700秒杀Google云上的奇葩NVME盘。

容量、吞吐、IOPS数甚至寿命都可以通过多盘来堆叠,而这个fsync()延迟,没有任何取巧近路。上述NVME和SATA的对比可见NVME与否并不是最核心的关键因素。SATA与NVME的差异,是几十微秒量级的,而具体差异产生的原因,网络上的介绍文章铺天盖地,这里不复述。上述NVME比SATA慢几十倍的实例,客观显示真正性能差异不在SATA/NVME这一点。

消费级 对 企业级SSD盘

另一常见大坑就是在开发、测试环境上使用消费级SSD,比如三星的NVME M.2固态硬盘价低量足,IOPS数据比肩企业级产品,在非生产环境使用,初一听似乎有一定道理。其实,这种误解用FreeBSD开发人员贴出的数据来对比说明最直接。同样是写盘以后fsync()落盘,比较的是古董级的Intel 710企业级SATA硬盘和高端家用级的Samsung 950 PRO这款NVME盘,家用级是绝对不应该用的,哪怕是开发测试环境:

上述第三方数据也再次验证SATA/NVME的差异不是核心关键,NVME的家用盘的落盘写延迟是古董级Intel 710这款SATA盘的11倍,完全绝对不适用于共识算法、数据库等领域。如果开发测试环境单机吞吐是生产环境的1/10,而这样的差异仅仅是为了几百人民币的固态盘差价,显然是很得不偿失的。

具有掉电保护的缓存

传统的企业级硬盘都带有掉电保护功能,初听起来是一个为数据完整性设计的东西,目的是让硬盘在掉电的时候不丢失其缓存内尚未写入到磁盘的数据。其实有无掉电保护下的缓存恰恰正是上述fsync()性能巨大差异的原因

在具有掉电保护企业盘里,当fsync()的时候,数据只要成功写入SSD卡上的内存缓存里就可以回复主机报告落盘完成,因为即使系统突然掉电,电容内的电量足够确保维持供电直到缓存内的数据安全落盘写入NAND。而不具备掉电保护的奇葩级企业盘,比如上述Google云的本地NVME盘,以及NVME的Samsung 950 PRO这款家用盘,每次均必须把数据实打实写到NAND存储芯片里。写NAND的物理延迟就是平均毫秒级别的,这和SATA与NVME均无关。

下图是AnandTech对几种常见NAND芯片性能的比较。以Intel P3700为例,它是最典型MLC NAND的固态盘,所用的NAND的写延迟就是1ms,之所以可以在100微秒内完成落盘,就是因为数据是被在掉电保护机构配合下可靠写入缓存,而非写入了MLC NAND。

此处的一大坑就是过度片面追求SLC/MLC/TLC这类NAND类型带来的性能差异,最好服务器都用SLC/MLC颗粒。这首先不是产品趋势,其次上述的分析已经清楚展示了最直接的吞吐相关的因素是掉电保护系统,恰恰就是通过它完全规避了NAND写延迟,才有良好的落盘写性能。NAND类型真的不必苛求,选大厂比如Intel的企业盘,确保掉电保护的完好性自检没有问题,选写入寿命扛得住的,这才是关键。

Intel傲腾

Optane从原理上避免了对基于内存的缓存的需求,没有了这个内存缓存,自然就不需要掉电保护这一东西。它读写延迟均更低,不用缓存不用掉电保护,落盘写就是在20-30微秒。它除了价格贵,包括寿命在那的各项指标没有一样不出彩的。特别指出这一最新发展,但不做具体展开。

共识算法不需要大量的高速低fsync()延迟存储空间

成熟的共识算法库以及数据库系统,一般均支持指定一个WAL存储位置,将它指向Optane或者带掉电保护的低fsync()延迟的固态盘,对系统性能帮助极大。此类WAL数据一般不大,在不少测试过的场景一般100G左右就足够,这也正是Intel P4801X这样固态盘只有100G大的原因。切勿错误理解为用了共识算法那所有数据都必须放低落盘写延迟的固态盘上。

结论

  • 落盘写延迟是共识算法、数据库等应用最核心硬盘指标
  • SATA和NVME的落盘写延迟差异,远小于掉电保护的有无带来的延迟差异
  • PostgreSQL自带的pg_test_fsync工具能方便检测落盘写性能,200微秒以上的固态盘建议直接走报废流程或调换至于共识算法、数据库不相关领域。

最后,您试用Dragonboat这个高性能多组Raft库了吗? 欢迎尝试并点赞支持。

注:

SATA和NVME实际不是一个层面的东西,SATA Express完全可以走NVME而非AHCI,但这与本文观点无关且无冲突。技术文章不咬文嚼字,不玩文字游戏,因此不简单问题复杂化,不做过度展开。

fdatasync()在历史版本的内核以及老旧的文件系统里有数据丢失问题,且近代的SSD两者性能已经基本等同,这里不分别讨论。

TiDB的两位大佬正确指出,Google云的本地NVME盘较奇葩,必须挂载的时候加nobarrier。加上以后,我的测试中延迟有显著改善,在350微秒左右依旧比SATA的S3700都烂,而其它各类云上的NVME盘能轻松达到100微秒左右的fsync延迟性能。

从共识算法开谈 - 硬盘性能的最大几个误解相关推荐

  1. 分布式一致性与共识算法

    区块链技术是近几年逐渐变得非常热门的技术,以比特币为首的密码货币其实已经被无数人所知晓,但是却很少有人会去研究它们的底层技术,也就是作为一个分布式网络比特币等加密货币是如何工作的. 无论是 Bitco ...

  2. 浅谈 CAP 和 Paxos 共识算法

    点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试文章 作者:郑勰,腾讯 CSIG 网络产品部后台开发工程师 什么是 CA ...

  3. 硬货 | 浅谈 CAP 和 Paxos 共识算法

    点击上方"朱小厮的博客",选择"设为星标" 后台回复"加群"获取公众号专属群聊入口 什么是 CAP 关于 CAP 理论的背景介绍已经很多,这 ...

  4. 《迅雷链精品课》第十五课:共识算法的性能问题

    1. 区块链的性能问题 VISA是目前世界上广泛使用的信用卡品牌,区块链要达到实用水平,性能上至少需要能跟VISA之类的支付系统作比较.根据VISA在2015年的记录,全年共产生92,064百万笔支付 ...

  5. 数据库浅谈之共识算法

    数据库浅谈之共识算法 HELLO,各位博友好,我是阿呆

  6. poc白皮书通证经济体系_区块链中的PoC共识算法是什么意思?

    共识算法是区块链技术的核心要素, 由于区块链的快速发展,共识已得到各界关注,它将人类带入数学领域的信任时代,因为有共识的存在,人类可以展开无信用抵押的大规模协作,它不仅重构了生产关系,塑造了价值网络, ...

  7. 分布式共识算法 (Consensus Algorithm)

    分布式共识算法 (Consensus Algorithm) 如何理解分布式共识? 多个参与者 针对 某一件事 达成完全 一致 :一件事,一个结论 已达成一致的结论,不可推翻 有哪些分布式共识算法? P ...

  8. 分布式共识算法丨Raft丨Raft-Extended 论文翻译

    Raft-Extended 翻译 原文:https://pdos.csail.mit.edu/6.824/papers/raft-extended.pdf 辨析 consensus vs consis ...

  9. 就是这35个人,率先入选了《共识算法高阶课》第一期!

    本文的主要内容是硅谷密探<区块链共识算法(高阶)实战必修课>第一期全体 35位入围成员的完整名单. 可能有人还不熟悉<区块链共识算法(高阶)实战必修课> ,这是硅谷密探和知乎& ...

最新文章

  1. fedora mysql默认密码忘记_Linux fedora 24 忘记密码图形化界面修改root密码的方法
  2. MySQL查看与修改编码方式(mysql、数据库、表)
  3. UNIX网络编程笔记(3):简单的并发服务器
  4. 决策树ID3和C4.5
  5. Nginx配置——禁止指定user_agent
  6. 华为防火墙ssl xxx配置
  7. php字体颜色代码大全,CSS中关于文本字体颜色(CSS color)的详解
  8. 定位点击WebBrowser、点击Flash、偷菜外挂
  9. 3 Linux虚拟机创建修改删除文件和文件夹
  10. Visual Leak Detector VS2019
  11. 未禁用nouveau导致Ubuntu安装Cuda的runfile安装方法出错:[ERROR]: Install of 455.32.00 failed, quitting
  12. com.android.phone已停止无限重启,Android Q没法用,大批用户反馈手机无限重启
  13. 基于Keras2《面向小数据集构建图像分类模型》——Kaggle猫狗数据集
  14. C++ Primer Plus 第六版第二章编程练习答案
  15. 计算机软件系统举例,什么是系统软件应用软件举例说明
  16. 简单高效记账本的具体操作方法
  17. 阿里计算机视觉笔试题,【阿里巴巴】计算机视觉算法面经(最新)
  18. 号外!号外!仅需5000元,即可配置Apollo计算平台!
  19. Unity动画☀️7. 通过MatchTarget匹配跳墙动画、Vector3、获取动画层GetCurrentAnimatorStateInfo(a).IsName(b)
  20. 教程:用强化学习玩转恐龙跳跳

热门文章

  1. 测试案例(五个案例)
  2. 两个软硬程度一样的鸡蛋,它们在某一层摔下会碎,有个100层的建筑,要求最多用两个鸡蛋确 定鸡蛋安全下落的临界位置,给出临界位置?如果是n层楼,m个鸡蛋,请给出确定临界位置的算法
  3. Altium Designer中如何实现元件Designator自动编号
  4. radare2 和 EVM
  5. 北塔曾经很张狂 如今沉默为哪桩
  6. 银行大数据风控管理针对哪些应用场景?
  7. Python常用内置函数enumerate()详细用法介绍
  8. 计算机视觉论文-2021-07-15
  9. 龙的战争 Dragon ‘s War
  10. Ansible配置执行远程主机的ssh端口号