数据库如何在更快的磁盘上获得更差的基准测试结果?

How could database have worse benchmark results on faster disk?

我正在对来自 DigitalOcean (DO) 和 AWS EC2 (t3a.small) 的可比(2vCPU、2G RAM)服务器 (Ubuntu 18.04) 进行基准测试。

磁盘基准测试 (fio) 与 https://dzone.com/articles/iops-benchmarking-disk-io-aws-vs-digitalocean

的结果一致

总结:

做 --

阅读:bw=218MiB/s (229MB/s), 218MiB/s-218MiB/s (229MB/s-229MB/s), io=3070MiB (3219MB), 运行=14060- 14060 毫秒

写入:bw=72.0MiB/s (76.5MB/s), 72.0MiB/s-72.0MiB/s (76.5MB/s-76.5MB/s), io=1026MiB (1076MB), 运行=14060-14060毫秒

EC2--

阅读:bw=9015KiB/s (9232kB/s), 9015KiB/s-9015KiB/s (9232kB/s-9232kB/s), io=3070MiB (3219MB), 运行=348703- 348703 毫秒

写入:bw=3013KiB/s (3085kB/s), 3013KiB/s-3013KiB/s (3085kB/s-3085kB/s), io=1026MiB (1076MB), 运行=348703- 348703 毫秒

显示DO盘比EC2的EBS快10倍以上

但是,https://severalnines.com/database-blog/how-benchmark-postgresql-performance-using-sysbench 之后的 sysbench 显示 DO 比 EC2 慢(使用 Postgres 11 默认配置,oltp_legacy/oltp 上的读写测试。lua)

做 --

事务:14704(每秒 243.87)

延迟(毫秒):

分钟:9.06

平均:261.77

最大值:2114.04

第 95 个百分位数:383.33

EC2--

事务:20298(每秒 336.91)

延迟(毫秒):

分钟:5.85

平均:189.47

最大值:961.27

第 95 个百分位数:215.44

有什么解释?

顺序带宽和延迟/iops 是独立的参数。

一些工作负载(如数据库)依赖于大量小 IOs 的延迟。或大量小 IO 操作的吞吐量,iops(IOs 每秒)。

顺序 read/write 吞吐量对于大型顺序扫描、数据仓库、加载大型备份等内容很重要

您的基准测试是 OLTP,它执行大量小型快速查询。对于这个顺序吞吐量是无关紧要的。

对于读取 (SELECT),最重要的因素是有足够的 RAM 来将工作集保存在缓存中,而不是执行任何实际的 IO。否则,它是读取随机访问时间。

对于写入(UPDATE、INSERT),fsync 延迟(将数据提交到稳定存储所需的时间)是最重要的因素,因为数据库只会在写入数据时完成 COMMIT。

很可能 EC2 具有更好的随机访问和 fsync 性能。也许它使用 SSD 或电池供电的缓存。

除了其他人提到的 IOPS 与吞吐量。我还想指出,它们的数字非常相似。 240 tps 与 330 tps。你几乎可以通过吸尘、分析或让它在那里静置一段时间来增加或减少那么多。

可能还有其他因素。 CPU 速度可能不同,短时突发性能与节流重度用户可能有一种性能,可能存在或不存在 huge_pages、不同的缓存时序、内存速度或不同的 nvme 驱动程序。重点是240并没有你想象的那么少330

更新:还有一点要指出的是 OLTP read/write 事务不一定会受到磁盘性能的瓶颈。如果你关闭了同步,那么它真的不是。 我不确切知道 sysbench 遗留 OLTP 读写测试在做什么,但我怀疑它更像是一个银行 xaction 接触多个记录,使用索引,......它可能不是某种原始最大插入率或 MAX CRUD 操作率基准。

在针对 pg13 的重写基准测试中,我在桌面上获得了 1000 tps,但我可以每秒插入大约 50k 条记录,每条记录大约来自单个进程 python 批量期间的客户端负载。关闭同步后将近 100k。