对于LevelDB,如何获得与声称的“官方”性能报告相同的随机写入性能?
-
29-10-2019 - |
题
leveldb的官方站点(http://code.google.com/p/leveldb/)上有一份性能报告。我粘贴如下。
以下来自官方的leveldb基准
这是包含的db_bench程序运行时的性能报告(带有说明)。结果有些嘈杂,但应该足以估算出性能。
设置
我们使用的数据库有100万个条目。每个条目都有一个16字节的密钥和一个100字节的值。基准测试所使用的值压缩到其原始大小的一半左右。 LevelDB:1.1版
CPU:4 x Intel(R)Core(TM)2四核CPU Q6600 @ 2.40GHz
CPU缓存:4096 KB
键:每个16个字节
值:每个100字节(压缩后50字节)
条目:1000000
原始大小:110.6 MB(估计)
文件大小:62.9 MB(估计)
编写效果
“填充”基准按顺序或随机顺序创建一个全新的数据库。
每次执行操作后,“ fillsync”基准都会将数据从操作系统刷新到磁盘;其他写入操作会将数据保留在操作系统缓冲区高速缓存中一会儿。 “覆盖”基准测试会随机写入,以更新数据库中的现有密钥。
fillseq:1.765 micros / op; 62.7 MB /秒
fillsync:268.409微秒/操作; 0.4 MB / s(10000次操作)
填充随机性:2.460 micros / op; 45.0 MB /秒
覆盖:2.380 micros / op; 46.5 MB /秒
上面的每个“ op”对应于单个键/值对的写入。也就是说,随机写入基准测试的结果为每秒大约40万次写入。
下面是我的leveldb基准
我为leveldb做了一些基准测试,但是写入速度比报告低了100倍。
这是我的实验设置:
- CPU:Intel Core2 Duo T6670 2.20GHz
- 3.0GB内存
- 32位Windows 7
- 不压缩
- options.write_buffer_size= 100MB
- options.block_cache= 640MB
我做的事情很简单:我只输入了200万个{键,值},根本没有读取。密钥是具有20个随机字节的字节数组,值也是具有100个随机字节的字节数组。我不断地将新随机的{key,value}放置200万次,而没有进行任何其他操作。
在我的实验中,我可以看到写作的速度从一开始就下降了。即时速度(测量每1024个写入的速度)在50 / s到10,000 / s之间摆动。而且我对200万对的总体平均写入速度约为3,000 / s。写入的峰值速度为10,000 / s。
该报告声称写入速度可以达到400、000 / s,基准测试的写入速度要慢40到130倍,我只是想知道基准测试出了什么问题。
我不需要在这里粘贴测试代码,因为这非常容易,我只需要执行一次while循环200万次,并且在循环内部,对于每次迭代,我都会生成20个字节的密钥和100个字节值,然后将它们放入leveldb数据库。我还测量了花费在{key,value}生成上的时间,它花费了0毫秒。
有人可以帮我吗?如何使用leveldb实现400,000 / s的写入速度?我应该改善哪些设置?
谢谢
此外
我只是在机器上运行了官方的db_bench.cc。它比报告慢了28倍。
我认为当我使用他们自己的基准测试程序时,我的基准测试与他们的基准测试之间的唯一区别是机器。
我做的事情很简单:我只输入了200万个{键,值},根本没有读取。密钥是具有20个随机字节的字节数组,值也是具有100个随机字节的字节数组。我不断地将新随机的{key,value}放置200万次,而没有进行任何其他操作。
在我的实验中,我可以看到写作的速度从一开始就下降了。即时速度(测量每1024个写入的速度)在50 / s到10,000 / s之间摆动。而且我对200万对的总体平均写入速度约为3,000 / s。写入的峰值速度为10,000 / s。
该报告声称写入速度可以达到400、000 / s,基准测试的写入速度要慢40到130倍,我只是想知道基准测试出了什么问题。
我不需要在这里粘贴测试代码,因为这非常容易,我只需要执行一次while循环200万次,并且在循环内部,对于每次迭代,我都会生成20个字节的密钥和100个字节值,然后将它们放入leveldb数据库。我还测量了花费在{key,value}生成上的时间,它花费了0毫秒。
有人可以帮我吗?如何使用leveldb实现400,000 / s的写入速度?我应该改善哪些设置?
谢谢
此外
我只是在机器上运行了官方的db_bench.cc。它比报告慢了28倍。
我认为当我使用他们自己的基准测试程序时,我的基准测试与他们的基准测试之间的唯一区别是机器。
解决方案
您有200万个键值对,每个键值对共计120个字节,因此200万* 120字节= 228 MB的数据!您的缓存为640 MB,因此很有可能所有数据仍在RAM中,并且从未真正存入磁盘。正如Kitsune所指出的那样:您的硬件远没有Google测试过的硬件快,并且如果Google具有相同的缓存大小,那么可以很容易产生30倍的差异。
其他潜在问题:
- 很难确切知道键的“随机性”:LevelDB的执行情况取决于键的分布(即使它是“随机”)。
- 20字节密钥的效率要比16字节密钥低,因为它们也无法对齐。
- 取决于您的硬盘驱动器,磁盘的写入速度可能会较慢(您检查您的)。
我们可以不断进行下去,但是要考虑的变量太多了。如果您发布了一些代码来演示测试的运行方式,那么我们将建议您进行一些优化,以便获得更好的性能。
其他提示
当您在完全不同的硬件上运行相同的基准测试时,一定会发现一些差异。
- 您的CPU的2xCores@2.2GHz比16xCores@2.4GHz弱9倍
- 未提及您的硬盘驱动器和官方基准测试的驱动器(光纤NAS与固态驱动器SSD与硬盘驱动器HDD)
不能将苹果与桔子或苹果与[未知水果]进行比较。