对于LevelDB,如何将随机写入的性能与所声称的“官方”性能报告相同?

时间:2012-02-22 15:01:06

标签: database performance benchmarking leveldb

leveldb的官方网站(http://code.google.com/p/leveldb/),有一份效果报告。我粘贴如下。

以下是官方leveldb基准

这是包含的db_bench程序运行的性能报告(包括解释)。结果有些嘈杂,但应该足以得到球场性能估计值。

设置

我们使用拥有一百万条目的数据库。每个条目都有一个16字节的密钥和一个100字节的值。基准测试使用的值压缩到原始大小的一半左右。 LevelDB:版本1.1

CPU:4 x Intel(R)Core(TM)2 Quad CPU Q6600 @ 2.40GHz

CPUCache:4096 KB

密钥:每个16字节

值:每个100字节(压缩后50个字节)

参赛作品:1000000

原始大小:110.6 MB(估计)

文件大小:62.9 MB(估计)

写性能

“填充”基准以顺序或随机顺序创建全新的数据库。

“fillsync”基准测试在每次操作后将数据从操作系统刷新到磁盘;其他写操作将数据保留在操作系统缓冲区缓存中一段时间​​。 “覆盖”基准测试执行更新数据库中现有密钥的随机写入。

fillseq:1.765 micros / op; 62.7 MB / s

fillsync:268.409 micros / op; 0.4 MB / s(10000 ops)

fillrandom:2.460 micros / op; 45.0 MB / s

覆盖:2.380微/ op; 46.5 MB / s

上面的每个“op”对应于单个键/值对的写入。即,随机写入基准是大约每秒400,000次写入

以下来自My leveldb benchmark

我为leveldb做了一些基准测试,但写入速度比报告少了100倍。

以下是我的实验设置:

  1. CPU:Intel Core2 Duo T6670 2.20GHz
  2. 3.0GB内存
  3. 32位Windows 7
  4. 不压缩
  5. options.write_buffer_size = 100MB
  6. options.block_cache = 640MB
  7. 我所做的很简单:我只输了200万{key,value}而且根本没有读取。密钥是一个字节数组,有20个随机字节,值也是一个字节数组,有100个随机字节。我不断地将新随机{key,value}放置200万次,而不进行任何操作。

    在我的实验中,我可以看到写作速度从一开始就降低了。瞬时速度(测量每1024次写入的速度)在50 / s到10,000 / s之间摆动。 我200万对的总体平均写入速度约为3,000 / s。写入的峰值速度为10,000 / s。

    由于报告声称写入速度可能是400,000 / s,我的基准测试写入速度慢了40到130倍,我只是想知道我的基准测试有什么问题。

    我不需要在这里粘贴我的测试代码,因为它非常简单,我只有200万次while循环,并且在循环内部,对于每次迭代,我生成一个20字节的密钥,以及100值的字节,然后将它们放到leveldb数据库中。我还测量了在{key,value}生成上花费的时间,它花费了0毫秒。

    任何人都可以帮我吗?如何用leveldb实现400,000 / s的写入速度?我应该改进哪些设置?

    由于

    而且

    我刚刚在我的机器上运行了官方db_bench.cc。它比报告慢28倍。

    我认为,当我使用他们自己的基准程序时,我的基准测试和他们的基准程序之间的唯一区别就是机器。

2 个答案:

答案 0 :(得分:3)

你有200万个键值对,每个键值对总共120个字节,所以2百万* 120个字节= 228 MB的数据!你的缓存是640 MB,所以你的所有数据很可能仍然在RAM中,而且它永远不会真正进入磁盘。正如Kitsune指出的那样:你的硬件远不及谷歌测试的那么快,如果谷歌具有相同的缓存大小,那么可以轻易地产生30倍的差异。

其他潜在问题:

  • 很难确切地知道密钥是如何“随机”的:LevelDB根据密钥的分布表现不同(即使它是“随机的”)。
  • 20字节密钥的效率低于16字节密钥,因为它们也不对齐。
  • 根据您的硬盘驱动器,您的磁盘写入速度可能会较慢(you check yours)。

我们可以继续进行,但是要考虑的变量太多了。如果您发布了一些演示测试如何运行的代码,那么我们可以推荐一些优化,以便您获得更好的性能。

答案 1 :(得分:1)

当您在完全不同的硬件上运行相同的基准测试时,您肯定会看到一些差异。

  • 你的CPU比9x弱2xCores@2.2GHz vs 16xCores@2.4GHz
  • 未提及您的硬盘和官方基准驱动器(光纤NAS与固态驱动器SSD与硬盘驱动器HDD)

无法将苹果与橙子或苹果比较为[未知水果]。