行转列的 k-v 数据库
leveldb 性能测试 LevelDB 还有一个特点是 —— 写性能远高于读性能 “先说随机写,它的写都是先记录到日志文件去的,在日志文件满之前只是简单的更新memtable,那么就把随机写转化成了顺序写。在日志满了后,把日志里面的数据排序写成sst表同时和之前的sst进行合并,这个动作也是顺序读和写。大家都知道传统磁盘 RAID 的顺序读写吞吐量是很大的,100M左右是没有问题。在写日志文件的时候,用到是buffer IO,也就是说如果操作系统有足够的内存,这个读写全部由操作系统缓冲,效果非常好。即使是sync写模式,也是以数据累计到4K为一个单位写的,所以效率高。那么随机读呢?这个它解决不了。但是ssd盘最擅长随机读了。这个硬件很自然的解决了这个问题。所以leveldb的绝配是ssd盘的raid.” http://blog.yufeng.info/archives/1327
为什么选4k,因为4KB是现代SATA接口下的最小数据块规模,数字更小可能受压缩、命令流程控制的影响,而数字更大则会受连续访问的影响。那对于 PCI-e SSD,可以放大4k 了?对于 SSD 来说,读的性能更能反映其性能,因为写可能是先写到缓存中。
https://github.com/google/leveldb 公司电脑,SSD KINGSTON SA400S37240G, i5 CPU
fandeMac:leveldb fan$ ./out-static/db_bench
LevelDB: version 1.20
Keys: 16 bytes each
Values: 100 bytes each (50 bytes after compression)
Entries: 1000000
RawSize: 110.6 MB (estimated)
FileSize: 62.9 MB (estimated)
WARNING: Snappy compression is not enabled
------------------------------------------------
fillseq : 4.430 micros/op; 25.0 MB/s
fillsync : 51.263 micros/op; 2.2 MB/s (1000 ops)
fillrandom : 3.984 micros/op; 27.8 MB/s
overwrite : 4.235 micros/op; 26.1 MB/s
readrandom : 4.318 micros/op; (1000000 of 1000000 found)
readrandom : 3.711 micros/op; (1000000 of 1000000 found)
readseq : 0.166 micros/op; 668.0 MB/s
readreverse : 0.308 micros/op; 359.0 MB/s
compact : 693897.000 micros/op;
readrandom : 2.339 micros/op; (1000000 of 1000000 found)
readseq : 0.139 micros/op; 795.4 MB/s
readreverse : 0.246 micros/op; 450.2 MB/s
fill100K : 4904.830 micros/op; 19.4 MB/s (1000 ops)
crc32c : 1.066 micros/op; 3663.8 MB/s (4K per op)
snappycomp : 3374.000 micros/op; (snappy failure)
snappyuncomp : 3202.000 micros/op; (snappy failure)
acquireload : 12.601 micros/op; (each op is 1000 loads)
fillsync 快了很多,官方的测试是机械硬盘,sync会写到硬盘,所以 ssd 快了很多。但是 fillseq 慢了很多啊。这个测试更多是 IO 相关吧,难道也看 CPU?fillseq 其实是写到缓存中的,所以和 CPU+内存有关系。 随机读快了,但是也不是快很多。按道理ssd 比机械硬盘要快很多啊。SSD 垃圾了点?差不多所有的 ssd 4k 随机读取速度为20 ~ 30 MB/s,这个和上面的基本吻合。但是机械硬盘一般只有0.7 MB/s啊,差不多慢了30倍。而官网 readrandom : 16.677 micros/op; 不成比例啊。难道上面测试的随机读不是4k?
root@great-silverstone:~/leveldb# out-static/db_bench
LevelDB: version 1.20
Date: Fri Oct 27 17:33:05 2017
CPU: 8 * AMD Opteron(tm) Processor 4386
CPUCache: 2048 KB (L2缓存?)
Keys: 16 bytes each
Values: 100 bytes each (50 bytes after compression)
Entries: 1000000
RawSize: 110.6 MB (estimated)
FileSize: 62.9 MB (estimated)
WARNING: Snappy compression is not enabled
------------------------------------------------
fillseq : 4.420 micros/op; 25.0 MB/s
fillsync : 42371.754 micros/op; 0.0 MB/s (1000 ops)
fillrandom : 13.551 micros/op; 8.2 MB/s
overwrite : 20.956 micros/op; 5.3 MB/s
readrandom : 6.782 micros/op; (1000000 of 1000000 found)
readrandom : 4.308 micros/op; (1000000 of 1000000 found)
readseq : 0.224 micros/op; 492.8 MB/s
readreverse : 0.381 micros/op; 290.2 MB/s
compact : 3167857.000 micros/op;
readrandom : 2.745 micros/op; (1000000 of 1000000 found)
readseq : 0.188 micros/op; 587.0 MB/s
readreverse : 0.329 micros/op; 335.7 MB/s
fill100K : 6323.643 micros/op; 15.1 MB/s (1000 ops)
crc32c : 2.097 micros/op; 1862.8 MB/s (4K per op)
snappycomp : 4879.000 micros/op; (snappy failure)
snappyuncomp : 4490.000 micros/op; (snappy failure)
acquireload : 0.666 micros/op; (each op is 1000 loads)