db_bench笔记


–threads 指什么

这里只看写。thread 就是执行写的客户端线程,但是这个线程不仅仅是提交一个写请求,而是直接走完 RocksDB 的写流程,包括 WAL 和 Memtable 这些前台写入。深入 db-bench 代码可以看到,一个 thread 就是一个 ThreadBody(),而每一个用于写的 ThreadBody 最后都会执行 batch.Put()然后 db->Write(write_options_, &batch) 写入 DB,这个就是 RocksDB 的写入口,随后继续执行所有的前台写工作。

–num 和 –threads

当指定 –num = 1000 -threads = 4 时,不是指开四个线程合作写 1000 条,而是指每一条都写 1000,一共写 4000 条,这个可以在 ThreadBody() 中打日志看出来。所以如果想要确保总 num 一定,就要进行一次除,–num=250 – threads=4 这样。

多线程的 key 分布问题

当采取上述方法后,就面临了一个新的问题。每一个线程都会自己随机 key,这就导致了线程之间会有一定概率的 key 重合,而线程越多,重合的 key 也就越多。– num=1000 –threads=1 和 –num=250 –threads=4 虽然生成的总 kv 数一致,但是前者是在 [0,1000) 之间随机生成 key,后者是在 [0,250) 之间随机生成 key,且 4 线程并发生成。后者的随机范围小,所以重合的概率就高很多。

用 –writes 解决上述问题

–writes 指实际写入多少条 kv,默认情况下和 –num 同值。为了保证 key 的随机分布,可以让所有线程都在同一范围内生成 key,然后写入时整除就行。比如,– num=1000 –threads=1 –writes=1000 和 –num=1000 –threads=4 –writes=250,二者都是总共写入 1000 条 kv。不同于 –num=250 – threads=4,新的方式可以保证每个线程生成的 key 都是在 1~1000 间随机的,然后从其中选出 250 个进行写。极大降低了线程间的重合率。


文章作者: SrcMiLe
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 SrcMiLe !
评论
  目录