最近在用python编写一个测试mongoDB性能的工具,过程中遇到了一些坑,记录一下:
1.使用多线程并发写mongoDB时的性能相比单线程没有提升,有些时候还有下降
答:网上搜了下,发现很多人都遇到过这个现象,mongoClient虽然默认提供了线程池,但实际情况并不乐观。
最终是使用了多进程的方法来提升读写性能,使用多进程后,读写性能大幅提升,代价是执行机的CPU资源利用率很高
2.使用multiprocessing时,报错can't pickle_thread.loack objects,无法开启多进程
答:这是pymongo的一个限制导致的。每个进程必须创建自己的MongoClient instance。不能多个进程共享MongoClient实例
3.关于fnv库。之前设计的思路是,可以根据指定的种子来随机生成冲突率很低的哈希值作为_id,这样读取时可以根据相同的种子来计算出_id值,从而实现使用_id值来读取document的功能。所以选择了fnv库的fnv1a_64来实现。但实际上,该方法只有在python2.7才能实现,在python3则不可以。原因是python3中,fnv1a_64算法的实现发生了改变,该算法自己提供了随机种子来生成hash值,从而最终用户无法准确给出_id值。