Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么与单线程客户端相比,多线程客户端的MongoDB性能更好?_Mongodb_Ycsb_Nosql - Fatal编程技术网

为什么与单线程客户端相比,多线程客户端的MongoDB性能更好?

为什么与单线程客户端相比,多线程客户端的MongoDB性能更好?,mongodb,ycsb,nosql,Mongodb,Ycsb,Nosql,最近,我们用YCSB()对Oracle 10g和MongoDB进行了基准测试,当我们试图增加1000000个数据集的线程数时,Oracle的性能在4个线程后保持不变,但MongoDB在8个线程之前的性能一直越来越好,之后只有读取、写入和更新(操作/秒)保持不变 我们在局域网上的2 CPU Xeon四核(共8核)+8 GB RAM上运行了这个基准测试 我们观察到,与单线程客户机相比,多线程客户机的MongoDB性能更好,我的问题是:当MongoDB可以在负载更大的情况下性能更好时,为什么不能在负载

最近,我们用YCSB()对Oracle 10g和MongoDB进行了基准测试,当我们试图增加1000000个数据集的线程数时,Oracle的性能在4个线程后保持不变,但MongoDB在8个线程之前的性能一直越来越好,之后只有读取、写入和更新(操作/秒)保持不变

我们在局域网上的2 CPU Xeon四核(共8核)+8 GB RAM上运行了这个基准测试


我们观察到,与单线程客户机相比,多线程客户机的MongoDB性能更好,我的问题是:当MongoDB可以在负载更大的情况下性能更好时,为什么不能在负载更少的情况下(比如说只有两个线程)执行相同的操作通过使用多核?

在逻辑上,在单个核上处理请求非常简单。只需编写接收请求并处理它的代码

在两个内核上处理一个请求并不是那么简单,因为这样做需要将请求分解为多个组件,分散工作,同步答案,然后构建一个响应。如果你做了这项工作,虽然你可以减少墙上的时钟时间(墙上的时钟看到通过的时间),但你总是会让请求占用更多的CPU时间(总CPU资源消耗)

在像MongoDB这样的系统中,您希望有许多不同的客户机发出请求,因此没有必要尝试并行处理单个请求,也没有任何理由不这样做


更大的问题是为什么Oracle在4个CPU之后没有增加并发性。有很多可能的原因,但一个合理的猜测是您遇到了某种类型的锁定,这是保证一致性所必需的。(MongoDB不提供一致性,因此避免了这种类型的瓶颈。)

Oracle不锁定数据以实现一致性,但它会将数据写入重做和撤消文件以实现事务和读取一致性。Oracle是一个MVCC系统。看

您必须使用参数化查询来提高Oracle的速度,否则Oracle将花费太多时间解析查询。当许多小查询同时运行时,这一点尤其重要,因为您正在测试这种情况

MongoDB不会锁定写操作

编辑1:


Oracle和MongoDB之间的另一大区别是耐用性。如果使用默认配置,MongoDB不会提供持久性。它每分钟向磁盘写入一次数据。Oracle每次提交时都会写入磁盘。所以Oracle做了更多的fsyncing

不知道你真正的意思…是的,这就是我对Oracle的怀疑,一个保持一致性的锁。我们从优化多核的角度考虑,例如,当只有2个并行客户端时,mongoDB应该能够优化2个CPU上的所有8核以获得更好的结果。在目前的情况下(2个并行客户机),其他6个核将处于空闲状态,而其他2个核不会给我8个核加在一起所能给我的性能,就像在低负载时CPU利用率不足一样。Oracle是MVCC,它不会锁定。@TTT:如果你认为Oracle不会锁定,那你就大错特错了。为了最大限度地提高并发性,Oracle已经竭尽全力提供了许多细粒度的短期锁。但在幕后,它绝对是在使用锁定来保证一致性,我个人也曾多次看到Oracle数据库由于模糊的锁定问题而在负载不足的情况下毫无预警地崩溃。(当您解决一个锁定问题时,您将遇到另一个问题。)@TTT:仅部分正确。在Oracle中,在负载下,对各种数据结构的访问在表的索引访问期间需要临时锁。我是在一位经验丰富的DBA诊断并修复了一个问题后了解到这一点的,他将更多的数据移动到索引中,这样查询就不必访问表,从而缩短了锁。YCSB的情况并非如此,因为它的客户端代码在默认配置中使用安全写入。至少在2012年秋季的驱动程序版本中是这样的(1.5年前),mongoDB的默认行为是在将控制权返回到编写客户端之前编写日志,这与Oracle的做法几乎相同。