为什么Mongodb在Linux上比在Windows上性能更好?

我创build了一个程序来testing在Linux(Ubuntu)和Windows(Server2008)上的分片MongoDB性能。 由于插入大量的logging,Windows的磁盘的活动时间非常高(100%),然后性能非常差。 但在Ubuntu上,磁盘的util%为60%〜70%,性能比Windows好。 我可以在Linux上更好地说MongoDB的性能吗?

首先:Windows 2008服务器上的所有文件系统都非常非常低效。 与XFS或ext4相比,Windows和Linux文件系统都经过优化后,速度可以降低40%。

其次:延迟可能是一个问题。 当前Linux系统上的网络堆栈比在W2008服务器上要快。

第三:如果你的防火墙上运行着防火墙,延迟成为远程访问更大的问题。 尽管Linux的iptables足够快而且高效,以至于大部分的防火墙设备都基于它,但由于各种原因,可用于Windows的防火墙并非如此。

另外:Windows不像Linux那样有效。 MongoDB使用尽可能多的RAM(直到它需要的地方),例如将索引文件(副本)存储在RAM中。 Windows需要比Linux机器更大的可用RAM份额。 所以索引文件可能会从磁盘读取,而不是从RAM中读取,速度要慢几个数量级。

底线:在Windows系统上运行生产mongoDB是一个非常糟糕的想法。

编辑

按照评论中的要求:

  • 至于文件系统速度: 比较文件系统I / O性能:RedHat企业6与Microsoft Windows server 2012
  • 至于效率不高的RAM使用情况,您可能需要自行检查。 给定的Windows server系统在闲置时使用多少内存? 这与任何给定的Linux服务器怠速相比如何? 让我们很好,假设Windows服务器只需要128M的GUI – 这是128MB浪费。 乘以20,这不是一个大的群集大小,我们正在谈论的2.5 GB – 这可以很容易地组成一个配置服务器或仲裁,如果不是更多。 这将花费在GUI上,对于一个很少需要它的系统来说,如果有的话。 根据实际情况,您可能需要阅读比较CPU和内存性能:红帽企业Linux 6与Windows server 2012
  • 至于网络堆栈的速度,有多种来源,下面是我倾向于提到的两个:
    • TCP栈的比较性能比较老,但是我们谈的是数量级,至少给出了一个想法
    • 比较网络性能:红帽企业Linux 6与Windows server 2012

你可能已经认识到我引用了Principled Technologies的三个报告。 虽然我不以任何方式与他们有任何关系,但是,恕我直言,他们在使用行业标准基准测试来比较RHEL 6和Windows server 2012并明确优化相关任务的操作系统以及使用现成的操作系统方面做得很好。

有人可能会争辩说,这种比较并不能证明所有的GNU / Linux发行版都比Windows server 2012发行版快,我们所讨论的功能是由Linux内核提供的功能,通常不会被弄乱,所以可以认为类似结果可以从所有主要分布预计。

由于Linux的部分极端性能优势(Linux的TCP堆栈比Windows server对于大型消息大小快了近4倍,这在数据库应用中往往是这种情况),我重申了我的观点是在Windows系统上运行MongoDB生产的一个非常糟糕的想法。

你可以说MongoDB在Linux上的性能比Windows好,因为与其他许多数据库不同,MongoDB在很大程度上依赖于操作系统来执行内存映射文件操作。 正如在前面的回答中提到的那样,Windows server 2008 FS比Linux FS(ext4)慢很多,那么它确实有意义,MongoDB在Linux上的表现会比Windows好。 这也取决于你是否有32位或64位系统。