首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >MongoDB-重建的同步驱动程序与异步驱动程序的Java性能

MongoDB-重建的同步驱动程序与异步驱动程序的Java性能
EN

Stack Overflow用户
提问于 2015-03-31 00:19:22
回答 1查看 1.4K关注 0票数 1

在过去的几个月里,我一直在使用YCSB0.1.4测试MongoDB 2.6.7。我捕捉到了比较固态硬盘和硬盘的良好数据,并且正在制作工程报告。

在我的测试完成后,我想探索allanbank异步驱动程序。当我启动并运行它时(我不是一名开发人员,所以这对我来说是一个挑战),我首先想尝试重建的同步驱动程序。我发现性能提高了30-100%,这取决于工作负载,并对此非常满意。

接下来,我尝试了异步驱动程序。我看不出它和我使用原生驱动的结果有多大的不同。

我正在运行的命令是:

代码语言:javascript
运行
复制
./bin/ycsb run mongodb -s -P workloads/workloadb -p mongodb.url=mongodb://192.168.0.13:27017/ycsb -p mongodb.writeConcern=strict -threads 96

在我的测试过程中(主要是使用本机驱动程序),我试验了超过96个线程;打开了"noatime";尝试了xfs和ext4;禁用了超线程;禁用了我的12个内核的一半;将日志放在不同的驱动器上;将同步从60秒更改为1秒;并检查了客户端和服务器之间的网络带宽,以确保其没有超额订阅(10GbE)。

欢迎任何反馈或建议。

EN

回答 1

Stack Overflow用户

发布于 2015-03-31 04:36:27

异步移动超出了我的预期。我的经验是使用Python Sync (pymongo)和异步驱动程序(马达),异步驱动程序实现了超过10倍的吞吐量。此外,motor仍然在幕后使用pymongo,但增加了异步能力。你的allanbank驱动程序很容易就是这种情况。

通常,戏剧性的变化来自线程策略和操作系统配置。

Async不需要也不应该使用比VM或机器上的核心更多的线程。例如,如果您的服务器代码正在为每个传入的conn产生一个新线程--那么所有的赌注都是无效的。首先看看驱动程序的使用方式。4核机器使用<= 4传入线程。

在操作系统层面上,你可能需要微调参数,比如net.core.somaxconn,net.core.netdev_max_backlog,sys.fs.file_max,/etc/security/limits.conf nofile,最好的开始就是查看nginx相关的性能指南including this one。nginx是许多linux sysadmin爱好者的先锋,或者至少引起了他们的注意。与流行的传说相反,人们应该减少保持连接超时,而不是延长它。默认的保持连接超时是一些荒谬的(4小时)秒数。你可能想在1分钟内剪断脐带。基本上,考虑一段短暂的甜蜜关系与你的客户关系。

请记住,Mongo不是异步的,因此您可以使用Mongo驱动程序池。尽管如此,不要让驱动程序在缓慢的查询中停滞不前。使用Java中的等价物在5到10秒内将其截断。我只是在这里剪切和粘贴,没有推荐。

代码语言:javascript
运行
复制
# Specifies a time limit for a query operation. If the specified time is exceeded, the operation will be aborted and ExecutionTimeout is raised. If max_time_ms is None no limit is applied.
# Raises TypeError if max_time_ms is not an integer or None. Raises InvalidOperation if this Cursor has already been used.
CONN_MAX_TIME_MS = None

# socketTimeoutMS: (integer) How long (in milliseconds) a send or receive on a socket can take before timing out. Defaults to None (no timeout).
CLIENT_SOCKET_TIMEOUT_MS=None

# connectTimeoutMS: (integer) How long (in milliseconds) a connection can take to be opened before timing out. Defaults to 20000.
CLIENT_CONNECT_TIMEOUT_MS=20000

# waitQueueTimeoutMS: (integer) How long (in milliseconds) a thread will wait for a socket from the pool if the pool has no free sockets. Defaults to None (no timeout).
CLIENT_WAIT_QUEUE_TIMEOUT_MS=None

# waitQueueMultiple: (integer) Multiplied by max_pool_size to give the number of threads allowed to wait for a socket at one time. Defaults to None (no waiters).
CLIENT_WAIT_QUEUE_MULTIPLY=None

希望你也能取得同样的成功。在异步之前我已经准备好放弃Python了

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29351239

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档