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

时间:2015-03-30 16:19:22

标签: performance mongodb mongodb-java ycsb

我使用YCSB 0.1.4测试了过去几个月的MongoDB 2.6.7。我已经捕获了比较SSD和HDD的良好数据,并且正在制作工程报告。

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

接下来,我尝试了异步驱动程序。我无法看到它与我的原始驱动程序的结果之间存在很大差异。

我正在运行的命令是:

./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)。

欢迎任何反馈或建议。

1 个答案:

答案 0 :(得分:0)

异步移动超出了我的预期。我的经验是使用Python Sync(pymongo)和Async驱动程序(motor),Async驱动程序的吞吐量大于10倍。此外,马达仍然在引擎盖下使用pymongo但增加了异步能力。你的allanbank司机很容易就是这种情况。

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

异步不需要并且不应该使用比VM或机器上的核心更多的线程。例如,如果您的服务器代码为每个传入的conn生成一个新线程 - 则所有投注都将关闭。首先看一下驱动程序的使用方式。 4核机器使用< = 4个传入线程。

在操作系统级别,您可能需要微调net.core.somaxconn,net.core.netdev_max_backlog,sys.fs.file_max,/ etc / security / limit.conf nofile等参数以及最佳启动位置正在研究与nginx相关的性能指南including this one。 nginx是引领或至少引起许多linux系统管理员爱好者关注的服务器。与流行的传说相反,应该减少你的keepalive超时而不是延长它。默认的保持活动超时是一些荒谬的(4小时)秒数。你可能想在1分钟内切断电源线。基本上,想想与您的客户关系的短暂甜蜜关系。

请记住,Mongo不是Async,因此您可以使用Mongo驱动程序池。尽管如此,不要让司机因慢速查询而停滞不前。使用Java中的以下等效项在5到10秒内将其剪掉。我只是在这里切割和粘贴而没有任何建议。

# 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