1

在过去的几个月里,我一直在使用 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)。

欢迎任何反馈或建议。

4

1 回答 1

0

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

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

异步不需要也不应该使用比虚拟机或机器上的内核更多的线程。例如,如果你的服务器代码为每个传入的 conn 生成一个新线程——那么所有的赌注都被取消了。首先查看驱动程序的使用方式。4 核机器使用 <= 4 个传入线程。

在操作系统级别,您可能需要微调 net.core.somaxconn、net.core.netdev_max_backlog、sys.fs.file_max、/etc/security/limits.conf nofile 等参数,最好的起点是查看nginx 相关的性能指南,包括这个。nginx 是带头或至少引起了许多 linux 系统管理员爱好者注意的服务器。与流行的传说相反,应该减少你的保活超时而不是延长它。默认的保持活动超时是一些荒谬的(4 小时)秒数。您可能想在 1 分钟内剪断电源线。基本上,考虑与您的客户建立短暂的甜蜜关系。

请记住,Mongo 不是异步的,因此您可以使用 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

于 2015-03-30T20:36:27.033 回答