异步移动超出了我的预期。我的经验是使用 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