[英]Increase Paho-MQTT publishers running on Azure Container Instances (Locust Load Test)
我们正在尝试使用 Azure 容器实例和 Python Paho-MQTT 库运行分布式 Locust MQTT 测试。 每个工作人员不能运行超过 340 个客户端。
OSError: [Errno 24] Too many open files.
该问题与以下问题有关:
使用 Docker,可以使用 --ulimit 更改软限制和硬限制,但 ACI 不接受 Docker 参数。
我们更改了 ACI 入口点以增加运行以下 bash 脚本的打开文件软限制:
ulimit -Sn 10000
locust
我们在 locustfile.py 中添加:
resource.setrlimit(resource.RLIMIT_NOFILE, (200000, 200000))
我们还尝试使用以下命令:
sudo sysctl -w fs.file-max=500000
sysctl -p
但它返回权限被拒绝的错误。
任何的想法?
这不是 ACI 问题,而是 Paho-MQTT 客户端的构建方式。 Paho 使用select(..)
方法限制我们打开超过 1024 个文件描述符。
每个 MQTT 客户端意味着 3 个打开的文件描述符:3 * 340 = 1020。超过 340 个客户端连接,我们达到了 1024 个打开的文件描述符。
我们使用从 Paho 客户端继承的 MQTT 用户。 我们覆盖了以下方法以使用 eventfd 包。
import eventfd
[...]
def loop_start(self) -> Optional[int]:
[...]
# self._sockpairR, self._sockpairW = _socketpair_compat()
self._wake_event = EventFD()
[...]
def _reset_sockets(self, sockpair_only: bool = False) -> None:
[...]
# if self._sockpairR:
# self._sockpairR.close()
# self._sockpairR = None
# if self._sockpairW:
# self._sockpairW.close()
# self._sockpairW = None
if self._wake_event:
self._wake_event = None
def _packet_queue(
self,
command: Literal[48],
packet: bytearray,
mid: int,
qos: int,
info: Optional[Any] = None,
) -> int:
[...]
# if self._sockpairW is not None:
# try:
# self._sockpairW.send(sockpair_data)
# except BlockingIOError:
# pass
if self._wake_event is not None:
with suppress(BlockingIOError):
self._wake_event.set()
[...]
def _loop(self, timeout: float = 1.0) -> int:
[...]
# if self._sockpairR is None:
# rlist = [self._sock]
# else:
# rlist = [self._sock, self._sockpairR]
if self._wake_event is None:
rlist = [self._sock]
else:
rlist = [self._sock, self._wake_event]
[...]
# if self._sockpairR and self._sockpairR in socklist[0]:
# socklist[1].insert(0, self._sock)
# try:
# self._sockpairR.recv(10000)
# except BlockingIOError:
# pass
if self._wake_event and self._wake_event.is_set():
self._wake_event.clear()
[...]
[...]
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.