[英]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.