簡體   English   中英

增加在 Azure 容器實例上運行的 Paho-MQTT 發布者(Locust 負載測試)

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

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM