Причины send_fail в статусе
Явление:
При выполнении команды status можно увидеть наличие send_fail. В чем причина?
Ответ:
Наличие send_fail обычно не является большой проблемой. Чаще всего это вызвано тем, что клиент намеренно закрыл соединение или не может получить данные, что приводит к сбою отправки данных.
Существует две причины send_fail:
-
При вызове интерфейса send для отправки данных клиенту обнаруживается, что клиент уже отключен, и счетчик send_fail увеличивается на 1. Поскольку клиент сам закрыл соединение, это считается нормальным явлением и обычно можно игнорировать.
-
Скорость отправки данных сервером превышает скорость их получения клиентом, что приводит к накоплению данных в буфере сервера (workerman создает отдельный буфер для каждой клиентской сессии). Если размер буфера превышает установленный лимит (TcpConnection::$maxSendBufferSize по умолчанию 1M), данные будут отброшены, что вызовет событие onError (если оно предусмотрено) и увеличит счетчик send_fail на 1.
Например, после минимизации окна браузера js может приостановить выполнение, в результате чего браузер приостанавливает получение данных от сервера. Данные долго накапливаются в буфере, и после превышения ограничения каждый вызов send приводит к увеличению счетчика send_fail на 1.
Итог:
Общее отключение клиента, приводящее к send_fail, обычно не вызывает беспокойства.
Если send_fail вызван тем, что клиент перестал получать данные, необходимо проверить, нормально ли функционирует клиент.
Если скорость получения данных клиентом постоянно ниже скорости отправки данных сервером, следует рассмотреть возможность оптимизации бизнес-процессов или повышения производительности клиента. Если проблемы с отправкой вызваны пропускной способностью, возможно, стоит увеличить пропускную способность сервера.