libwebsockets: большая задержка перед отправкой ответа

Модератор: Модераторы разделов

IMB
Сообщения: 2555
ОС: Debian

libwebsockets: большая задержка перед отправкой ответа

Сообщение IMB »

Доброго дня!
Использую https://libwebsockets.org/ 4.3.1, приложение запускает websocket-сервер, при приёме команды делает работу и возвращает ответ.
Код callback-а упрощёно выглядит так

Код: Выделить всё

..........
switch (reason) {
.........
case LWS_CALLBACK_ESTABLISHED:
    // запоминаем клиента
    break;
case LWS_CALLBACK_RECEIVE:
    // запускаем поток выпонения команды
    break;
case LWS_CALLBACK_SERVER_WRITEABLE:
    // отправляем ответ клиенту
    break;
......
}
В потоке выполнения команды по окончанию выполняется lws_cancel_service(context).
Приложение нормально отрабатывает на x86_64 хосте, но вот перенёс на железку и наблюдаю странную картину - приложение получает команду, отрабатывает её, вызывает lws_cancel_service(context), но ответ клиент получает только через 5 мин, т.е. между событиями LWS_CALLBACK_RECEIVE и LWS_CALLBACK_SERVER_WRITEABLE проходит 5 мин, что конечно неприемлимо долго.
В описании https://libwebsockets.org/lws-api-doc-master/html/group__service.html#ga29c246707997ab7a466aa709aecd2d7b
lws_cancel_service() - Cancel wait for new pending socket activity

Parameters
context Websocket context

This function creates an immediate "synchronous interrupt" to the lws poll() wait or event loop. As soon as possible in the serialzed service sequencing, a LWS_CALLBACK_EVENT_WAIT_CANCELLED callback is sent to every protocol on every vhost.

lws_cancel_service() may be called from another thread while the context exists, and its effect will be immediately serialized.
Неужто так проявляется As soon as possible и можно ли это убыстрить?
Включение отладочного вывода через lws_set_log_level(LLL_ERR | LLL_WARN | LLL_NOTICE | LLL_INFO | LLL_DEBUG | LLL_EXT | LLL_CLIENT | LLL_LATENCY | LLL_USER | LLL_THREAD, NULL) не прояснило так как я не увидел ни одного вывода из библиотеки после получения команды от пользователя, весь вывод был до установления соедининения с сервером и касался его запуска.
Спасибо.
Спасибо сказали:
IMB
Сообщения: 2555
ОС: Debian

Re: libwebsockets: большая задержка перед отправкой ответа

Сообщение IMB »

Опыт показал что была проблема в функции lws_plat_pipe_signal(), cmake обнаружил evenfd_read() и решил использовать механизм eventfd, но на устройстве eventfd_write() завершался с errno 9, сборка с -DLWS_HAVE_EVENTFD=OFF вроде решила проблему.
Спасибо сказали: