Использование сопрограмм boost.asio в macOS запускает множество файловых дескрипторов.C++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Использование сопрограмм boost.asio в macOS запускает множество файловых дескрипторов.

Сообщение Anonymous »


У меня есть программа, которая использует async_read с выходом из сокета домена unix.

void readSocket(const std::list::iterator &socket, boost::asio::yield_context выход) { ..... в то время как (1) { ЗаголовокСтруктура HDR; boost::asio::async_read((*socket)->socket, boost::asio::buffer(&hdr, sizeof(hdr)), boost::asio::transfer_all(), выход); ..... } } Похоже, что в экстремальном сценарии, когда система перегружена запросами, поступающими с более высокой вставкой, которую может обработать процесс, я достигаю временного состояния, когда дескриптор открытого файла процесса превысил максимальное значение.

Просмотр lsof показывает, что почти все дескрипторы открытых файлов созданы для двунаправленного канала и один для KQUEUE. По моим наблюдениям, приостановка сопрограммы в async_read реализуется системным вызовом select, который запускает эти три файловых дескриптора.

myProg 83099 root 184u KQUEUE count=1, state=0x8 myProg 83099 root 185 PIPE 0x432799c5a6f5943f 16384 -> 0x28a17a0822a260f7 myProg 83099 root 186 PIPE 0x28a17a0822a260f7 16384 -> 0x432799c5a6f5943f Интересно, верна ли моя теория о том, что системный вызов select запускает эти три файловых дескриптора (я использовал dtrace для мониторинга системных вызовов во время обработки запросов на чтение из сокета), и если да, то как я могу этого избежать? следует ли заменить сопрограмму обычными асинхронными вызовами или использовать синхронное чтение в отдельном потоке?

Спасибо
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»