Использование сопрограмм boost.asio в macOS запускает множество файловых дескрипторов. ⇐ C++
Использование сопрограмм boost.asio в macOS запускает множество файловых дескрипторов.
У меня есть программа, которая использует 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 для мониторинга системных вызовов во время обработки запросов на чтение из сокета), и если да, то как я могу этого избежать? следует ли заменить сопрограмму обычными асинхронными вызовами или использовать синхронное чтение в отдельном потоке?
Спасибо
У меня есть программа, которая использует 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 для мониторинга системных вызовов во время обработки запросов на чтение из сокета), и если да, то как я могу этого избежать? следует ли заменить сопрограмму обычными асинхронными вызовами или использовать синхронное чтение в отдельном потоке?
Спасибо
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение
-
-
Получение файловых дескрипторов в пространстве ядра без open() [дубликат]
Anonymous » » в форуме Linux - 0 Ответы
- 35 Просмотры
-
Последнее сообщение Anonymous
-
-
-
Как создать каналы для нестандартных файловых дескрипторов с помощью posix_spawn на C++
Anonymous » » в форуме C++ - 0 Ответы
- 9 Просмотры
-
Последнее сообщение Anonymous
-