LINUX.ORG.RU

Асинхронные сокеты и ENOBUFS

 ,


0

2

Есть такая проблема: если слать через множество сокетов кучу данных, то иногда возвращается ошибка ENOBUFS.
Как с этим справляются, если в общем случае скорость работы сети изменчива и неизвестна.
Ставить семафор для ограничения максимального числа сокетов или просто циклично повторять попытку записи в сокет?

1) Подкрутить буфера в ядре

2) Я бы пытался повторять запись с некоторым интервалом. Типа, каждые 50мс.

3) может приложение слишком много всего пытается сразу записать?

true_admin ★★★★★
()
Ответ на: комментарий от Harald

но в качестве частного решения можно селектом ждать, пока сокет станет доступным, и приостанавливать генерацию своей кучи данных, либо дропать эту кучу данных

Harald ★★★★★
()
Ответ на: комментарий от Harald

Наверно так не получится, потому что все через boost asio

nerdogeek
() автор топика
Ответ на: комментарий от true_admin

может приложение слишком много всего пытается сразу записать?

Не совсем, просто сеть иногда перегружена и пакеты тогда отсылаются медленно, поэтому ядро забивается всей этой шнягой

nerdogeek
() автор топика
Ответ на: комментарий от nerdogeek

Кстати, а что за архитектура у приложения? Можно же сделать poll/select на событие «сокет доступен на запись». Или ENOBUF возвращается для сокетов которые были заявлены как доступные на запись?

true_admin ★★★★★
()

Кхм, никогда с таким не сталкивался. Вообще-то в сокет надо что-то записывать, только когда он «доступен для записи». Если у тебя не простой Хелловорлд, то надо проверять через poll/epoll. Но это мое ИМХО. Мы никогда не пишем в сокет, пока не дождались доступности для записи через poll/epoll. Мы никогда не читаем из сокета, пока не дождались доступности для чтения через poll/epoll.

pathfinder ★★★★
()
Последнее исправление: pathfinder (всего исправлений: 1)

если ты на 32-битной системе то попробуй поиграться VMSPLIT. особенно обрати внимание на 4G/4G если таковой поддерживается твоей системой

cvv ★★★★★
()

Обычно в потоковый неблокирующийся сокет просто так данные не записывают. Используют библиотеку-обёртку над сокетом, содержащую в себе буфер для хранения передаваемых данных и пишущую в сокет только при поступления события возможности записи.

Sorcerer ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.