O_NONBLOCK неожиданное поведение - PullRequest
0 голосов
/ 25 октября 2011

Я использую сокет и устанавливаю O_NONBLOCK с помощью fcntl, но все еще приложением, потребляющим 100% ЦП.Даже я использую выбор с временем ожидания 1 мс.

Для целей чтения я использую recv.

Я попробовал его без O_NONBLOCK, и в этом случае он не потребляет 100% CPU, но recv занимает много времени.Я попытался выполнить recv с опцией O_NONBLOCK, но все еще считывал, что чтение занимает много (иногда 200 мс) времени.Тогда мы используем select, почему recv отнимает много времени?

Я не могу использовать первый вариант (сокет с O_NONBLOCK), потому что процессор потребляется, а во втором варианте есть задержка по времени.

Любой может высказать свое мнение.Это клиентское приложение.

Ответы [ 2 ]

2 голосов
/ 25 октября 2011

select () оптимизирован для входа в эффективное состояние ожидания (не потребляет много ресурсов ЦП) при использовании более длительного тайм-аута. Попробуйте что-то вроде 30 сек. Он вернется сразу же, когда произойдет какое-либо действие с одним из отслеживаемых файловых дескрипторов, так что вы сможете выполнять свою работу.

Попробуйте посмотреть ваш процесс в strace -v -ttt или tcpdump, чтобы найти подсказки с высокой задержкой или показать соответствующий код.

Также помните, что select может изменить временную структуру, поэтому не забудьте сбросить значения между вызовами select ().

1 голос
/ 25 октября 2011

Не думаю, что это неожиданно.Если вы установите неблокирующий режим, recv не будет блокировать ожидание чего-либо.Другими словами, он будет возвращать, доступны ли данные или нет, и это очень , вероятно, может подорвать ваш ЦП.

Я бы также подумал о том, чтобы немного увеличить время ожидания select.Нет никакой реальной причины иметь такое маленькое значение, поскольку это также может нагреть процессор.

Я склонен использовать значения как секунда для select тайм-аута, так как это задержка, которая мне нужна длядругие вещи (например, своевременная обработка сигналов CTRL-BREAK).

Это дает процессу достаточно много времени, не требующего использования процессора, в ожидании доступности данных.Если он станет доступен через меньше , чем за секунду, вы узнаете об этом раньше (select вернется).

...