2015-10-28 9 views
0

я столкнулся с интересной проблемой с моим домашним сервером в C.Как справиться с опросом() без замедления сервера или потери процессора?

Магистральный часть резюмировать следующим образом:

То, что я сильно заметил, что poll() определяет скорость выхода, а также Использование процессора.

Если я установил последний параметр x (значение тайм-аута) в ноль, то загрузка процессора только для программы выше 95%, но каждый запрос на сервер обрабатывается мгновенно.

Если, однако, я устанавливаю x в 500, то использование процессора все еще выше 95%, но для обработки запроса требуется 2 секунды.

Если я использую usleep(500) непосредственно перед poll(), то использование процессора практически не имеет значения, и для обработки запроса не требуется времени.

Это то, что я не понимаю:

Почему бы не опрашивать иметь до количества миллисекунд, указанных в последнем параметре, чтобы поймать событие и вернуться, когда по крайней мере, один найден вместо того, чтобы всегда ждет полный миллисекундный тайм-аут?

И что было бы эффективным значением usleep? Я чувствую, что слишком высокое значение usleep приведет к тому, что нормальное выполнение программы закроется, а слишком низкое значение не будет иметь эффекта.

+1

Только предположение: вы являетесь опросом() на filedescriptors, которые всегда читаются/читаются (например, write to stdout/stderr). Это может быть вызвано установкой неиспользуемых fds на ноль (stdin_fileno) (memset?), Вместо этого -1. или не удалив fds из набора. – wildplasser

+0

Вы неправильно используете 'poll', но нам нужно будет увидеть больше кода, чтобы точно знать, что вы делаете неправильно. Вероятно, вы опросили некоторые сокеты для записи, даже если вы не хотите писать им. –

+0

Я занимаюсь чтением любой удобочитаемости/возможности записи в сокете, а функция, которая происходит после, основана на том, является ли сокет читаемым или записываемым. – Mike

ответ

0

читает страницу человека для poll() дает совершенно другую историю о параметрах и значение параметров

Вот соответствующий отрывок из человека страницы:

Описания

опроса() выполняет аналогичную задачу для выбора (2): он ожидает, что один из множества дескрипторов файлов будет готов к выполнению ввода-вывода.

Набор файловых дескрипторов, подлежащих мониторингу, указан в аргументе fds, который представляет собой массив структур следующего вида: struct pollfd { int fd;/* дескриптор файла / короткие события;/ запрашиваемые события / короткие призывы;/ возвращенные события */ }; Вызывающий должен указать количество элементов в массиве fds в nfds. Поле fd содержит файловый дескриптор открытого файла. Если это поле отрицательное, то соответствующее поле событий игнорируется, а поле revents возвращает ноль. (Это обеспечивает простой способ игнорировать файловый дескриптор для одного вызова poll(): просто отрицайте поле fd.)

События в поле - это входной параметр, бит-маска, определяющий события, которые интересны для приложения файловый дескриптор fd. Если это поле указано как ноль, то все события игнорируются для fd, а revents возвращает ноль.

Исключения полей - это выходной параметр, заполненный ядром событиями, которые на самом деле произошли. Биты, возвращаемые в версиях, могут включать в себя любые из указанных в событиях или одно из значений POLLERR, POLLHUP или POLLNVAL.(Эти три бита не имеют смысла в поле событий и будут устанавливаться в поле revents, когда соответствующее условие истинно.)

Если ни одно из запрошенных событий (и отсутствие ошибок) не произошло для любого из дескрипторов файла , затем poll() до тех пор, пока не произойдет одно из событий.

Аргумент timeout указывает минимальное количество миллисекунд, которое будет блокировать poll(). (Этот интервал будет округлен до гранулярности системных тактовых импульсов, а задержки планирования ядра означают, что интервал блокировки может превышать небольшую величину.) Задание отрицательного значения в тайм-ауте означает бесконечный тайм-аут. Указание таймаута нуля приводит к тому, что poll() немедленно возвращается, даже если дескрипторы файлов не готовы.

--end отрывок

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

Возможно, вы могли бы обсудить эти отношения в своем вопросе.