я столкнулся с интересной проблемой с моим домашним сервером в C.Как справиться с опросом() без замедления сервера или потери процессора?
Магистральный часть резюмировать следующим образом:
То, что я сильно заметил, что poll()
определяет скорость выхода, а также Использование процессора.
Если я установил последний параметр x (значение тайм-аута) в ноль, то загрузка процессора только для программы выше 95%, но каждый запрос на сервер обрабатывается мгновенно.
Если, однако, я устанавливаю x в 500, то использование процессора все еще выше 95%, но для обработки запроса требуется 2 секунды.
Если я использую usleep(500)
непосредственно перед poll()
, то использование процессора практически не имеет значения, и для обработки запроса не требуется времени.
Это то, что я не понимаю:
Почему бы не опрашивать иметь до количества миллисекунд, указанных в последнем параметре, чтобы поймать событие и вернуться, когда по крайней мере, один найден вместо того, чтобы всегда ждет полный миллисекундный тайм-аут?
И что было бы эффективным значением usleep? Я чувствую, что слишком высокое значение usleep приведет к тому, что нормальное выполнение программы закроется, а слишком низкое значение не будет иметь эффекта.
Только предположение: вы являетесь опросом() на filedescriptors, которые всегда читаются/читаются (например, write to stdout/stderr). Это может быть вызвано установкой неиспользуемых fds на ноль (stdin_fileno) (memset?), Вместо этого -1. или не удалив fds из набора. – wildplasser
Вы неправильно используете 'poll', но нам нужно будет увидеть больше кода, чтобы точно знать, что вы делаете неправильно. Вероятно, вы опросили некоторые сокеты для записи, даже если вы не хотите писать им. –
Я занимаюсь чтением любой удобочитаемости/возможности записи в сокете, а функция, которая происходит после, основана на том, является ли сокет читаемым или записываемым. – Mike