Вызывается ли уровень срабатывания или крайнее срабатывание?

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

В основном я рассматриваю "исполнитель" как:

  • Возможность обработки нескольких соединений без деградации.

  • Возможность поддерживать максимальную скорость для входящего сообщения.

На самом деле меня больше волнует №2, но также важно №1.

Я выполнял тесты с одним поточным потребителем (принимать/читать несколько соединений сокетов с помощью epoll_wait) и несколькими производителями.

До сих пор я не видел разницы, даже до 1000 дескрипторов файлов.

Я работаю над идеей (заблуждением?), что вызванное краем должно быть более результативным, потому что будет получено меньшее количество перехватов. Правильное ли это предположение?

Одна проблема с моим тестом, который может маскировать различия в производительности, заключается в том, что я не отправляю свои сообщения в потоки после их получения, так что чем меньше прерываний не имеет значения. Я не хотел делать этот тест, потому что я использовал __asm__ rdtsc для получения "временных меток", поэтому не хочу, чтобы смириться с тем, из какого ядра появилась моя оригинальная временная метка.

То, что делает меня еще более подозрительным, - это то, что уровень срабатывания epoll лучше работает на некоторых тестах, которые я видел.

Что лучше? При каких обстоятельствах? Разве нет разницы? Любые идеи будут оценены.

EDIT:

Мои сокеты не блокируются.

Ответ 1

Я бы не ожидал увидеть огромную разницу в производительности между фронтом и уровнем срабатывания.

Для срабатывания по краю вы всегда должны сбрасывать входной буфер, поэтому у вас есть один бесполезный (только возвращающий EWOULDBLOCK) отказ от ответа. Но для запуска уровня вы можете использовать больше системных вызовов epoll_wait. Как указывает страница , избежать голодания может быть немного легче в режиме с запущенным уровнем.

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

Ответ 2

Разница видима только при использовании долгоживущих сеансов, и вы вынуждены постоянно останавливаться/запускать из-за того, что буферы заполнены/пусты (обычно с прокси-сервером). Когда вы это делаете, вам чаще всего нужен кеш событий, и когда кеш-память событий обрабатывает события, вы можете использовать ET и избегать всех танков epoll_ctl (DEL) + epoll_ctl (ADD). Для краткосрочных сессий сбережения менее очевидны, потому что для ET вам понадобится хотя бы один вызов epoll_ctl (ADD) для включения опроса на FD, и если вы не ожидаете, что их больше в течение сеанса (например: обмены больше, чем буферы в большинстве случаев), тогда вы не должны ожидать какой-либо разницы. Большая часть ваших сбережений, как правило, исходит от использования кеша событий, поскольку вы часто можете выполнять множество операций (например, запись) без опроса благодаря буферам ядра.