Вызывается ли уровень срабатывания или крайнее срабатывание?
Я пытаюсь выяснить, что более результативно, сгенерировано по краю или с эллипсом уровня.
В основном я рассматриваю "исполнитель" как:
На самом деле меня больше волнует №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, и если вы не ожидаете, что их больше в течение сеанса (например: обмены больше, чем буферы в большинстве случаев), тогда вы не должны ожидать какой-либо разницы. Большая часть ваших сбережений, как правило, исходит от использования кеша событий, поскольку вы часто можете выполнять множество операций (например, запись) без опроса благодаря буферам ядра.