Почему softirq используется для высокопоточных и высокочастотных применений?
Что делает softirq настолько особенным, что мы используем его для высокочастотных применений, например, в сетевых драйверах и блочных драйверах.
1 ответ
SoftIrq обычно используются для завершения работы с очередями из обработанного прерывания, потому что они очень хорошо соответствуют нужным потребностям - они работают с наивысшим приоритетом, но все еще работают с включенными аппаратными прерываниями.
Обработка прерываний hw является наивысшим приоритетом, так как, если они не обрабатываются быстро, то будет введено либо слишком высокое время ожидания, и пользовательский опыт пострадает, либо аппаратный буфер заполнится до того, как прерывание обработает устройство, и данные будут потеряны. Не обслуживаете сетевой адаптер достаточно быстро? Он будет перезаписывать данные в fifo, и вы потеряете пакеты. Не обслуживаете жесткий диск достаточно быстро? Жесткий диск останавливается в очереди запросов на чтение, потому что ему некуда поместить результаты.
SoftIrqs позволяет критически важной части обслуживания аппаратных прерываний быть как можно короче; вместо того, чтобы обрабатывать все прерывания hw на месте, важные данные считываются с устройства в ОЗУ или иным образом, а затем запускается SoftIrq для завершения работы. Это позволяет отключать аппаратные прерывания в течение кратчайшего периода времени, в то же время выполняя работу с высоким приоритетом.
Эта статья является достойной ссылкой по этому вопросу: https://lwn.net/Articles/520076/
Правки для вопросов:
SoftIrqs являются повторно входящими - они могут быть обработаны на любом процессоре. Из статьи я ссылаюсь:
Есть два места, где программные прерывания могут "запускать" и выгружать текущий поток. Один из них находится в конце обработки для аппаратного прерывания; Обычно обработчики прерываний поднимают softirq, поэтому имеет смысл (для задержки и оптимального использования кэша) обрабатывать их, как только аппаратные прерывания могут быть повторно включены
Акцент добавлен. Они могут быть обработаны внутри - я думаю, что это означает, что они могут быть обработаны без переключения контекста, что означает, что как только аппаратные прерывания будут разрешены, мы можем сразу перейти к SoftIrq, где мы используем как можно меньше злоупотреблений кэшем ЦП. Все это делает SoftIrq легкими, но гибкими, что делает их идеальными для высокочастотной обработки.
- При необходимости их можно перенести на другой процессор, что повышает пропускную способность.
- Они могут быть обработаны сразу после включения hwints прямо в текущем контексте, максимально сохраняя состояние процессора, улучшая задержку
- Они позволяют аппаратным прерываниям продолжать обработку, поскольку это наша самая важная цель
- Они могут быть перенесены в процесс ksoftirqd, если нагрузка слишком высока, и нам нужно отнимать время у обычных пользовательских процессов.