Проблема: блокировка прерываний при ожидании IPI
В рамках открытого окна слияния (merge window) для Linux 7.3 был представлен пулл-реквест с улучшениями подсистемы SMP. Ключевая проблема, которую решили инженеры Bytedance, касалась функции smp_call_function*. В старой реализации прерывание планировщика (preemption) оставалось заблокированным на протяжении всей операции, включая этап ожидания завершения удаленных вызовов прерываний (IPI).
Это приводило к драматическому росту задержек, особенно на архитектурах x86_64, где флешинг TLB (Translation Lookaside Buffer) и освобождение страниц выполняются через IPI. Если один из целевых процессоров не отвечал мгновенно, поток блокировался, создавая «шипы» задержек, критичные для чувствительных к latency задач, таких как DPDK.
Решение: локальная маска CPU и повторное включение прерываний
Разработчики изменили логику ожидания: теперь используется локальная для задачи маска CPU, отслеживающая ядра, на которые нужно отправить IPI. Это позволяет ядру повторно включить прерывание планировщика (reenable preemption) до начала фазы ожидания завершения. Таким образом, другие задачи могут выполняться параллельно, не блокируя систему.
Результаты: падение P99 задержек на 90%
Тестирование во флоте серверов с высокоприоритетными задачами показало радикальное улучшение метрик. Ниже приведено сравнение ключевых показателей:
| Метрика | До оптимизации | После оптимизации | Эффект |
|---|---|---|---|
| P99 Latency (SMP calls) | ~17 мс | ~1.5 мс | Снижение на ~90% |
| Работа с DPDK | Высокие пики задержек | Стабильная работа | Устранение блокировок |
| Накладные расходы | Низкие | Умеренные | Небольшой рост потребления памяти |
Статус интеграции
Томас Глейкснер (Thomas Gleixner) подтвердил эффективность подхода, отметив, что хотя метод требует умеренного увеличения расхода памяти, он критически важен для real-time производительности. Пулл-реквест ожидает финального одобрения Линуса Торвальдса. При отсутствии замечаний к коду, изменения будут включены в основную ветку Linux 7.3 уже на этой неделе.
Источник: Phoronix ↗
