тесты #
Последние тесты, выпущенные в июне 2018, показывают значительное улучшение производительности при использовании nftables в качестве пути данных вместо iptables.
Принимая во внимание среду тестирования клиентов 2, выполняющих инструмент снятия нагрузки HTTP, подсистему балансировки нагрузки 1 и бэкэнды 3 с терминатором HTTP, дающим ответ около байтов 210, мы получаем следующие тесты в HTTP потоки в секунду:
iptables DNAT 256.864,07 RPS/cpu iptables SNAT 262.088,94 RPS/cpu nftables DNAT 560.976,44 RPS/cpu nftables SNAT 608.941,57 RPS/cpu nftables DSR 7.302.517,31 RPS/cpu
Вышеприведенные цифры показаны в расчете на физический процессор, так как добавляющие ядра масштабируемости почти линейны. Хотя эти тесты были выполнены только с бэкэндами 3, Производительность iptables существенно снизится при добавлении дополнительных бэкэндов, поскольку они подразумевают более последовательные правила.
Эти тесты были выполнены с отключенным retpoline (без защиты от Spectre / Meltdown), но как только они включены, потери производительности, обнаруженные в случаях NAT с включенным conntrack для случаев iptables и nftables, намного хуже для первого:
iptables: штраф ЦП 40.77% nftables: штраф ЦП 17.27%
Ключи производительности #
Наказания за ретполин объясняются из-за использования в iptables гораздо большего количества вызовов косвенной адресации, чем в nftables. Но также есть еще несколько ключей производительности, которые будут объяснены ниже.
Оптимизация правил #
Основным ключом производительности является оптимизация правил. В iptables уже было известно, что использование ipset повышает производительность, поскольку уменьшает последовательную обработку правил.
В nftlb, хотя он может быть расширен для использования в других целях, мы устанавливаем основные правила для каждой виртуальной службы, используя выразительный язык, который изначально поддерживает использование множеств и карт. Пожалуйста, смотрите ниже сгенерированные правила для виртуальный tcp сервис с именем vs01 с бэкэндами 2:
таблица ip nftlb {карта tcp-services {тип ipv4_addr. inet_service: вердикт
элементы = { 192.168.0.100 . http : перейти к vs01 }
} Chain prerouting { type natook prerouting Priority 0; политика принимает;
айпи папдр. tcp dport vmap @tcp-services
} Chain postrouting { type natook postrouting Priority 100; политика принимает; }
цепочка vs01 { dnat to jhash ip saddr mod 2 map { 0 : 192.168.1.10, 1 : 192.168.1.11 } }
}
Как только нам нужно добавить новый бэкэнд, просто регенерируйте связанную цепочку в виртуальный сервис без включения новых правил и без влияния на остальные виртуальные сервисы.
цепочка vs01 {
dnat to jhash ip saddr mod 3 карта { 0 : 192.168.1.10, 1 : 192.168.1.11, 2 : 192.168.1.12 }
}
Тогда, если новый виртуальный сервис vs02 необходимо создать, тогда набор правил станет таким, как показано ниже, без добавления новых правил или влияния на другие виртуальные службы:
таблица ip nftlb {карта tcp-services {тип ipv4_addr. inet_service: элементы вердикта = {192.168.0.100. http : перейти к vs01,
192.168.0.102 . https: перейти к vs02 } } Chain prerouting { type natook prerouting Priority 0; политика принимает; айпи папдр. tcp dport vmap @tcp-services } Chain postrouting { type natook postrouting Priority 100; политика принимает; } Chain vs01 { dnat to jhash ip saddr mod 3 map { 0 : 192.168.1.10, 1 : 192.168.1.11, 2 : 192.168.1.12 } }
цепочка vs02 { dnat to jhash ip saddr mod 2 map { 0 : 192.168.2.10, 1 : 192.168.2.11 } }
}
Ранние крючки #
Nftables позволяет использовать ранние входной крюк это используется в nftlb во время сценариев DSR.
Кроме того, этот ранний хук может использоваться для целей фильтрации, что повышает производительность в случаях отбрасывания пакетов. Это показано ниже с самой ранней стадией случаев iptables и nftables в пакетах в секунду:
Необработанное падение iptables перед маршрутизацией: 38.949.054,35 PPS/ядро Входное падение nftables: 45.743.628,64 PPS/ядро
Методы ускорения #
Действительно, еще больше возможностей для оптимизации, поскольку nftables уже поддерживает быстрые пути и упрощенные методы, которые можно использовать для манипулирования пакетами. Как примеры этого:
Flowtables, Conntrack fast path для делегирования уже установленных соединений на входную стадию без прохождения всего медленного пути. Больше информации здесь.
NAT без состояния, В некоторых случаях с балансировкой нагрузки NAT без сохранения состояния может выполняться без отслеживания соединения и со стадии входа, чтобы получить всю производительность, применяемую к сценариям NAT.