Π’ ядрС Linux 5.7 Π±ΡƒΠ΄ΡƒΡ‚ ускорСны слоТныС сопоставлСния ΠΏΠΎ спискам Π² NetFilter

Π Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΈ подсистСмы Ρ„ΠΈΠ»ΡŒΡ‚Ρ€Π°Ρ†ΠΈΠΈ ΠΈ ΠΌΠΎΠ΄ΠΈΡ„ΠΈΠΊΠ°Ρ†ΠΈΠΈ сСтСвых ΠΏΠ°ΠΊΠ΅Ρ‚ΠΎΠ² Netfilter ΠΎΠΏΡƒΠ±Π»ΠΈΠΊΠΎΠ²Π°Π»ΠΈ Π½Π°Π±ΠΎΡ€ ΠΏΠ°Ρ‚Ρ‡Π΅ΠΉ, Π·Π½Π°Ρ‡ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ ΡƒΡΠΊΠΎΡ€ΡΡŽΡ‰ΠΈΡ… ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΡƒ Π±ΠΎΠ»ΡŒΡˆΠΈΡ… списков сопоставлСния (nftables set), Π² ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… трСбуСтся ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° сочСтания подсСтСй, сСтСвых ΠΏΠΎΡ€Ρ‚ΠΎΠ², ΠΏΡ€ΠΎΡ‚ΠΎΠΊΠΎΠ»Π° ΠΈ MAC-адрСсов. ΠŸΠ°Ρ‚Ρ‡ΠΈ ΡƒΠΆΠ΅ приняты Π² Π²Π΅Ρ‚ΠΊΡƒ nf-next, которая Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΡ€Π΅Π΄Π»ΠΎΠΆΠ΅Π½Π° для Π²ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ Π² состав ядра Linux 5.7. НаиболСС Π·Π°ΠΌΠ΅Ρ‚Π½ΠΎΠ³ΠΎ ускорСния ΡƒΠ΄Π°Π»ΠΎΡΡŒ Π΄ΠΎΠ±ΠΈΡ‚ΡŒΡΡ благодаря Π·Π°Π΄Π΅ΠΉΡΡ‚Π²ΠΎΠ²Π°Π½ΠΈΡŽ инструкций AVX2 (Π² дальнСйшСм планируСтся ΠΎΠΏΡƒΠ±Π»ΠΈΠΊΠΎΠ²Π°Ρ‚ΡŒ ΠΏΠΎΠ΄ΠΎΠ±Π½Ρ‹Π΅ ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΠΈ Π½Π° Π±Π°Π·Π΅ инструкций NEON для ARM).

ΠžΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΠΈ внСсСны Π² ΠΌΠΎΠ΄ΡƒΠ»ΡŒ nft_set_pipapo (PIle PAcket POlicies), Ρ€Π΅ΡˆΠ°ΡŽΡ‰ΠΈΠΉ Π·Π°Π΄Π°Ρ‡Ρƒ сопоставлСния содСрТимого ΠΏΠ°ΠΊΠ΅Ρ‚Π° с примСняСмыми Π² ΠΏΡ€Π°Π²ΠΈΠ»Π°Ρ… Ρ„ΠΈΠ»ΡŒΡ‚Ρ€Π°Ρ†ΠΈΠΈ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ»ΡŒΠ½Ρ‹ΠΌΠΈ Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½Π°ΠΌΠΈ состояния ΠΏΠΎΠ»Π΅ΠΉ, Ρ‚Π°ΠΊΠΈΠΌΠΈ ΠΊΠ°ΠΊ Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½Ρ‹ IP ΠΈ сСтСвых ΠΏΠΎΡ€Ρ‚ΠΎΠ² (nft_set_rbtree ΠΈ nft_set_hash ΠΌΠ°Π½ΠΈΠΏΡƒΠ»ΠΈΡ€ΡƒΡŽΡ‚ сопоставлСниСм ΠΈΠ½Ρ‚Π΅Ρ€Π²Π°Π»ΠΎΠ² ΠΈ прямым ΠΎΡ‚Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ΠΌ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ). ВСкторизированная ΠΏΡ€ΠΈ ΠΏΠΎΠΌΠΎΡ‰ΠΈ 256-разрядных инструкций AVX2 Π²Π΅Ρ€cия pipapo Π½Π° систСмС с процСссором AMD Epyc 7402 ΠΏΠΎΠΊΠ°Π·Π°Π»Π° прирост ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ Π½Π° 420% ΠΏΡ€ΠΈ Ρ€Π°Π·Π±ΠΎΡ€Π΅ 30 тысяч записСй, Π²ΠΊΠ»ΡŽΡ‡Π°ΡŽΡ‰ΠΈΡ… связки ΠΏΠΎΡ€Ρ‚-ΠΏΡ€ΠΎΡ‚ΠΎΠΊΠΎΠ». ΠŸΡ€ΠΈΡ€ΠΎΡΡ‚ ΠΏΡ€ΠΈ сопоставлСнии связки ΠΈΠ· подсСти ΠΈ Π½ΠΎΠΌΠ΅Ρ€Π° ΠΏΠΎΡ€Ρ‚Π° ΠΏΡ€ΠΈ Ρ€Π°Π·Π±ΠΎΡ€Π΅ 1000 записСй составил 87% для IPv4 ΠΈ 128% для IPv6.

Π’ ядрС Linux 5.7 Π±ΡƒΠ΄ΡƒΡ‚ ускорСны слоТныС сопоставлСния ΠΏΠΎ спискам Π² NetFilter

Другая оптимизация, ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡŽΡ‰Π°Ρ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ 8-Π±ΠΈΡ‚ΠΎΠ²Ρ‹Π΅ Π³Ρ€ΡƒΠΏΠΏΡ‹ сопоставлСния вмСсто 4-Π±ΠΈΡ‚ΠΎΠ²Ρ‹Ρ…, Ρ‚Π°ΠΊΠΆΠ΅ ΠΏΠΎΠΊΠ°Π·Π°Π»Π° ΠΎΡ‰ΡƒΡ‚ΠΈΠΌΡ‹ΠΉ прирост ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ: 66% ΠΏΡ€ΠΈ Ρ€Π°Π·Π±ΠΎΡ€Π΅ 30 тысяч записСй ΠΏΠΎΡ€Ρ‚-ΠΏΡ€ΠΎΡ‚ΠΎΠΊΠΎΠ», 43% — ΠΏΠΎΠ΄ΡΠ΅Ρ‚ΡŒ_IPv4-ΠΏΠΎΡ€Ρ‚ ΠΈ 61% — ΠΏΠΎΠ΄ΡΠ΅Ρ‚ΡŒ_IPv6-ΠΏΠΎΡ€Ρ‚. Π’ суммС, с ΡƒΡ‡Ρ‘Ρ‚ΠΎΠΌ ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΠΉ AVX2, ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ pipapo ΡƒΠ²Π΅Π»ΠΈΡ‡ΠΈΠ»Π°ΡΡŒ Π² ΡƒΠΊΠ°Π·Π°Π½Π½Ρ‹Ρ… тСстах Π½Π° 766%, 168% ΠΈ 269% соотвСтствСнно. ΠŸΠΎΠ»ΡƒΡ‡Π΅Π½Π½Ρ‹Π΅ для слоТных сопоставлСний характСристики ΠΎΠΏΠ΅Ρ€Π΅ΠΆΠ°ΡŽΡ‚ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ Π΅Π΄ΠΈΠ½ΠΈΡ‡Π½Ρ‹Ρ… ΠΏΠΎΠ»Π΅ΠΉ Π² rbtree (Π·Π° ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ΠΌ тСста связки ΠΏΠΎΡ€Ρ‚+ΠΏΡ€ΠΎΡ‚ΠΎΠΊΠΎΠ»), Π½ΠΎ ΠΏΠΎΠΊΠ° ΠΎΡ‚ΡΡ‚Π°ΡŽΡ‚ ΠΎΡ‚ прямых ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΎΠΊ ΠΏΡ€ΠΈ ΠΏΠΎΠΌΠΎΡ‰ΠΈ Ρ…ΡΡˆΠ΅ΠΉ ΠΈ drop-ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΎΠ² Π½Π° Π±Π°Π·Π΅ netdev.

Π’ ядрС Linux 5.7 Π±ΡƒΠ΄ΡƒΡ‚ ускорСны слоТныС сопоставлСния ΠΏΠΎ спискам Π² NetFilter

Π˜ΡΡ‚ΠΎΡ‡Π½ΠΈΠΊ: opennet.ru

Π”ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ ΠΊΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΉ