tolok ukur dan kunci kinerja nftlb

DIKIRIM PADA 28 Juni 2018

benchmark

Benchmark terbaru, tertanggal Juni 2018, menunjukkan peningkatan kinerja yang penting dalam menggunakan nftables sebagai jalur data alih-alih iptables.

Diberikan lingkungan uji coba dari klien 2 yang menjalankan alat stres beban HTTP, penyeimbang beban 1 dan backend 3 dengan terminator HTTP yang memberikan respons sekitar 210 byte, kami memperoleh tolok ukur berikut dalam Arus HTTP per detik:

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

Angka-angka di atas ditunjukkan dalam hal per CPU fisik sebagai inti menambahkan skalabilitas hampir linier. Meskipun tolok ukur ini telah dilakukan dengan hanya backend 3, kinerja iptables akan turun secara substansial sambil menambahkan lebih banyak backend, karena mereka menyiratkan aturan yang lebih berurutan.

Tolok ukur tersebut dilakukan dengan retpoline dinonaktifkan (tidak ada mitigasi Specter / Meltdown), tetapi setelah diaktifkan, penalti kinerja yang terdeteksi dalam kasus NAT dengan conntrack diaktifkan untuk kasus iptables dan nftables jauh lebih buruk untuk yang pertama:

iptables: 40.77% CPU penalty
nftables: 17.27% CPU penalty

Kunci kinerja

Hukuman retpoline dijelaskan karena penggunaan lebih banyak panggilan tidak langsung di iptables daripada di nftables. Tetapi juga, ada beberapa kunci kinerja yang akan dijelaskan di bawah ini.

Optimasi aturan

Kunci kinerja utama adalah optimalisasi aturan. Sudah diketahui di iptables bahwa penggunaan ipset meningkatkan kinerja karena mengurangi pemrosesan aturan sekuensial.

Di nftlb, meskipun dapat diperluas untuk digunakan untuk tujuan lain, kami menetapkan aturan dasar per layanan virtual menggunakan bahasa ekspresif yang secara native mendukung penggunaan set dan peta. Silakan lihat di bawah aturan yang dihasilkan untuk a layanan tcp virtual bernama vs01 dengan backend 2:

table ip nftlb {
    map tcp-services {
        type ipv4_addr . inet_service : verdict
        elements = { 192.168.0.100 . http : goto vs01 }
    }

    chain prerouting {
        type nat hook prerouting priority 0; policy accept;
        ip daddr . tcp dport vmap @tcp-services
    }

    chain postrouting {
        type nat hook postrouting priority 100; policy accept;
    }

    chain vs01 {
        dnat to jhash ip saddr mod 2 map { 0 : 192.168.1.10, 1 : 192.168.1.11 }
    }
}

Setelah kami perlu menambahkan backend baru, cukup buat ulang rantai terkait ke layanan virtual tanpa memasukkan aturan baru dan tanpa memengaruhi sisa layanan virtual lainnya.

    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 }
    }

Lalu, jika layanan virtual baru vs02 perlu dibuat, maka kumpulan aturan menjadi seperti yang ditunjukkan di bawah ini, tanpa penambahan aturan baru atau memengaruhi layanan virtual lainnya:

table ip nftlb {
    map tcp-services {
        type ipv4_addr . inet_service : verdict
        elements = { 192.168.0.100 . http : goto vs01,
                     192.168.0.102 . https : goto vs02 }
    }

    chain prerouting {
        type nat hook prerouting priority 0; policy accept;
        ip daddr . tcp dport vmap @tcp-services
    }

    chain postrouting {
        type nat hook postrouting priority 100; policy accept;
    }

    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 }
    }

    chain vs02 {
        dnat to jhash ip saddr mod 2 map { 0 : 192.168.2.10, 1 : 192.168.2.11 }
    }
}

Kait awal

nftables memungkinkan penggunaan lebih awal kait masuk yang digunakan dalam nftlb selama skenario DSR.

Juga, kait awal ini dapat digunakan untuk keperluan penyaringan yang meningkatkan kinerja dalam kasus menjatuhkan paket. Ini ditunjukkan di bawah ini dengan tahap paling awal dari iptables dan case nftables dalam paket per detik:

iptables prerouting raw drop: 38.949.054,35 PPS
nftables ingress drop: 45.743.628,64 PPS

Teknik percepatan

Masih ada lebih banyak ruang untuk optimasi, karena nftables sudah mendukung jalur cepat dan teknik ringan yang dapat digunakan untuk paket mangling. Sebagai contohnya adalah:

Tabel alur. Jalur cepat Conntrack untuk mendelegasikan koneksi yang sudah ada ke tahap masuknya tanpa melewati seluruh jalur lambat. Info lebih lanjut disini.

NAT tanpa kewarganegaraan. Untuk beberapa kasus penyeimbangan beban, NAT stateless dapat dilakukan tanpa pelacakan koneksi dan dari tahap masuknya untuk mendapatkan semua kinerja yang diterapkan pada skenario NAT.

Bagikan ke:

Dokumentasi di bawah ketentuan Lisensi Dokumentasi Bebas GNU.

Apakah artikel ini berguna?

Artikel terkait