All Products
Search
Document Center

:Sesuaikan RSS untuk ENI

Last Updated:May 16, 2026

Sesuaikan aturan hash RSS dan tabel indireksi pada ENI yang didukung untuk mendistribusikan traffic secara merata ke seluruh core CPU serta mengatasi bottleneck pada satu core.

Apa itu RSS

Receive Side Scaling (RSS) menggunakan perangkat keras dan driver ENI untuk menghitung nilai hash berdasarkan fitur paket (alamat IP sumber/tujuan dan port), lalu memetakan aliran traffic berbeda ke beberapa antrian RX. Core CPU yang terikat memproses antrian tersebut secara paralel, sehingga mencapai load balancing dan mengurangi latensi pada satu core.

ENI yang mendukung multiple queue menggunakan saluran RX (receive) dan TX (send) independen per antrian untuk pemrosesan paralel. Saat sebuah paket tiba, perangkat keras ENI menggunakan kebijakan RSS untuk mendistribusikan aliran data berbeda ke beberapa antrian RX. Secara default, kebijakan RSS untuk instance ECS bersifat tetap di Virtual Private Cloud (VPC) dan tidak dapat dilihat atau dimodifikasi dari dalam instance.

Beberapa keluarga instans mendukung fitur custom RSS untuk ENI. Setelah Anda mengaktifkan fitur custom RSS pada keluarga instans yang didukung, ENI mendistribusikan traffic berdasarkan aturan penghashan default. Anda juga dapat lebih lanjut menyesuaikan konfigurasi RSS sesuai karakteristik traffic aktual.

Setelah mengaktifkan custom RSS, Anda juga dapat mengonfigurasi RSS dalam skenario DPDK untuk memaksimalkan kinerja multi-core.

Cara kerja

Custom RSS untuk ENI instance ECS bekerja sebagai berikut:

  • Perhitungan nilai hash: ENI menghitung nilai hash dari 5-tupel (IP sumber, IP tujuan, port sumber, port tujuan, dan protokol), kunci hash, serta algoritma hash.

    • Kunci hash: Nilai tetap sepanjang 40 byte. Driver ENI menghasilkan kunci hash default selama inisialisasi. Anda dapat menyesuaikan kunci hash untuk memengaruhi distribusi traffic.

    • Algoritma hash: Saat ini, hanya algoritma default toeplitz yang didukung. Pengaturan ini tidak dapat dimodifikasi.

    • Aturan penghashan: Aturan untuk menghitung nilai hash bervariasi berdasarkan jenis traffic. Aturan penghashan default untuk RSS ENI ECS adalah sebagai berikut. Anda tidak dapat mengubah aturan ini.

      • Traffic TCP dan UDP melalui IPv4/IPv6: Nilai hash dihitung berdasarkan 4-tupel (IP sumber, IP tujuan, port sumber, dan port tujuan) serta kunci hash.

      • Traffic non-TCP/UDP melalui IPv4/IPv6, seperti ICMP: Nilai hash dihitung berdasarkan 2-tupel (IP sumber dan IP tujuan) serta kunci hash.

      • Pesan non-IP (seperti ARP) dikirim ke antrian default (antrian 0) dan tidak di-hash.

  • Pemetaan tabel indireksi: Tabel indireksi RSS adalah larik yang telah ditentukan sebelumnya yang memetakan nilai hash ke antrian penerima tujuan. Setiap elemen (bucket hash) menyimpan nomor antrian, seperti 0, 1, atau 2. Saat driver ENI dimuat, tabel indireksi secara otomatis dihasilkan untuk mendistribusikan traffic secara merata.

    • Panjang tabel indireksi: Jumlah total bucket hash. Nilainya tetap pada 128.

    • Mode distribusi:

      Mode distribusi tabel indireksi RSS merupakan mekanisme inti yang memetakan nilai hash ke antrian penerima tertentu. Dengan menggunakan tabel indireksi yang telah ditentukan, hasil perhitungan hash dikonversi menjadi indeks antrian. Hal ini memungkinkan distribusi traffic fleksibel di berbagai core.

      Mode distribusi berbeda, seperti distribusi seragam dan distribusi berbobot, secara langsung memengaruhi cara traffic didistribusikan ke core CPU. Hal ini selanjutnya memengaruhi throughput sistem, latensi, pemanfaatan resource, dan kinerja layanan.

      Pilih pola distribusi yang sesuai dengan skenario Anda. Lihat Pola distribusi tabel indireksi.

    • Proses pemetaan tabel indireksi:

      1. Perhitungan indeks bucket hash: Indeks = Nilai hash % Panjang tabel indireksi (Misalnya, 88 % 128 → indeks 88). Anda dapat menggunakan skrip perhitungan RSS untuk menghitung nilai indeks.

      2. Mengisi nomor antrian: Tulis nomor antrian ke setiap bucket hash berdasarkan mode distribusi.

        Setelah tabel indireksi dihasilkan, indeks hash setiap paket dipetakan ke nomor antrian, dan paket dikirim ke antrian tersebut.

  • Pengikatan core CPU: Saat sebuah antrian menerima paket, interrupt dipicu. Core CPU yang terikat memproses interrupt tersebut.

    Gambar selain Red Hat Enterprise Linux mendukung network interrupt affinity secara default. Setiap antrian dikaitkan dengan interrupt independen, dan interrupt affinity mendistribusikan penanganan ke berbagai core CPU. Lihat Mekanisme inti multi-queue.

Aktifkan atau nonaktifkan custom RSS untuk ENI

Penting

Fitur custom RSS untuk ENI sedang dalam pratinjau undangan. Untuk menggunakan fitur ini, Anda dapat membuat tiket.

Setelah Anda mengaktifkan custom RSS pada tipe instans yang didukung, traffic yang diterima didistribusikan ke beberapa antrian penerima berdasarkan aturan penghashan default. Core CPU berbeda memproses antrian tersebut secara paralel, meningkatkan throughput dan mengurangi beban pada satu core.

Prasyarat

  • Custom RSS diluncurkan secara bertahap. Fitur ini tersedia di wilayah berikut:

    Nama Wilayah

    ID Wilayah

    China (Hong Kong)

    cn-hongkong

  • Hanya beberapa keluarga instans multi-queue yang mendukung custom RSS, termasuk keluarga instans tujuan umum g9i dan keluarga instans yang dioptimalkan untuk memori r9i.

    Panggil operasi API DescribeInstanceTypes untuk memeriksa dukungan. RssSupport=`true` menunjukkan fitur ini didukung.

  • Direkomendasikan menggunakan gambar Alibaba Cloud Linux 3.2104 LTS 64-bit.

    • Jika Anda menggunakan gambar publik lain, versi kernel harus 6.12 atau lebih baru.

    • Jika Anda menggunakan fitur custom RSS dalam aplikasi DPDK, versi DPDK harus 21.11 atau lebih baru.

Cara mengaktifkan atau menonaktifkan

Custom RSS nonaktif secara default. Anda dapat mengaktifkan atau menonaktifkannya saat membuat ENI atau setelah ENI dibuat.

  • Saat memanggil CreateNetworkInterface, atur EnableRss dalam EnhancedNetwork menjadi true atau false.

    Custom RSS berlaku setelah ENI disambungkan ke instans.

  • Panggil ModifyNetworkInterfaceAttribute dan atur EnableRss dalam EnhancedNetwork menjadi true atau false. Setelah mengaktifkan atau menonaktifkan, perubahan berlaku saat ENI disambungkan ulang:

  • Panggil DescribeNetworkInterfaceAttribute dengan Attribute diatur ke enhancedNetwork untuk memeriksa apakah custom RSS diaktifkan. EnableRSS=true berarti diaktifkan; false berarti dinonaktifkan.

    Jika RSS belum dimodifikasi untuk ENI, operasi ini tidak mengembalikan parameter EnableRSS, yang berarti fitur tersebut tidak diaktifkan.

Lihat konfigurasi RSS ENI

Setelah Anda mengaktifkan custom RSS, driver ENI menghasilkan konfigurasi RSS default berdasarkan mekanisme dan aturan default saat ENI dimuat ulang.

Anda dapat login jarak jauh ke instans Linux dan menjalankan ethtool -x eth0 untuk melihat konfigurasi RSS ENI primer. Untuk ENI sekunder, ganti pengenal antarmuka (eth1, eth2, dll.).

image

  • Tabel hash (tabel indireksi hash aliran RX): Menentukan aturan pemetaan dari nilai hash ke 64 antrian penerima.

    • Setiap baris dalam tabel hash merepresentasikan rentang nilai hash, ditunjukkan oleh indeks awal. Misalnya, 0 menunjukkan nilai hash 0–7, dan 8 menunjukkan 8–15.

    • Angka dalam tabel (0, 1, 2, dan seterusnya) merepresentasikan ID antrian penerima yang sesuai. Dalam contoh ini, terdapat 64 antrian (0–63).

    • Konfigurasi saat ini: Tabel indireksi diisi secara siklik dengan urutan 0,1,2,...,63,0,1,2...63, yang memastikan nilai hash dipetakan secara merata ke 64 antrian dan traffic didistribusikan secara merata.

  • Kunci hash RSS: Kunci yang digunakan untuk menghitung nilai hash. Karakter heksadesimal merepresentasikan kunci sepanjang 40 byte.

  • Fungsi hash RSS: Menentukan algoritma untuk menghitung nilai hash.

    • toeplitz: Ini adalah algoritma default dan saat ini diaktifkan. Mendukung penghashan simetris berdasarkan 5-tupel dan cocok untuk traffic tujuan umum.

    • xor/crc32: Ini adalah algoritma opsional lain yang biasanya digunakan dalam skenario tertentu. ECS saat ini hanya mendukung algoritma toeplitz, dan algoritma lain tidak didukung atau diaktifkan.

  • Aturan penghashan: Lihat konfigurasi bidang hash untuk traffic yang diterima oleh ENI primer.

    ethtool  -n eth0 rx-flow-hash tcp4
    • Anda dapat mengganti tcp4 dengan jenis protokol yang ingin Anda kueri, seperti udp4, tcp6, atau udp6.

    • Aturan penghashan default untuk RSS ENI ECS adalah sebagai berikut. Anda tidak dapat mengubah aturan ini.

      • Traffic TCP dan UDP melalui IPv4/IPv6: Nilai hash dihitung berdasarkan 4-tupel (IP sumber, IP tujuan, port sumber, dan port tujuan) serta kunci hash.

      • Traffic non-TCP/UDP melalui IPv4/IPv6, seperti ICMP: Nilai hash dihitung berdasarkan 2-tupel (IP sumber dan IP tujuan) serta kunci hash.

      • Pesan non-IP (seperti ARP) dikirim ke antrian default (antrian 0) dan tidak di-hash.

    • Mengambil tcp4 sebagai contoh, untuk traffic TCP IPv4, nilai hash dihitung secara default berdasarkan 4-tupel (IP sumber, alamat IP tujuan, port sumber, port tujuan) dan kunci hash:

      image

      Fitur traffic yang diharapkan adalah sebagai berikut:

      • Koneksi TCP yang sama: Semua paket memiliki nilai hash yang sama dan didistribusikan ke antrian yang sama. Hal ini memastikan pengurutan paket.

      • Koneksi TCP berbeda: Jika 4-tupel berbeda, nilai hash berbeda. Traffic didistribusikan ke antrian berbeda. Hal ini memungkinkan beberapa core CPU memproses koneksi berbeda secara paralel dan meningkatkan throughput.

Jika pesan berikut dikembalikan, custom RSS tidak diaktifkan atau tipe instans tidak mendukung fitur tersebut. Aktifkan custom RSS setelah memastikan tipe instans mendukungnya.

image

Konfigurasi custom RSS untuk ENI

Konfigurasi RSS default memenuhi sebagian besar kebutuhan. Anda mungkin perlu menyesuaikan kunci hash atau tabel indireksi dalam situasi berikut:

  • Traffic tidak merata: Nilai hash default dapat memusatkan traffic tertentu di beberapa antrian.

  • Optimasi kinerja: Sesuaikan aturan penghashan berdasarkan fitur traffic, seperti proporsi UDP tinggi, untuk meningkatkan pemanfaatan antrian.

  • Kebutuhan keamanan: Gunakan kunci hash kustom untuk mencegah penyerang memprediksi distribusi traffic.

Penting
  • Dalam contoh ini, instans dikonfigurasi dengan gambar Alibaba Cloud Linux 3.2104 LTS 64-bit.

  • Contoh ini menggunakan ENI primer eth0. Ganti pengenal antarmuka dengan eth1 atau eth2 untuk memodifikasi RSS untuk ENI sekunder yang sesuai.

  • Saat konfigurasi RSS tidak sesuai dengan fitur traffic Anda, hal ini dapat menyebabkan distribusi tidak merata dan contention state lintas core, yang memengaruhi kinerja. Sesuaikan berdasarkan karakteristik traffic aktual dan gunakan tool pemantauan untuk mengamati distribusi antrian secara real time.

Konfigurasi kunci hash

Buat ulang kunci hash RSS jika distribusi traffic tidak merata (misalnya, rx_packets beberapa antrian jauh lebih tinggi daripada yang lain), atau untuk mencegah penyerang menginferensi pola traffic dengan merekayasa balik nilai hash.

Penting

Memodifikasi kunci mengubah nilai hash koneksi yang ada, yang dapat menyebabkan pengiriman ulang atau pengurutan ulang paket sementara. Lakukan ini selama jam sepi.

  1. Lihat kunci hash saat ini dari ENI.

    Driver ENI menghasilkan kunci hash default sepanjang 40 byte saat ENI dimuat.

    ethtool -x eth0

    image

  2. Buat kunci acak baru menggunakan OpenSSL.

    openssl rand -hex 40 | fold -w2 | paste -sd: -
  3. Terapkan kunci baru ke ENI.

    Penting

    Ini adalah pengaturan sementara. Pengaturan ini tidak berlaku setelah instans direstart atau ENI disambungkan ulang. Driver ENI secara otomatis menginisialisasi konfigurasi default acak.

    ethtool -X eth0 hkey <hash key>

    Ganti <hash key> dengan kunci baru yang Anda buat pada langkah sebelumnya.

  4. Verifikasi bahwa kunci baru telah berlaku.

    ethtool -x eth0

    Output menunjukkan bahwa kunci baru telah berlaku:

    image

Konfigurasi tabel indireksi

Mode distribusi tabel indireksi RSS merupakan mekanisme inti yang memetakan nilai hash ke antrian penerima tertentu. Dengan menggunakan tabel indireksi yang telah ditentukan, hasil perhitungan hash dikonversi menjadi indeks antrian. Hal ini memungkinkan distribusi traffic fleksibel di berbagai core.

Mode distribusi berbeda, seperti distribusi seragam dan distribusi berbobot, secara langsung memengaruhi cara traffic didistribusikan ke core CPU. Hal ini selanjutnya memengaruhi throughput sistem, latensi, pemanfaatan resource, dan kinerja layanan.

Pilih mode distribusi berdasarkan skenario Anda.

Penting

Konfigurasi berikut bersifat sementara. Konfigurasi ini tidak berlaku setelah instans direstart atau ENI disambungkan ulang. Driver ENI menginisialisasi ulang konfigurasi default acak.

  • Mode distribusi seragam: N antrian pertama mengisi bucket hash secara berulang. Cocok untuk skenario high-concurrency umum.

    ethtool -X eth0 equal <Jumlah antrian N>

    Jika nilai diatur ke 64, tabel indireksi diisi secara berulang dengan 0,1,2,...,63,0,1,2...63,.

    image

  • Distribusi berbobot: Alokasikan bucket hash berdasarkan rasio bobot. Cocok untuk skenario dengan prioritas bisnis berbeda (misalnya, antrian 0 memproses traffic real-time dan antrian 1 memproses tugas latar belakang) atau kinerja CPU campuran.

    ethtool -X eth0 weight <bobot antrian 0> <bobot antrian 1> ...

    Dalam contoh berikut, antrian 0 mendapatkan 60% dan antrian 1 mendapatkan 40%:

    Catatan

    Jika terdapat empat antrian total, tetapi Anda hanya mengatur bobot untuk dua antrian, tabel indireksi hanya akan menghasilkan pemetaan untuk antrian 0 dan antrian 1.

    ethtool -X eth0 weight 6 4

    image

  • Distribusi antrian parsial: Mulai dari antrian tertentu, gunakan antrian berurutan untuk mengisi bucket hash secara berulang. Cocok untuk mengarahkan traffic ke rentang CPU tertentu, seperti node NUMA.

    ethtool -X eth0 start <antrian awal> equal <jumlah antrian>

    Dalam contoh berikut, antrian 2–41 (40 antrian mulai dari antrian 2) mengisi bucket hash:

    ethtool -X eth0 start 2 equal 40

    image

Gunakan watch untuk mengamati distribusi traffic

Setelah Anda mengaktifkan custom RSS pada ENI, gunakan hping3 untuk menghasilkan traffic dengan fitur berbeda dan watch untuk memantau distribusi interrupt antrian, memverifikasi apakah traffic didistribusikan ke beberapa core seperti yang diharapkan.

Prasyarat

Beli dua instance ECS dengan konfigurasi berikut:

  • Instance ECS pengirim (10.0.0.252): Instans yang diinstal dengan hping3 untuk menghasilkan traffic dengan fitur berbeda.

  • Instance ECS penerima: Instans yang tipenya mendukung multi-queue untuk ENI, dengan ENI sekunder yang disambungkan (10.0.0.5) dan custom RSS diaktifkan pada ENI sekunder eth1.

    Catatan
    • Contoh ini menggunakan empat antrian untuk pengujian.

    • Untuk menghilangkan dampak traffic login SSH pada ENI primer, custom RSS diaktifkan pada ENI sekunder eth1 untuk pengujian.

  • Konektivitas jaringan: Kedua instance ECS berada dalam grup keamanan yang sama dan dapat berkomunikasi satu sama lain melalui jaringan internal.

Prosedur

  1. Login ke instance ECS penerima, periksa konfigurasi RSS ENI sekunder, dan konfirmasi distribusi traffic yang diharapkan. Lihat Lihat konfigurasi RSS ENI.

    image

  2. Login ke instance ECS pengirim dan instal hping3.

    yum install -y hping3
  3. Pada instance penerima, pantau jumlah paket antrian secara real time.

    watch -n 1 "ethtool -S eth1 | grep rx[0,1,2,3]_packets"

    Ganti konfigurasi nomor antrian dengan konfigurasi aktual ENI penerima.

  4. Login ke instance ECS pengirim dan simulasi pola traffic berbeda.

    • Skenario 1: Kirim 10.000 paket SYN dengan kecepatan tinggi ke alamat IP penerima dengan port tujuan acak. Hal ini memastikan hash traffic tersebar dan memverifikasi keseimbangan hash.

      sudo hping3 10.0.0.5 -S -a 10.0.0.252 --rand-dest -p 0 --baseport 10000 -c 10000 -i u100 -I eth0
      • rand-dest: Port tujuan acak

      • -p 0: Digunakan dengan rand-dest

      • --baseport 10000: Nilai awal untuk port sumber.

      • -c 10000: Kirim 10.000 paket

      • -i u100: Menentukan interval 100 mikrodetik antar paket untuk pengiriman berkecepatan tinggi.

      • -I eth0: Digunakan dengan rand-dest untuk menentukan antarmuka jaringan pengirim

      Pada instance penerima, jumlah paket keempat antrian seharusnya meningkat secara merata:

      image

    • Skenario 2: Kirim traffic dengan alamat IP sumber dan port tetap. Hal ini menguji apakah traffic yang sama dipetakan ke antrian yang sama dan memverifikasi konsistensi hash.

      Perintah berikut mengirim 10.000 paket TCP SYN ke target 10.0.0.5:80, dengan IP sumber tetap ke 10.0.0.252 dan port sumber tetap ke 12345.

      sudo hping3 10.0.0.5 -S -p 80 -c 10000 -s 12345 -a 10.0.0.252 --keep -i u100
      • Nilai indeks hash dihitung berdasarkan skrip RSS. Traffic diharapkan diproses oleh antrian 0:

        image

      • Hasil pengamatan aktual pada instance ECS penerima (10.0.0.5):

        image

  5. Jika distribusi traffic tidak sesuai harapan (misalnya, beban suatu antrian jauh lebih tinggi), optimalkan dengan menyesuaikan kunci hash atau mengonfigurasi tabel indireksi.

Konfigurasi dan gunakan RSS dalam DPDK

Data Plane Development Kit (DPDK) adalah framework akselerasi bidang data open-source berbasis user-mode yang menggunakan driver user-mode, zero-copy, dan polling mode untuk mencapai pemrosesan paket mendekati kecepatan line-rate. Framework ini cocok untuk domain yang sensitif terhadap throughput dan latensi, seperti cloud telekomunikasi, fintech, dan komputasi tepi. Lihat Data Plane Development Kit (DPDK*).

Setelah Anda mengaktifkan custom RSS pada ENI, Anda dapat menggunakan testpmd dan l3fwd dalam DPDK untuk menguji dan memverifikasi distribusi RSS.

Instal dan konfigurasi DPDK pada instance ECS

Catatan
  • Jika Anda menggunakan fitur custom RSS dalam aplikasi DPDK, versi DPDK harus 21.11 atau lebih baru.

  • Topik ini menggunakan instance ecs.r9i.16xlarge (64 antrian) yang menjalankan gambar Alibaba Cloud Linux 3.2104 LTS 64-bit sebagai contoh untuk menunjukkan instalasi DPDK versi 22.11.3.

  • Contoh ini menggunakan ENI primer eth0. Ganti pengenal antarmuka dengan eth1 atau eth2 untuk memodifikasi RSS untuk ENI sekunder yang sesuai.

Langkah 1: Instal DPDK

Klik untuk melihat contoh langkah instalasi DPDK

  1. Perbarui sistem dan instal tool dasar.

    sudo yum update -y
    sudo yum install -y git wget gcc make kernel-devel-$(uname -r) numactl-devel python3 pciutils
  2. Instal dependensi DPDK.

    sudo yum install -y libpcap-devel meson ninja-build
  3. Konfigurasi huge pages.

    • DPDK melewati tumpukan protokol kernel untuk langsung mengoperasikan ENI. Huge pages (biasanya 2 MB) digunakan alih-alih halaman 4 KB untuk mengurangi TLB misses dan meningkatkan kecepatan akses memori.

    • Mengalokasikan terlalu banyak huge pages mengurangi memori normal yang tersedia untuk OS. Hal ini dapat menyebabkan aplikasi atau layanan sistem lain gagal. Alokasi berlebihan juga dapat mencegah konektivitas instans.

    • Hitung jumlah huge pages yang diperlukan berdasarkan kebutuhan memori aplikasi Anda.

      Jumlah huge pages = Memori aplikasi / Ukuran halaman. Ukuran halaman default adalah 2 MB. Misalnya, 16 GB / 2 MB = 8192 halaman.

    echo "vm.nr_hugepages = 8192" | sudo tee -a /etc/sysctl.conf
    sudo sysctl -p
  4. Buat dan mount direktori huge pages.

    sudo mkdir -p /dev/hugepages
    sudo mount -t hugetlbfs hugetlbfs /dev/hugepages
  5. Unduh kode sumber DPDK. Diperlukan koneksi Internet.

    cd ~
    wget https://fast.dpdk.org/rel/dpdk-22.11.3.tar.xz
    tar xf dpdk-22.11.3.tar.xz
    cd dpdk-stable-22.11.3
  6. Kompilasi DPDK.

    # Inisialisasi direktori build dan konfigurasikan opsi proyek, tentukan untuk membangun contoh forwarding Lapisan 3 l3fwd.
    meson setup -Dexamples=l3fwd build
    cd build
    # Kompilasi.
    ninja
    # Instal file yang telah dikompilasi ke direktori sistem.
    sudo ninja install
    # Perbarui cache library bersama sistem.
    sudo ldconfig

    Jika Anda mengalami error missing python module: elftools seperti yang ditunjukkan pada gambar di bawah selama kompilasi,

    image

    Tentukan versi Python Anda, instal pyelftools, dan kompilasi ulang:

    sudo /usr/bin/python3.8 -m pip install pyelftools

Langkah 2: Muat modul kernel

DPDK memerlukan modul kernel seperti UIO atau VFIO untuk akses perangkat user-mode. VFIO lebih disukai karena keamanannya (mengandalkan IOMMU), sedangkan UIO cocok untuk pengujian cepat. Contoh ini menggunakan VFIO.

  1. Aktifkan IOMMU.

    VFIO mengandalkan IOMMU untuk binding perangkat user-mode yang aman dan pemetaan DMA.

    1. Buka file.

      sudo vim /etc/default/grub
    2. Tekan i untuk masuk ke mode insert. Tambahkan intel_iommu=on ke parameter GRUB_CMDLINE_LINUX. Simpan dan tutup file.

      Contoh konfigurasi yang dimodifikasi:grub-config

    3. Terapkan konfigurasi.

      sudo grub2-mkconfig -o /boot/grub2/grub.cfg

      image.png

    4. Restart instans dan sambungkan kembali setelah instans menyala.

      reboot
      Peringatan

      Operasi restart menghentikan instans untuk waktu singkat dan dapat mengganggu layanan yang sedang berjalan pada instans. Kami menyarankan Anda untuk merestart instans selama jam sepi.

  2. Instal driver VFIO dan VFIO-PCI.

    sudo modprobe vfio && \
    sudo modprobe vfio-pci
  3. Aktifkan noiommu_mode.

    sudo bash -c 'echo 1 > /sys/module/vfio/parameters/enable_unsafe_noiommu_mode'

Langkah 3: Bind ENI ke driver DPDK

  1. Aktifkan custom RSS pada ENI.

    Pastikan custom RSS diaktifkan untuk ENI yang akan diambil alih oleh DPDK, dan ENI telah disambungkan ulang agar perubahan berlaku.

  2. Sambungkan ke instans menggunakan VNC.

  3. Lihat status binding driver perangkat PCI. Secara default, ENI dikelola oleh kernel.

    dpdk-devbind.py --status

    image

    • Perangkat 0000:00:05.0 dikelola oleh driver kernel virtio-pci, dan eth0 aktif.

    • Perangkat dapat dialihkan ke vfio-pci untuk pengambilalihan user-mode DPDK. Pertama nonaktifkan antarmuka dan lepas driver kernel.

  4. Nonaktifkan eth0.

    sudo ip link set dev eth0 down

    Jika Anda melewatkan langkah ini, binding ke VFIO gagal:

    image

  5. Lepaskan driver kernel dan bind ke VFIO.

    dpdk-devbind.py -b vfio-pci 0000:00:05.0

    Ganti pengenal perangkat PCI dengan yang Anda kueri untuk ENI Anda.

    Catatan

    Untuk mengikat ulang driver kernel, hentikan aplikasi DPDK dengan sudo pkill dpdk-app dan jalankan dpdk-devbind.py -b virtio-pci 0000:00:05.0.

  6. Lihat status binding driver perangkat PCI lagi. ENI sekarang seharusnya diambil alih oleh DPDK.

    Penting

    Saat ENI diambil alih oleh driver user-mode DPDK, kernel tidak lagi mengontrolnya. Perintah seperti ip a tidak dapat menampilkan informasinya.

    dpdk-devbind.py --status

    image

    Perangkat 0000:00:05.0 sekarang terikat ke vfio-pci.

Konfigurasi RSS menggunakan testpmd

Testpmd adalah tool pengujian DPDK untuk memverifikasi fitur driver ENI dan debugging aplikasi bidang data. Lihat Fungsi Runtime Testpmd.

Penting

Modifikasi konfigurasi ENI (jumlah antrian, aturan RSS, tabel RETA) hanya berlaku setelah memulai atau merestart forwarding paket.

  1. Sambungkan ke instans menggunakan VNC.

  2. Jalankan tool pengujian forwarding paket DPDK testpmd.

    dpdk-testpmd -a 0000:00:05.0 --socket-mem 1024 -- -i --portmask=0x1 --rxq=64 --txq=64  --forward-mode=rxonly
    • -a 0000:00:05.0: Menyambungkan ENI pada alamat PCI 0000:00:05.0 ke DPDK. Jalankan dpdk-devbind.py --status untuk menemukan alamat PCI.

    • --socket-mem 1024: Mengalokasikan sebelumnya memori huge page 1024 MB per node NUMA.

    • -i: Memulai mode command-line interaktif untuk menyesuaikan konfigurasi secara dinamis dan melihat statistik. Masukkan quit untuk keluar.

    • --portmask=0x1: Mengaktifkan mask port 0x1 (biner 0001), hanya menggunakan ENI pertama (alamat PCI 0000:00:05.0).

      • Setiap bit biner portmask berkorespondensi dengan port (0x1 mengaktifkan port 0, 0x3 mengaktifkan port 0 dan 1).

      • Hanya satu perangkat (0000:00:05.0) yang disambungkan, sehingga nomor port DPDK-nya adalah 0.

    • --rxq=64 / --txq=64: Mengatur jumlah antrian RX dan TX per port menjadi 64 untuk pemrosesan multi-queue. Ganti 64 dengan jumlah antrian ENI aktual.

    • --forward-mode=rxonly: Mode hanya menerima (paket diterima dan dibuang). Digunakan untuk menguji kinerja penerimaan ENI atau untuk pengambilan paket.

  3. Masuk ke mode interaktif dan kueri konfigurasi RSS saat ini.

    • Kueri informasi konfigurasi hash: show port info <port_id>

      port_id: Port tersebut. Dalam contoh ini, port 0.

      Klik untuk melihat contoh output

      image

    • Kueri kunci hash: show port <port_id> rss-hash key

      image

    • Kueri konfigurasi tabel indireksi: show port <port_id> rss reta <size> <mask0, mask1...>

      • size: Jumlah entri tabel indireksi yang dikueri. Nilainya tetap pada 128.

      • mask0, mask1: Mask yang digunakan untuk memfilter rentang indeks hash yang akan ditampilkan, yang ditentukan dalam format heksadesimal. Misalnya, mask0=0xff menunjukkan bahwa entri untuk indeks hash 0 hingga 7 ditampilkan.

        Ukuran tabel indireksi tetap pada 128. Diperlukan dua mask, masing-masing mencakup 64 blok indeks. Jalankan show port 0 rss reta 128 (0xffffffffffffffff,0xffffffffffffffff) untuk mengembalikan semua 128 pemetaan indeks-ke-antrian:

        Klik untuk melihat contoh output

        image

  4. Konfigurasi RSS berdasarkan kebutuhan Anda.

    • Konfigurasi kunci hash baru.

      Buat kunci acak baru dengan OpenSSL.

      port config <port_id> rss-hash-key (ipv4|ipv4-frag|\
                        ipv4-tcp|ipv4-udp|ipv4-sctp|ipv4-other|\
                        ipv6|ipv6-frag|ipv6-tcp|ipv6-udp|ipv6-sctp|\
                        ipv6-other|l2-payload|ipv6-ex|ipv6-tcp-ex|\
                        ipv6-udp-ex <string of hex digits \
                        (variable length, NIC dependent)>)

      Untuk TCP melalui IPv4, jalankan port config 0 rss-hash-key ipv4 6D5A56DA255B0EC24167253D43A38FB0D0CA2BCBAE7B30B477CB2DA38030F20C6A42B73BBEAC01FC untuk mengonfigurasi kunci hash dan verifikasi:

      image

    • Konfigurasi tabel indireksi RSS untuk memetakan nilai hash ke antrian tertentu.

      port config all rss reta <hash,queue>,<hash,queue>..

      Konfigurasikan berdasarkan jumlah antrian aktual:

      • hash: Indeks hash. Rentang tergantung pada ukuran tabel indireksi (misalnya, 0–63 untuk 64 entri).

      • queue: Nomor antrian penerima target.

Terapkan RSS dalam l3fwd

Untuk mengaktifkan RSS dalam aplikasi DPDK, implementasikan konfigurasi kunci hash dan tabel indireksi dalam kode Anda. Berikut menggunakan L3FWD sebagai contoh.

L3FWD (Layer 3 Forwarding) adalah aplikasi contoh DPDK yang menunjukkan routing paket berbasis IP berkinerja-tinggi menggunakan zero-copy dan Polling Mode Drivers (PMDs).

  1. Modifikasi kode sumber L3FWD dalam DPDK (examples/l3fwd/main.c).

    • Modifikasi bagian inisialisasi port static struct rte_eth_conf port_conf dalam kode contoh L3FWD.

      Klik untuk melihat modifikasi kode

      #define RSS_HASH_KEY_LENGTH 	40
      #define RSS_RETA_SIZE 			128
      
      static uint8_t hash_key[RSS_HASH_KEY_LENGTH] = {
          0x6D, 0x5A, 0x6D, 0x5A, 0x6D, 0x5A, 0x6D, 0x5A, 0x6D, 0x5A,
          0x6D, 0x5A, 0x6D, 0x5A, 0x6D, 0x5A, 0x6D, 0x5A, 0x6D, 0x5A,
          0x6D, 0x5A, 0x6D, 0x5A, 0x6D, 0x5A, 0x6D, 0x5A, 0x6D, 0x5A,
          0x6D, 0x5A, 0x6D, 0x5A, 0x6D, 0x5A, 0x6D, 0x5A, 0x6D, 0x5A,
      };
      
      static struct rte_eth_conf port_conf = {
      	.rxmode = {
      		.mq_mode = RTE_ETH_MQ_RX_RSS,
      		.offloads = RTE_ETH_RX_OFFLOAD_UDP_CKSUM | RTE_ETH_RX_OFFLOAD_TCP_CKSUM,
      	},
      	.rx_adv_conf = {
      		.rss_conf = {
      			.rss_key = hash_key,
      			.rss_hf = RTE_ETH_RSS_IP,
      			.rss_key_len = RSS_HASH_KEY_LENGTH,
      		},
      	},
      	.txmode = {
      		.mq_mode = RTE_ETH_MQ_TX_NONE,
      	},
      };
    • Tambahkan fungsi untuk mengonfigurasi tabel indireksi hash dan kunci hash.

      Klik untuk melihat kode yang ditambahkan

      /**
       * @brief Konfigurasikan RSS RETA (Redirection Table Array) untuk port tertentu.
       * 
       * @param port_id ID port yang akan dikonfigurasi.
       */
      
      void configure_rss_reta(uint16_t port_id) {
          struct rte_eth_rss_reta_entry64 reta_conf[RSS_RETA_SIZE / RTE_ETH_RETA_GROUP_SIZE];
          unsigned int i;
          uint16_t reta_size;
      	uint16_t nb_queues;
      	struct rte_eth_dev_info dev_info;
      
      	if (port_id >= RTE_MAX_ETHPORTS) {
              printf("port_id %d melebihi maksimum port eth\n", port_id);
              return;
          }
      
          if (rte_eth_dev_info_get(port_id, &dev_info) != 0) {
      		printf("Gagal mendapatkan info perangkat untuk port %d\n", port_id);
      		return;
      	}
      
          reta_size = dev_info.reta_size;
          if (reta_size == 0) {
              printf("Perangkat tidak mendukung konfigurasi RSS RETA.\n");
              return;
          }
      
      	nb_queues = dev_info.nb_rx_queues;
      	if (nb_queues == 0) {
      		printf("antrian RX port %d = 0\n", port_id);
      		return;
      	}
      
          // Inisialisasi tabel RETA
          memset(reta_conf, 0, sizeof(reta_conf));
          for (i = 0; i < reta_size; i++) {
              reta_conf[i / RTE_ETH_RETA_GROUP_SIZE].reta[i % RTE_ETH_RETA_GROUP_SIZE] = (uint16_t)(i % nb_queues);
          }
      
          // Konfigurasikan mask tabel RETA
          for (i = 0; i < reta_size; i += RTE_ETH_RETA_GROUP_SIZE) {
              reta_conf[i / RTE_ETH_RETA_GROUP_SIZE].mask = UINT64_MAX;
          }
      
      	// Perbarui tabel RSS RETA ke perangkat
      	if (rte_eth_dev_rss_reta_update(port_id, reta_conf, reta_size) != 0) {
      		printf("Gagal memperbarui tabel RSS RETA untuk port %u\n", port_id);
      		return;
      	}
      }
      
      /**
       * @brief Konfigurasikan kunci hash RSS untuk port tertentu.
       * 
       * @param port_id ID port yang akan dikonfigurasi.
       */
      void configure_rss_hash_key(uint16_t port_id) {
          struct rte_eth_rss_conf rss_conf;
      
      	if (port_id >= RTE_MAX_ETHPORTS) {
              printf("port_id %d melebihi maksimum port eth\n", port_id);
              return;
          }
      
          memset(&rss_conf, 0, sizeof(rss_conf));
          rss_conf.rss_key = hash_key;
          rss_conf.rss_key_len = sizeof(hash_key);
          
          // Perbarui kunci hash RSS ke perangkat
          if (rte_eth_dev_rss_hash_update(port_id, &rss_conf) != 0) {
              printf("Gagal memperbarui kunci hash RSS untuk port %u\n", port_id);
      		return;
          }
      }
    • Setelah rte_eth_dev_start, panggil fungsi konfigurasi baru.

      Klik untuk melihat kode pemanggilan dalam main

      @@ -1472,12 +1576,15 @@ main(int argc, char **argv)
                      /* Mulai perangkat */
      		ret = rte_eth_dev_start(portid);
      		if (ret < 0)
      			rte_exit(EXIT_FAILURE,
      				"rte_eth_dev_start: err=%d, port=%d\n",
      				ret, portid);
      				
      		configure_rss_reta(portid);
      		configure_rss_hash_key(portid);
  2. Kompilasi ulang L3FWD setelah memodifikasi kode sumber.

    cd ~/dpdk-stable-22.11.3/
    rm -rf build
    # Inisialisasi direktori build dan konfigurasikan opsi proyek, tentukan untuk membangun contoh forwarding Lapisan 3 l3fwd.
    meson setup -Dexamples=l3fwd build
    cd build
    # Kompilasi.
    ninja
    # Instal file yang telah dikompilasi ke direktori sistem.
    sudo ninja install
    # Perbarui cache library bersama sistem.
    sudo ldconfig
  3. Tentukan binding port-antrian-core dan mulai L3FWD.

    cd ~/dpdk-stable-22.11.3/build/examples
    ./dpdk-l3fwd --legacy-mem -a 0000:00:05.0 --socket-mem 1024 -- -p 0x1 --config="(PORT_ID, QUEUE_ID, LCORE_ID), (PORT_ID, QUEUE_ID, LCORE_ID), ..." --parse-ptype
    • --config: Setiap tripel menentukan:

      • PORT_ID: ID port (dimulai dari 0).

      • QUEUE_ID: ID antrian penerima (dimulai dari 0).

      • LCORE_ID: ID core logis (dimulai dari 0).

    • Contoh berikut menggunakan dua core dan dua antrian:

      ./dpdk-l3fwd --legacy-mem -a 0000:00:05.0 --socket-mem 1024 -- -p 0x1 --config="(0,0,0),(0,1,1)"  --parse-ptype
      • Tripel pertama (0,0,0): Core logis 0 (lcore0) memproses antrian 0 port 0.

      • Tripel kedua (0,1,1): Core logis 1 (lcore1) memproses antrian 1 port 0.

      image

Gunakan skrip RSS untuk menghitung indeks hash

Gunakan skrip Python ini untuk menghitung antrian penerima mana yang dipetakan oleh sebuah paket, berdasarkan 4-tupel dan kunci hash-nya. Hasilnya membimbing konfigurasi tabel indireksi untuk mengarahkan aliran tertentu ke antrian yang ditentukan.

Klik untuk melihat konten skrip ali_ecs_rss_calc.py

#!/usr/bin/python

import sys
import argparse
import re
import ipaddress

prog_name = sys.argv[0]
USAGE_EXAMPLE = """
Contoh penggunaan:
    Hitung hash Toeplitz dari paket yang dikirim dari 1.2.3.4 ke 1.2.3.5 dengan port sumber dan tujuan
    sebesar 7000:

    - Argumen kunci hash wajib karena driver virtio-net membuat kunci hash acak untuk semua NIC Anda.

    $ {prog_name} -t 1.2.3.4 -T 7000 -r 1.2.3.5 -R 7000 -k 77:d1:c9:34:a4:c9:bd:87:6e:35:dd:17:b2:e3:23:9e:39:6d:8a:93:2a:95:b4:72:3a:b3:7f:56:8e:de:b6:01:97:af:3b:2f:3a:70:e7:04
    
    - Jika Anda ingin menghitung nilai RSS dari paket yang protokolnya bukan TCP atau UDP, jangan tentukan
      port sumber dan tujuan. Skrip akan menghitung nilai hash hanya berdasarkan alamat IP.
      
    $ {prog_name} -t 1.2.3.4 -r 1.2.3.5 -k 77:d1:c9:34:a4:c9:bd:87:6e:35:dd:17:b2:e3:23:9e:39:6d:8a:93:2a:95:b4:72:3a:b3:7f:56:8e:de:b6:01:97:af:3b:2f:3a:70:e7:04
    
    - Gunakan "--ipv6" untuk menghitung nilai RSS paket IPv6.
    
    $ {prog_name} -t 2001:250:250:250:250:250:250:1 -T 7000 -r 2001:250:250:250:250:250:250:2 -R 7000 -k 77:d1:c9:34:a4:c9:bd:87:6e:35:dd:17:b2:e3:23:9e:39:6d:8a:93:2a:95:b4:72:3a:b3:7f:56:8e:de:b6:01:97:af:3b:2f:3a:70:e7:04 --ipv6

    Catatan: Diperlukan kernel Linux 5.9 atau lebih baru untuk mendukung konfigurasi fungsi dan kunci hash.
    
    Selain itu, kernel Linux versi lama sebelum ANCK 5.10-018 memiliki bug di mana kunci hash default yang ditampilkan oleh ethtool tidak
    sama dengan kunci yang digunakan oleh perangkat sebelum ada perubahan konfigurasi RSS secara manual. Skrip ini akan mencetak
    nilai hash yang benar dalam kasus tersebut jika Anda tidak menentukan kunci hash saat perhitungan.
""".format(prog_name = prog_name)

# Kunci default pada instans untuk kernel alinux lama (< ANCK 5.10-018) harus seperti di bawah ini, bukan kunci yang Anda dapatkan dari "ethtool -x <nic_name>".
RSS_DEFAULT_KEY = [
	0x6D, 0x5A, 0x56, 0xDA, 0x25, 0x5B, 0x0E, 0xC2,
	0x41, 0x67, 0x25, 0x3D, 0x43, 0xA3, 0x8F, 0xB0,
	0xD0, 0xCA, 0x2B, 0xCB, 0xAE, 0x7B, 0x30, 0xB4,
	0x77, 0xCB, 0x2D, 0xA3, 0x80, 0x30, 0xF2, 0x0C,
	0x6A, 0x42, 0xB7, 0x3B, 0xBE, 0xAC, 0x01, 0xFA,
]
# Kunci default pada instans untuk kernel alinux baru (>= ANCK 5.10-018) dihasilkan secara acak.

TOEPLITZ_KEY_SIZE = 128
BITS_IN_BYTE = 8

def circular_shift_key_one_left(key):
    """Melakukan pergeseran siklik ke kiri terhadap seluruh kunci.
    Untuk menggeser siklik semua 40 byte, fungsi ini
    menggeser bit antar byte yang berdekatan satu per satu."""

    l = len(key)
    return [ ((key[i] << 1) & 0xff) | ((key[(i + 1) % l] & 0x80) >> 7) for i in range(0, l) ]

def or_32msb_bits_of_key(key):
    return (key[0] << 24) | (key[1] << 16) | (key[2] << 8) | key[3]

def calculate_hash(rx_ip, rx_port, tx_ip, tx_port, initial_value, key):
    """Menghitung hash Toeplitz berdasarkan parameter yang diberikan.
    Catatan: Implementasi ini khusus untuk ENA dan mungkin tidak kompatibel
    dengan implementasi Toeplitz standar."""

    hash_result = initial_value
    input_bytes = list()
    input_bytes += tx_ip + rx_ip + tx_port + rx_port

    for input_byte in input_bytes:
        for i in range(BITS_IN_BYTE):
            # apakah bit ke-(8 - i -1) disetel
            if (input_byte & (1 << (BITS_IN_BYTE - i - 1))):
                hash_result ^= or_32msb_bits_of_key(key)

            key = circular_shift_key_one_left(key)

    return hash_result

def ipv4_addr_type(str):
    """Fungsi tipe argparse yang mengubah string
    IPv4 menjadi daftar bilangan bulat."""
    if not re.match(r"^([0-9]{1,3}\.){3}[0-9]{1,3}$", str):
        raise argparse.ArgumentTypeError("Alamat IP harus dalam format 1.2.3.4.")

    return [int(octet) for octet in str.split('.')]

def ipv6_addr_type(str):
    """Fungsi tipe argparse yang mengubah string
    IPv6 menjadi daftar bilangan bulat."""
    
    try:
        ip_str = ipaddress.IPv6Address(unicode(str))
    except ValueError as e:
        raise argparse.ArgumentTypeError("Format alamat IPv6 tidak valid: %s" % e)
    
    parts = ip_str.exploded.split(':')
    try:
        bytes_list = [int(part, 16) for part in parts]
        bytes_list = [(byte >> 8, byte & 0xff) for byte in bytes_list]
    except ValueError as e:
        raise argparse.ArgumentTypeError("Format alamat IPv6 tidak valid: %s" % e)
    
    return [item for sublist in bytes_list for item in sublist]

def toeplitz_key_type(str):
    """Fungsi tipe argparse yang mengubah string
    kunci Toeplitz menjadi daftar nilai heksadesimal."""
    if not re.match(r"^([0-9a-zA-Z]{1,2}:){39}[0-9a-zA-Z]{1,2}$", str):
        raise argparse.ArgumentTypeError("Format kunci Toeplitz tidak valid. Harus berupa 40 nilai heksadesimal yang dipisahkan tanda titik dua.")

    return [int(key_elem, 16) for key_elem in str.split(':')]

def main():

    parser = argparse.ArgumentParser(description='Kalkulator hash Toeplitz virtio-net',
                                     formatter_class=argparse.RawDescriptionHelpFormatter,
                                     epilog=USAGE_EXAMPLE)

    parser.add_argument('-r', '--rx-ip', help='IP sisi penerima', dest='rx_ip', nargs='?',
                        required=True, type=str)
    parser.add_argument('-R', '--rx-port', help='Port sisi penerima', dest='rx_port', nargs='?', type=int)
    parser.add_argument('-t', '--tx-ip', help='IP sisi pengirim', dest='tx_ip', nargs='?', 
                        required=True, type=str)
    parser.add_argument('-T', '--tx-port', help='Port sisi pengirim', dest='tx_port', nargs='?', type=int)
    parser.add_argument('-k', '--toeplitz-key',
                        help='Kunci Toeplitz (hanya pada instans yang mendukung perubahan kunci)',
                        dest='toeplitz_key', nargs='?', required=True, type=toeplitz_key_type)
    parser.add_argument('-i', '--ipv6',  action='store_true', help='Gunakan tipe alamat IPv6 untuk argumen IP')

    args = parser.parse_args()

    if args.ipv6:
        rx_ip   = ipv6_addr_type(args.rx_ip)
        tx_ip   = ipv6_addr_type(args.tx_ip)
    else:
        rx_ip   = ipv4_addr_type(args.rx_ip)
        tx_ip   = ipv4_addr_type(args.tx_ip)
    
    if args.rx_port and args.tx_port:
        # Pecah nomor port menjadi representasi dua byte
        rx_port = [(args.rx_port & 0xff00) >> 8, args.rx_port & 0x00ff]
        tx_port = [(args.tx_port & 0xff00) >> 8, args.tx_port & 0x00ff]
    else:
        rx_port = tx_port = []
    
    key = args.toeplitz_key

    # hitung hash dengan nilai awal 0
    hash = calculate_hash(rx_ip, rx_port, tx_ip, tx_port, 0, key)
    rss_table_entry_128 = hash % 128
    rss_table_entry_256 = hash % 256

    if args.ipv6:
        print("Mengirim traffic dari [{}]:{} ke [{}]:{}".format(args.tx_ip, args.tx_port, args.rx_ip, args.rx_port))
    else:
        print("Mengirim traffic dari {}:{} ke {}:{}".format(args.tx_ip, args.tx_port, args.rx_ip, args.rx_port))
    print("""Hash dihitung berdasarkan bidang berikut:
    Alamat IP sumber
    Alamat IP tujuan""")
    if args.rx_port and args.tx_port:
        print("""    Port sumber
    Port tujuan""")
    print("Seharusnya menghasilkan hash berikut untuk semua driver:".ljust(50) + "{}".format(hex(hash)))
    print("Entri tabel RSS (panjang total 128):".ljust(50) + "{}".format(rss_table_entry_128))
    print("Entri tabel RSS (panjang total 256):".ljust(50) + "{}".format(rss_table_entry_256))
    return

if __name__ == '__main__':
    main()

Klik untuk melihat penggunaan skrip

Lihat penggunaan skrip: python ali_ecs_rss_calc.py -h.

image

Contoh berikut menggunakan konfigurasi RSS dari sebuah ENI dengan 64 antrian:

image

Hitung nilai hash RSS menggunakan skrip dengan informasi 5-tuple berikut (sesuaikan nilai sesuai kebutuhan).

  • Alamat IP tujuan (-r): 10.0.0.1, yaitu alamat IP ENI instans penerima yang telah dikonfigurasi RSS.

  • Alamat IP sumber (-t): 10.0.0.251, yaitu alamat IP ENI pengirim.

  • Port tujuan (-R): 26000

  • Port sumber (-T): 18042

  • Kunci hash: Diperoleh dari konfigurasi tabel indirection RSS.

python ali_ecs_rss_calc.py -r 10.0.0.1 -t 10.0.0.251 -R 26000 -T 18042 -k 69:e8:7c:56:bf:03:9f:63:d7:c5:e5:96:b3:00:36:93:02:8c:d2:8f:cc:a9:00:65:fd:c8:94:71:5f:fd:c8:de:7a:30:a9:73:b3:33:0c:c6

Skrip tersebut menghitung hash menggunakan algoritma toeplitz. Pada hasil di bawah ini, sistem menggunakan panjang tabel indirection sebesar 128. Indeks hash 117 berarti paket dipetakan ke antrian pada indeks 117.

image

Lihat tabel indirection: indeks 117 dipetakan ke antrian 53, sehingga paket diproses oleh antrian 53.

image