Top Menu

Melompat ke isi
Home
    Modul
      • Project
      • Activity
      • Paket-Penugasan
      • Gantt charts
      • News
    • Getting started
    • Video pengantar
      Selamat datang di Open Project untuk Open Networking Indonesia
      Dapatkan ikhtisar singkat manajemen proyek dan kolaborasi tim dengan OpenProject. Anda dapat memulai ulang video ini dari menu bantuan.

    • Help and support
    • Upgrade to Enterprise edition
    • User guides
    • Videos
    • Shortcuts
    • Community forum
    • Dukungan perusahaan

    • Additional resources
    • Data privacy and security policy
    • Digital accessibility (DE)
    • Situs web OpenProject
    • Peringatan keamanan / Jurnal berkala
    • OpenProject blog
    • Release notes
    • Report a bug
    • Development roadmap
    • Add and edit translations
    • API documentation
  • Login
      Buat akun baru
      Lupa password?

Sidemenu

  • Tinjauan
  • Paket-Penugasan
    Paket-Penugasan
  • Gantt charts
    Gantt charts
  • News
  • Wiki

Konten

Kamu di sini:
  1. Journal

Diperbarui oleh Excel Sebastianus 7 bulan yang lalu

# FD.io VPP + FRRouting

#
Spesifikasi Perangkat

<figure class="table op-uc-figure_align-center op-uc-figure"><table class="op-uc-table"><tbody><tr class="op-uc-table--row"><td class="op-uc-table--cell"><p class="op-uc-p">Model Perangkat</p></td><td class="op-uc-table--cell"><p class="op-uc-p">Operating System</p></td><td class="op-uc-table--cell"><p class="op-uc-p">Memory</p></td><td class="op-uc-table--cell"><p class="op-uc-p">Processor</p></td></tr><tr class="op-uc-table--row"><td class="op-uc-table--cell"><p class="op-uc-p">BITBOX EXA ZEN 5000 2G-2S-2CQ</p></td><td class="op-uc-table--cell"><p class="op-uc-p">Debian 12.5</p></td><td class="op-uc-table--cell"><p class="op-uc-p">64 GB</p></td><td class="op-uc-table--cell"><p class="op-uc-p">AMD Ryzen 9 5950x</p></td></tr><tr class="op-uc-table--row"><td class="op-uc-table--cell"><p class="op-uc-p">BITBOX EXA EVO A7500-2G-4S+2CQ</p></td><td class="op-uc-table--cell"><p class="op-uc-p">Ubuntu 22.04</p></td><td class="op-uc-table--cell"><p class="op-uc-p">64 GB</p></td><td class="op-uc-table--cell"><p class="op-uc-p">AMD EPYC 7542</p></td></tr></tbody></table></figure><br style="page-break-after:always;">

# Persyaratan Pra-Instalasi

## Packages Utama

Paket-paket penting yang harus diinstal sebelum membangun VPP

```bash
sudo apt install make cpufrequtils git
```

## Packages Tambahan

Paket tambahan sebagai opsional

```bash
sudo apt install htop net-tools ipmitool lshw rsync traceroute snmpd snmp traceroute mtr
```

## Governor Mode

Mengaktifkan mode performance pada Governor dapat membuat proses pembangunan VPP menjadi lebih cepat.

```bash
sudo echo 'GOVERNOR="performance"' > /etc/default/cpufrequtils
sudo systemctl enable cpufrequtils
sudo systemctl start cpufrequtils
sudo systemctl reboot
```

<br style="page-break-after:always;">

# Binding NIC ke Drivers yang kompatible dengan DPDK

Sebelum DPDK atau VPP dapat sepenuhnya mengontrol NIC, kita perlu melepaskannya dari default network driver Linux kernel dan mengikatnya ke user-space driver seperti `vfio-pci` atau `uio_pci_generic`. Langkah ini sangat penting untuk memungkinkan zero-copy packet processing dan mencapai high performance yang dikenal dari DPDK.

Sebelum melanjutkan, penting untuk memahami secara dasar apa itu DPDK — yaitu kumpulan libraries dan drivers yang dirancang untuk memungkinkan fast packet processing di user space dengan melewati kernel networking stack.

Dalam bagian ini, kita akan melakukan unbind terhadap dua NIC spesifik, yaitu **Intel X710-DA4** dan **Mellanox ConnectX-5**, dari default kernel driver-nya, lalu mengikatnya ke user-space driver untuk mengaktifkan fungsi DPDK.

NIC Intel akan di-bind ke driver `vfio-pci` _(catatan: IOMMU harus diaktifkan untuk dapat menggunakan_ `_vfio_`_)_. Di sisi lain, Mellanox ConnectX-5 memerlukan pendekatan berbeda. Tidak seperti NIC generic lainnya, perangkat Mellanox paling optimal digunakan dengan native driver `mlx5_core` di kernel, yang memberikan dukungan penuh untuk **MLX5 Poll Mode Driver (PMD)** di DPDK. Karena itu, NIC Mellanox tidak perlu di-bind ke `vfio` atau `uio`, dan sebaiknya tetap terhubung dengan `mlx5_core` agar VPP dapat memanfaatkan MLX5 PMD secara optimal.

###

###
IOMMU

**IOMMU** adalah singkatan dari **Input-Output Memory Management Unit**. Ini adalah fitur hardware yang memungkinkan akses memory yang aman dan efisien antara perangkat (seperti **NICs**) dan aplikasi user-space. Saat menggunakan driver seperti `vfio-pci`, **IOMMU** berperan penting dengan mengaktifkan **DMA (Direct Memory Access)** disertai isolasi dan proteksi memory yang ketat.

Dalam konteks **DPDK**, mengaktifkan **IOMMU** diperlukan untuk dapat melakukan bind NIC ke `vfio-pci` dengan aman, sehingga aplikasi user-space dapat langsung mengakses device memory tanpa membahayakan stabilitas sistem akibat akses memory yang tidak sah.

Untuk menggunakan `vfio-pci`, pastikan sistem Anda memenuhi persyaratan berikut:

* **IOMMU** didukung dan diaktifkan di BIOS/UEFI (contoh: Intel VT-d atau AMD-Vi).

* **IOMMU** diaktifkan pada Linux kernel boot parameters (contoh: `intel_iommu=on` atau `amd_iommu=on` di GRUB).


**Edit GRUB**

```bash
nano /etc/default/grub
```

**Contoh**

```text
# untuk AMD Family
GRUB_CMDLINE_LINUX_DEFAULT="amd_iommu=on"

# untuk Intel Family
GRUB_CMDLINE_LINUX_DEFAULT="intel_iommu=on"
```

**Update GRUB**

```bash
sudo systemctl update-grub
```

<br style="page-break-after:always;"> &lt;br&gt;

### **Binding secara otomatis**

Untuk menjalankan **VPP** secara otomatis setelah reboot, cara terbaik adalah membuat script dan service **systemd** yang melakukan binding NIC ke driver yang kompatibel dengan **DPDK** pada saat startup. Dengan cara ini, tidak perlu melakukan konfigurasi manual setiap kali reboot, sehingga network interfaces langsung siap digunakan oleh VPP.

**Catatan:** Perlu menyesuaikan alamat **PCI** pada contoh berikut sesuai dengan konfigurasi hardware NIC yang digunakan.

**Shell Script ( Diperlukan)**

```shell
nano /usr/local/bin/dpdk-bind.sh
```

```shell
#!/bin/bash

# Enable vfio driver
sudo modprobe vfio-pci

# Unbind Mellanox ConnectX-5 from mlx5_core
echo 0000:2d:00.0 > /sys/bus/pci/devices/0000:2d:00.0/driver/unbind
echo 0000:2d:00.1 > /sys/bus/pci/devices/0000:2d:00.1/driver/unbind
echo 0000:3a:00.0 > /sys/bus/pci/devices/0000:3a:00.0/driver/unbind
echo 0000:3a:00.1 > /sys/bus/pci/devices/0000:3a:00.1/driver/unbind

# Bind to DPDK Compatible Driver
echo 0000:2d:00.0 > /sys/bus/pci/drivers/mlx5_core/bind
echo 0000:2d:00.1 > /sys/bus/pci/drivers/mlx5_core/bind
echo 0000:3a:00.0 > /sys/bus/pci/drivers/vfio-pci/bind
echo 0000:3a:00.1 > /sys/bus/pci/drivers/vfio-pci/bind
```

```shell
chmod +x /usr/local/bin/dpdk-bind.sh
```

**Systemd Service ( Diperlukan)**

```shell
nano /etc/systemd/system/dpdk-bind.service
```

```systemd
[Unit]
Description=DPDK NIC Binding Service
After=network.target

[Service]
Type=oneshot
ExecStart=/usr/local/bin/dpdk-bind.sh
RemainAfterExit=yes

[Install]
WantedBy=multi-user.target
```

```shell
sudo systemctl enable dpdk-bind.service
sudo systemctl start dpdk-bind.service
```

<br style="page-break-after:always;">

# **Membangun VPP**

Menginstal VPP melalui **apt** tidak direkomendasikan karena banyak driver dan library yang diperlukan tidak disertakan, yang dapat mengakibatkan ketidakcocokan hardware dengan VPP.

## **Mengunduh VPP**

VPP dapat diunduh dari dua sumber, namun pastikan disimpan pada direktori yang benar.

```text
sudo mkdir -p ~/src
cd ~/src
```

Mengunduh VPP dari **GitHub**

```text
# Untuk versi terbaru
git clone https://github.com/FDio/vpp.git

# Untuk versi yang lebih spesifik
# Contoh
git clone -b stable/2410 https://github.com/FDio/vpp.git
```

Mengunduh VPP dari **Gerrit**

```text
# Untuk versi terbaru
git clone https://gerrit.fd.io/r/vpp

# Untuk versi spesifik
git clone -b XXXX https://gerrit.fd.io/r/vpp
```

> _Versi VPP yang paling saya rekomendasikan adalah **24.06 – 25.02**._
>
> <br style="page-break-after:always;">


## **Installing the VPP**

Proses ini akan memakan waktu beberapa menit, dan kecepatannya tergantung pada model CPU. Jadi, silakan ambil secangkir teh dan tunggu dengan sabar.

```text
# Menginstal package yang dibutuhkan oleh VPP
sudo make install-deps
# Menginstal package yang disimpan di build/external
sudo make install-ext-deps
# Membuat versi Release
sudo make build-release
# Membuat package .deb untuk Debian dan menyimpannya di build-root
sudo make pkg-deb
# Menginstal VPP
cd build-root/
sudo dpkg -i *.deb
```

<br style="page-break-after:always;">

## **Konfigurasi**

Performa VPP sangat bergantung pada konfigurasi yang diberikan, termasuk pengaturan seperti hugepages, alokasi memory, penugasan core, dan lain-lain. Jika konfigurasi yang digunakan terlalu sedikit atau berlebihan, VPP dapat mengalami crash atau menjadi tidak stabil.

### **Alokasi Hugepages**

VPP secara otomatis menghasilkan file sysctl yang dapat digunakan sebagai referensi untuk konfigurasi hugepages.

```shell
nano /etc/sysctl.d/80-vpp.conf
```

_File konfigurasi ini ditujukan sebagai referensi untuk perangkat dengan spesifikasi menengah - rendah._

```text
# Jumlah hugepages 2MB yang diinginkan
vm.nr_hugepages=3072

# Harus lebih besar atau sama dengan (2 * vm.nr_hugepages).
vm.max_map_count=7168

# Semua grup diizinkan untuk mengakses hugepages
vm.hugetlb_shm_group=0

# Shared Memory Max harus lebih besar atau sama dengan total ukuran hugepages.
# Untuk halaman 2MB, TotalHugepageSize = vm.nr_hugepages * 2 * 1024 * 1024
# Jika nilai kernel.shmmax yang ada (cat /proc/sys/kernel/shmmax)
# lebih besar daripada nilai TotalHugepageSize yang dihitung maka atur parameter ini
# ke nilai shmmax saat ini.
kernel.shmmax=6442450944
```

_File konfigurasi ini berfungsi sebagai referensi untuk proyek **BITBOX EXA ZEN 5000 2G-2S-2CQ**._

```text
vm.nr_hugepages=16384
vm.max_map_count=32768
vm.hugetlb_shm_group=0
kernel.shmmax=34359738368
```

```text
# Terapkan pengaturan dengan sysctl
sudo sysctl -p /etc/sysctl.d/80-vpp.conf
```

<br style="page-break-after:always;">

### **Ukuran Buffer Socket**

VPP tidak secara otomatis membuat parameter ini, tetapi dapat didefinisikan secara manual dan disimpan di direktori `/etc/sysctl.d/`.

_**Penjelasan Parameter**_

<figure class="table op-uc-figure_align-center op-uc-figure"><table class="op-uc-table"><thead class="op-uc-table--head"><tr class="op-uc-table--row"><th class="op-uc-table--cell op-uc-table--cell_head"><p class="op-uc-p"><code class="op-uc-code">net.core.rmem_default</code></p></th><th class="op-uc-table--cell op-uc-table--cell_head"><p class="op-uc-p"><strong>Ukuran buffer penerimaan default (dalam byte) untuk socket TCP/UDP.</strong></p></th></tr></thead><tbody><tr class="op-uc-table--row"><td class="op-uc-table--cell"><p class="op-uc-p"><code class="op-uc-code">net.core.wmem_default</code></p></td><td class="op-uc-table--cell"><p class="op-uc-p">Ukuran buffer pengiriman default (dalam byte) untuk socket TCP/UDP.</p></td></tr><tr class="op-uc-table--row"><td class="op-uc-table--cell"><p class="op-uc-p"><code class="op-uc-code">net.core.rmem_max</code></p></td><td class="op-uc-table--cell"><p class="op-uc-p">Ukuran buffer penerimaan maksimum yang dapat diminta socket melalui <code class="op-uc-code">SO_RCVBUF</code>.</p></td></tr><tr class="op-uc-table--row"><td class="op-uc-table--cell"><p class="op-uc-p"><code class="op-uc-code">net.core.wmem_max</code></p></td><td class="op-uc-table--cell"><p class="op-uc-p">Ukuran buffer pengiriman maksimum yang dapat diminta socket melalui <code class="op-uc-code">SO_SNDBUF</code>.</p></td></tr></tbody></table></figure>

_**Contoh Konfigurasi**_

```text
nano /etc/sysctl.d/81-vpp-netlink.conf
```

```text
net.core.rmem_default=67108864
net.core.wmem_default=67108864
net.core.rmem_max=67108864
net.core.wmem_max=67108864
```

```text
# Terapkan konfigurasi menggunakan sysctl
sudo sysctl -p /etc/sysctl.d/81-vpp-netlink.conf
```

<br style="page-break-after:always;">

### _**Konfigurasi Startup**_

_**File ini akan berfungsi sebagai sumber konfigurasi utama untuk VPP dan akan dibuat secara otomatis dengan pengaturan default.**_

```text
nano /etc/vpp/startup.conf
```

_Contoh konfigurasi berdasarkan perangkat saya_

```text
unix {
nodaemon
log /var/log/vpp/vpp.log
cli-listen /run/vpp/cli.sock
gid vpp
full-coredump
poll-sleep-usec 10
exec /etc/vpp/bootstrap.vpp
}

api-trace { on }
api-segment { gid vpp }
socksvr { default }

memory {
main-heap-size 16G
main-heap-page-size default-hugepage
}

cpu {
main-core 7
corelist-workers 8-15
}

buffers {
buffers-per-numa 262144
default data-size 2048
page-size default-hugepage
}

dpdk {
uio-driver vfio-pci
dev default{
num-rx-desc 4096
num-tx-desc 4096
}
dev 0000:2d:00.0 {
name cqsfp1
num-rx-queues 8
}
dev 0000:2d:00.1 {
name cqsfp2
num-rx-queues 8
}
dev 0000:3a:00.0 {
name sfplus1
num-rx-queues 4
}
dev 0000:3a:00.1 {
name sfplus2
num-rx-queues 4
}
}

statseg {
size 1G
page-size default-hugepage
per-node-counters off
}

plugins {
plugin linux_cp_plugin.so { enable }
plugin linux_nl_plugin.so { enable }
plugin dpdk_plugin.so { enable }
}

linux-cp {
default netns dataplane
lcp-sync
lcp-auto-subint
}
```

<br style="page-break-after:always;">

### **Bootstrap**

VPP tidak secara otomatis menyimpan konfigurasinya, dan juga tidak menyediakan perintah seperti **write memory** pada FRRouting. Oleh karena itu, kita dapat membuat sebuah file yang berisi perintah-perintah yang diperlukan sehingga VPP dapat memuat dan menerapkannya secara otomatis saat startup.

```text
nano /etc/vpp/bootstrap.vpp
```

Contoh isi dari _**bootstrap**_

```text
# Membuat loopback interface
create loopback interface instance 0
lcp create loop0 host-if loop0
set interface state loop0 up

# Konfigurasi sfplus1
set interface mtu packet 9000 sfplus1
set interface state sfplus1 up
lcp create sfplus1 host-if sfplus1

# Konfigurasi sfplus2
set interface mtu packet 9000 sfplus2
set interface state sfplus2 up
lcp create sfplus2 host-if sfplus2

# Konfigurasi cqsfp1
set interface mtu packet 9000 cqsfp1
set interface state cqsfp1 up
lcp create cqsfp1 host-if cqsfp1

# Konfigurasi cqsfp2
set interface mtu packet 9000 cqsfp2
set interface state cqsfp2 up
lcp create cqsfp2 host-if cqsfp2

# Membuat Bond100G
create bond mode lacp load-balance l34 id 0
bond add BondEthernet0 cqsfp1
bond add BondEthernet0 cqsfp2
set interface state BondEthernet0 up
lcp create BondEthernet0 host-if BondEthernet0

# Membuat Bond11
create bond mode lacp load-balance l34 id 11
bond add BondEthernet11 sfplus1
bond add BondEthernet11 sfplus2
set interface state BondEthernet11 up
lcp create BondEthernet11 host-if BondEthernet11

# Membuat Interface Vlan 10
create sub-interfaces BondEthernet0 10
set interface mtu packet 1500 BondEthernet0.10
set interface state BondEthernet0.10 up
```

<br style="page-break-after:always;">

## **Mengintegrasikan dengan FRRouting**

VPP tidak dapat terhubung langsung ke software routing seperti FRRouting karena VPP berjalan di **user space**. Oleh karena itu, baik VPP maupun FRRouting perlu ditempatkan dalam **network namespace** agar dapat saling berkomunikasi.

### **Dataplane**

```text
nano /usr/lib/systemd/system/netns-dataplane.service
```

```text
[Unit]
Description=Dataplane network namespace
After=systemd-sysctl.service network-pre.target
Before=network.target network-online.target

[Service]
Type=oneshot
RemainAfterExit=yes

PrivateNetwork=yes

ExecStartPre=-/usr/bin/echo "Creating dataplane network namespace"
ExecStart=-/usr/sbin/ip netns delete dataplane
ExecStart=-/usr/bin/mkdir -p /etc/netns/dataplane
ExecStart=-/usr/bin/touch /etc/netns/dataplane/resolv.conf
ExecStart=-/usr/sbin/ip netns add dataplane
ExecStart=-/usr/bin/umount /var/run/netns/dataplane
ExecStart=-/usr/bin/mount --bind /proc/self/ns/net /var/run/netns/dataplane
ExecStart=-/usr/sbin/ip netns exec dataplane /usr/lib/systemd/systemd-sysctl
ExecStop=-/usr/sbin/ip netns delete dataplane

[Install]
WantedBy=multi-user.target
WantedBy=network-online.target
```

```text
sudo systemctl enable netns-dataplane
sudo systemctl start netns-dataplane
```

<br style="page-break-after:always;">

### Service SSH

Layanan SSH bawaan tidak secara otomatis terhubung ke network namespace dan memerlukan layanan SSH tambahan untuk mengaktifkan fungsi ini.

```text
nano /usr/lib/systemd/system/ssh-dataplane.service
```

```text
[Unit]
Description=OpenBSD Secure Shell server (Dataplane Namespace)
Documentation=man:sshd(8) man:sshd_config(5)
After=network.target auditd.service
ConditionPathExists=!/etc/ssh/sshd_not_to_be_run
Requires=netns-dataplane.service
After=netns-dataplane.service

[Service]
EnvironmentFile=-/etc/default/ssh
ExecStartPre=/usr/sbin/ip netns exec dataplane /usr/sbin/sshd -t
ExecStart=/usr/sbin/ip netns exec dataplane /usr/sbin/sshd -oPidFile=/run/sshd-dataplane.pid -D $SSHD_OPTS
ExecReload=/usr/sbin/ip netns exec dataplane /usr/sbin/sshd -t
ExecReload=/usr/sbin/ip netns exec dataplane /bin/kill -HUP $MAINPID
KillMode=process
Restart=on-failure
RestartPreventExitStatus=255
Type=notify
RuntimeDirectory=sshd
RuntimeDirectoryMode=0755

[Install]
WantedBy=multi-user.target
Alias=sshd-dataplane.service
```

```text
sudo systemctl enable ssh-dataplane
sudo systemctl start ssh-dataplane
```

<br style="page-break-after:always;">

# FRRouting

FRRouting menyediakan fungsi routing yang luas dan lebih mudah dikonfigurasi. Instalasi FRRouting mengikuti prosedur standar yang diberikan oleh dokumentasi resmi, tetapi diperlukan beberapa konfigurasi tambahan agar dapat terhubung ke network namespace.

## **Instalasi**

```text
# tambahkan GPG key
curl -s https://deb.frrouting.org/frr/keys.gpg | sudo tee /usr/share/keyrings/frrouting.gpg > /dev/null

# nilai yang mungkin untuk FRRVER:
frr-6 frr-7 frr-8 frr-9 frr-9.0 frr-9.1 frr-10 frr10.0 frr10.1 frr-10.2 frr-10.3 frr-stable
# frr-stable akan menjadi rilis stabil resmi terbaru
FRRVER="frr-stable"
echo deb '[signed-by=/usr/share/keyrings/frrouting.gpg]' https://deb.frrouting.org/frr \
$(lsb_release -s -c) $FRRVER | sudo tee -a /etc/apt/sources.list.d/frr.list

# update dan install FRR
sudo apt update && sudo apt install frr frr-pythontools
```

<br style="page-break-after:always;">

## **Konfigurasi**

**Seperti disebutkan sebelumnya, FRRouting memerlukan parameter tambahan untuk mengaktifkan koneksinya dengan network namespace.**

```text
nano /etc/frr/daemons
```

Parameter tambahan

```text
# Tambahkan ini
watchfrr_options="--netns=dataplane"
```

# Isolasi

Sebelum mengonfigurasi FRRouting dengan protokol seperti BGP, OSPF, atau menetapkan alamat IP, pastikan bahwa antarmuka jaringan terdeteksi dengan benar dan tidak ada error pada sisi VPP — seperti perangkat PCI yang hilang, LACP yang tidak aktif, dan sebagainya.

Setelah VPP dan FRRouting berjalan normal, disarankan untuk mengunci alokasi core CPU (dengan mengisolasi core CPU) untuk VPP agar memastikan kinerja yang konsisten.

## Isolate CPU

Secara bawaan, core CPU tidak diisolasi — bahkan jika penggunaannya mencapai 100%, seperti yang terlihat dengan alat seperti **btop**, terutama untuk thread utama dan worker milik VPP. Core tersebut masih dapat digunakan oleh layanan lain, yang dapat menyebabkan penurunan kinerja. Oleh karena itu, saya sangat merekomendasikan untuk mengisolasi core CPU yang didedikasikan untuk VPP.

```text
nano /etc/default/grub
```

```text
# Sesuaikan dengan CPU yang digunakan oleh VPP pada startup.conf
GRUB_CMDLINE_LINUX="iommu=pt amd_iommu=on isolcpus=7-15 nohz_full=7-15 rcu_nocbs=7-15"
```

```text
# Terapkan konfigurasi grub yang baru
sudo update-grub
sudo systemctl reboot
```

<br style="page-break-after:always;">

Telegram @excelsebastianus

LinkedIn : [**linkedin.com/in/exlsebastianussm**](https://www.linkedin.com/in/exlsebastianussm)

BitBox Link : [`https://bitbox.id/product`](https://bitbox.id/product)
style=&quot;page-break-after:always;&quot;&gt;&lt;br&gt;
Loading...