Bekerja dengan Onload

Halaman ini menjelaskan cara menggunakan Onload dengan instance Compute Engine U4.

Tentang Onload

Onload adalah stack jaringan berperforma tinggi untuk aplikasi yang sensitif terhadap latensi dan memerlukan latensi ultra-rendah, jitter minimal, dan performa yang konsisten. Onload menyediakan penerapan TCP/IP yang mengabaikan kernel sistem operasi dan berjalan langsung di ruang pengguna sekaligus memungkinkan aplikasi menggunakan API soket BSD standar.

Penggunaan Onload dengan Solusi ULL mencakup dukungan untuk hal berikut:

Sebelum memulai

Sebelum menggunakan Onload di instance Compute Engine U4, Anda harus memenuhi persyaratan berikut.

Buat instance U4

Jika belum, buat instance Compute Engine U4 menggunakan salah satu prosedur berikut yang mencakup konfigurasi yang diperlukan untuk Onload:

Menghubungkan ke instance menggunakan SSH

Jika belum, hubungkan ke instance Anda menggunakan SSH.

Beralih ke pengguna root

Perintah dan skrip dalam prosedur berikut mengubah setelan tingkat sistem, parameter kernel, dan antarmuka jaringan. Agar berhasil menjalankannya, Anda harus menjalankannya sebagai pengguna root. Anda dapat beralih ke shell root dengan menjalankan sudo su, atau menambahkan sudo sebelum menjalankan perintah sesuai kebutuhan.

Menyiapkan Onload

Bagian ini menjelaskan langkah-langkah yang diperlukan untuk menyiapkan Onload di instance U4.

Menginstal dependensi

  1. Jika Anda menggunakan Rocky Linux, aktifkan repositori CodeReady Builder (CRB). Jika Anda menggunakan Red Hat Enterprise Linux (RHEL), lewati langkah ini.

    dnf -y config-manager --enable crb
    
  2. Instal dependensi yang diperlukan untuk Onload:

    dnf -y install git clang \
       python3-setuptools \
       linuxptp \
       libcap-devel libbpf-devel libxdp-devel
    

Menarik sumber Onload

Untuk menarik repositori onload dengan perubahan yang diperlukan, jalankan perintah berikut:

umask 0022
mkdir -p /usr/src/

git clone https://github.com/Xilinx-CNS/onload /usr/src/onload

# 9.2.0.43 / 9.2.1, origin/v9_2 as of May 18, 2026
git -C /usr/src/onload checkout origin/v9_2

# Pull Google-specific Onload changes not yet merged as of v9_2
curl -L https://github.com/Xilinx-CNS/onload/pull/279.patch | git -C /usr/src/onload am
curl -L https://github.com/Xilinx-CNS/onload/pull/282.patch | git -C /usr/src/onload am
curl -L https://github.com/Xilinx-CNS/onload/pull/325.patch | git -C /usr/src/onload am
curl -L https://github.com/Xilinx-CNS/onload/pull/327.patch | git -C /usr/src/onload am

Build Onload

Untuk membangun Onload, jalankan perintah berikut:

cd /usr/src/onload
USEONLOADEXT=1 ./scripts/onload_install --no-sfc

pushd ./src/tools/bpf_link_helper
clang xdp_onload_prepare.c  -lbpf -o xdp_onload_prepare
clang -target bpf -O2 -g -c xdp_tstamp.c -o ./xdp_tstamp.o
popd

Menonaktifkan Pelacakan Cabang Tidak Langsung (IBT)

IBT harus dinonaktifkan untuk menggunakan Onload seperti yang dijelaskan dalam Ketidakcocokan Pelacakan Cabang Tidak Langsung (IBT) .

Untuk menonaktifkan IBT, jalankan perintah berikut:

grubby --args="ibt=off" --update-kernel=ALL
reboot

Memuat dan Menurunkan Muatan

Bagian ini menjelaskan cara memuat Onload di instance Anda.

Memuat Onload di instance U4P atau U4C

Untuk memuat Onload di instance bare metal U4P atau U4C, gunakan skrip berikut.

IFNAMES=($( find /sys/class/net -type l -not -lname '*virtual*' -printf '%l %f\n' | sort | awk '{print $2}'))

for IFNAME in "${IFNAMES[@]}"; do
  ethtool -L "${IFNAME}" rx 16 tx 16
  ethtool -G "${IFNAME}" rx 1024 rx-buf-len 2048
  ethtool -K "${IFNAME}" ntuple on
  echo 0 > "/sys/class/net/${IFNAME}/threaded"
  /usr/src/onload/src/tools/bpf_link_helper/xdp_onload_prepare \
    "${IFNAME}" /usr/src/onload/src/tools/bpf_link_helper/xdp_tstamp.o
done

setenforce 0
numactl --cpunodebind=0,2 onload_tool reload --onload-only
for IFNAME in "${IFNAMES[@]}"; do
  echo "${IFNAME}" 16 > /sys/module/sfc_resource/afxdp/register
  until [[ $(cat "/sys/class/net/${IFNAME}/carrier") == 1 ]]; do
    sleep 1
  done
  hwstamp_ctl -i "${IFNAME}" -r 1
done

echo 1 > /sys/module/sfc_resource/parameters/enable_af_xdp_flow_filters
echo 256 > /sys/module/onload/parameters/xdp_headroom
echo -1 > /sys/module/onload/parameters/inject_kernel_gid

Memuat Onload di instance U4S

Untuk memuat Onload di instance VM U4S, gunakan skrip berikut.

IFNAME=NIC_NAME
ALLOCATED_QUEUES=ALLOCATED_QUEUES

ethtool -L "$IFNAME" rx "${ALLOCATED_QUEUES}" tx "${ALLOCATED_QUEUES}"
ethtool -G "$IFNAME" rx 1024 rx-buf-len 2048
ethtool -K "$IFNAME" ntuple on
echo 0 > "/sys/class/net/${IFNAME}/threaded"
/usr/src/onload/src/tools/bpf_link_helper/xdp_onload_prepare "$IFNAME" \
  /usr/src/onload/src/tools/bpf_link_helper/xdp_tstamp.o

setenforce 0
numactl --cpunodebind=0 onload_tool reload --onload-only

echo "${IFNAME} ${ALLOCATED_QUEUES}" | tee /sys/module/sfc_resource/afxdp/register
until [[ $(cat "/sys/class/net/${IFNAME}/carrier") == 1 ]]; do
    sleep 1
done
hwstamp_ctl -i "$IFNAME" -r 1

echo 1 > /sys/module/sfc_resource/parameters/enable_af_xdp_flow_filters
echo 256 > /sys/module/onload/parameters/xdp_headroom
echo -1 > /sys/module/onload/parameters/inject_kernel_gid

Ganti kode berikut:

  • NIC_NAME: nama OS antarmuka jaringan, seperti enp22s0f0.
  • ALLOCATED_QUEUES: jumlah antrean penerimaan (RX) dan pengiriman (TX) yang akan dialokasikan untuk Onload di antarmuka jaringan. Tetapkan nilai ini ke setengah dari total jumlah antrean RX atau TX yang ditetapkan ke vNIC.

    Untuk instance U4S, jumlah total antrean (untuk antrean RX atau TX) sama dengan num_vcpus / num_vnics, hingga maksimum 16 antrean per vNIC. Misalnya, jika vNIC memiliki total 4 antrean TX, tetapkan nilai ini ke 2. Jika vNIC memiliki total 16 antrean TX, tetapkan nilai ini ke 8.

    Untuk mengetahui informasi selengkapnya tentang alokasi antrean default, lihat Antrean penerimaan dan transmisi.

Mengonfigurasi tanda Onload

Untuk mengoptimalkan performa dan membantu mengurangi latensi, Anda dapat menggunakan serangkaian variabel lingkungan dan tanda berikut saat menjalankan aplikasi dengan Onload. Bagian ini mencakup setelan yang direkomendasikan yang dapat Anda sesuaikan sesuai kebutuhan untuk aplikasi Anda.

Anda harus menentukan parameter ini sebelum perintah aplikasi Anda. Misalnya, untuk menjalankan aplikasi dengan setelan ini, gunakan format berikut:

env EF_NO_FAIL=0 \
  EF_POLL_USEC=100000 \
  EF_RX_TIMESTAMPING=3 \
  EF_MAX_ENDPOINTS=1048576 \
  EF_WODA_SINGLE_INTERFACE=1 \
  EF_UL_EPOLL=3 \
  EF_USE_HUGE_PAGES=0 \
  EF_EPOLL_CTL_HANDOFF=0 \
  EF_FDS_MT_SAFE=0 \
  EF_NONAGLE_INFLIGHT_MAX=-1 \
  EF_RXQ_SIZE=4096 \
  EF_TCP_RCVBUF_ESTABLISHED_DEFAULT=65536 \
  EF_MAX_PACKETS=65536 \
  EF_PREFAULT_PACKETS=65536 \
  EF_EVS_PER_POLL=256 \
  onload -v --profile=latency APPLICATION_COMMAND

Hapus muatan, Muat

Untuk membatalkan pemuatan Onload, gunakan skrip berikut.

IFNAMES=($( find /sys/class/net -type l -not -lname '*virtual*' -printf '%l %f\n' | sort | awk '{print $2}'))

for IFNAME in "${IFNAMES[@]}"; do
  rm -f "/sys/fs/bpf/onload_xdp_xsk_${IFNAME}"
done

onload_tool unload --onload-only

for IFNAME in "${IFNAMES[@]}"; do
  # (optional) Disable threaded busypolling in case it's up. See busypolling
  # section
  echo 0 > "/sys/class/net/${IFNAME}/threaded"

  ip link set dev "${IFNAME}" xdp off
done

Mengonfigurasi layanan systemd yang otomatis dimulai saat Onload

Untuk memulai Onload secara otomatis saat instance melakukan booting, Anda dapat mendaftarkannya sebagai layanan systemd. Buat file layanan menggunakan template berikut:

[Unit]
Description=ULL Solution -- Loading & instance tuning for Onload
After=network-online.target
After=google-guest-agent-manager.service google-guest-agent.service
Before=multi-user.target
Before=sshd.service

[Service]
Type=oneshot
RemainAfterExit=yes
ExecStart=START_SCRIPT_PATH
ExecStartPost=OPTIMIZATION_SCRIPT_PATH
ExecStop=STOP_SCRIPT_PATH

[Install]
WantedBy=multi-user.target

Ganti kode berikut:

  • START_SCRIPT_PATH: jalur ke skrip yang memulai Onload, seperti salah satu skrip di Load Onload.
  • OPTIMIZATION_SCRIPT_PATH: jalur ke skrip opsional yang menerapkan konfigurasi pengoptimalan. Jika diinginkan, Anda dapat membuat skrip yang mencakup pengoptimalan performa dan menyertakannya di sini. Jika tidak, Anda dapat menghapus baris yang menyertakan variabel ini.
  • STOP_SCRIPT_PATH: jalur ke skrip yang menghentikan Onload, seperti skrip di Unload Onload.

Mengonfigurasi polling sibuk

Bagian ini memberikan contoh cara mengonfigurasi polling sibuk di instance Anda.

Polling sibuk terus memeriksa paket jaringan baru, bukan menunggu interupsi perangkat, yang membantu mengurangi latensi dan jitter. Untuk mengetahui informasi selengkapnya tentang polling sibuk, lihat Polling sibuk dalam dokumentasi Kernel Linux.

Mendapatkan antrean RX yang digunakan oleh stack Onload

Untuk mendapatkan antrean RX yang digunakan oleh stack Onload, lakukan hal berikut:

  1. Dapatkan ID stack Onload dengan menjalankan onload_stackdump:

    onload_stackdump
    
  2. Karena ID stack Onload dan ID antrean NAPI mungkin tidak selalu cocok, gunakan skrip berikut untuk mendapatkan nama antarmuka, indeks, dan ID antrean yang sesuai dari ID stack.

    ONLOAD_STACK=ONLOAD_STACK_ID
    
    INTF_HWPORT_MAP=($(onload_stackdump "${ONLOAD_STACK}" netif_extra | grep -oP "intf_i_to_hwport=\K.*$" | tr ',' '\n'))
    HWPORT_IFINDEX_MAP=($(onload_stackdump "${ONLOAD_STACK}" hwport_to_base_ifindex | grep -oP "\d+$"))
    while read -r INTF_ID QUEUE_ID; do
    HW_PORT="${INTF_HWPORT_MAP[INTF_ID]}"
    IFINDEX="${HWPORT_IFINDEX_MAP[HW_PORT]}"
    IFNAME=$(ip -j link | jq -r ".[] | select(.ifindex == ${IFINDEX}) | .ifname")
    echo "ifname=${IFNAME} ifindex=${IFINDEX} queue_id=${QUEUE_ID}"
    done < <(onload_stackdump "${ONLOAD_STACK}" netif | grep -oP "((intf|vi)=)\K\d+" | xargs -n 2)

    Ganti ONLOAD_STACK_ID dengan ID stack yang ingin Anda aktifkan atau nonaktifkan polling sibuknya.

  3. Catat nilai yang akan digunakan saat Anda mengaktifkan atau menonaktifkan polling sibuk di bagian berikut.

Mengaktifkan polling sibuk di antrean RX

Bagian ini memberikan contoh cara mengaktifkan polling sibuk pada antrean RX tertentu yang digunakan oleh stack Onload.

  1. Jalankan skrip bash berikut di terminal Anda. Fungsi enable_single_queue melakukan hal berikut:

    • Mendapatkan napi_id yang sesuai dengan antrean RX menggunakan netlink (ynl)
    • Menetapkan properti threaded: busy-poll pada napi_id
    • Mendapatkan kthread_pid thread yang sibuk melakukan polling napi_id
    • Menggunakan taskset untuk mengikat kthread_pid ke CPU tertentu
    readonly NETDEV_YAML=${NETDEV_YAML:-"/usr/share/ynl/specs/netdev.yaml"}
    
    call_ynl() {
      ynl --spec "${NETDEV_YAML}" "$@"
    }
    
    enable_single_queue() {
      local -r interface="$1"
      local -r ifindex=$(cat "/sys/class/net/${interface}/ifindex")
      local -r q_id="$2"
      local -r cpu="$3"
    
      local napi_id
      napi_id=$(call_ynl --output-json --do queue-get \
        --json "{\"ifindex\": ${ifindex}, \"id\": ${q_id}, \"type\": \"rx\"}" | \
        jq -r '."napi-id"')
    
      if [[ -z "${napi_id}" || "${napi_id}" == "null" ]]; then
        echo "Error: No napi_id found for queue ${q_id} on interface ${interface}" >&2
        exit 1
      fi
    
      echo "Enabling busypolling for queue ${q_id} (NAPI ${napi_id}) on CPU ${cpu}"
      call_ynl --do napi-set --json "{\"id\": \"${napi_id}\", \"threaded\": \"busy-poll\"}" >/dev/null
    
      local napi_kthread_pid
      napi_kthread_pid=$(call_ynl --do napi-get --output-json \
        --json "{\"id\": \"${napi_id}\"}" | jq -r '."pid" // empty')
    
      if [[ -z "${napi_kthread_pid}" ]]; then
        echo "Error: Could not get PID for NAPI ${napi_id}" >&2
        exit 1
      fi
    
      taskset -pc "${cpu}" "${napi_kthread_pid}" >/dev/null
    }
  2. Jalankan perintah berikut untuk memanggil fungsi enable_single_queue:

    enable_single_queue NIC_NAME QUEUE_ID CPU_ID
    

    Ganti kode berikut:

    • NIC_NAME: nama OS antarmuka jaringan, seperti ens8f0.
    • QUEUE_ID: ID antrean yang Anda dapatkan sebelumnya.
    • CPU_ID: ID CPU tempat menjalankan thread polling sibuk, seperti 5.
  3. Pastikan Anda merencanakan peristiwa pembuatan ulang thread yang dapat memengaruhi konfigurasi polling sibuk Anda.

Merencanakan peristiwa pembuatan ulang thread

Saat kernel membuat ulang thread, konfigurasi thread terkait tidak dipertahankan, seperti mask afinitas CPU dan kebijakan penjadwalannya. Peristiwa seperti berikut menyebabkan kernel membuat ulang thread yang sedang melakukan polling NAPI:

  • Flapping/reset link
  • Lampiran program XDP (misalnya, saat menjalankan skrip untuk memuat Onload atau melampirkan program XDP kustom)
  • Perubahan parameter dering (ethtool -G)
  • Perubahan jumlah antrean (ethtool -L)

Untuk membantu mencegah masalah, sebaiknya hindari tugas yang menyebabkan peristiwa pembuatan ulang thread selama operasi normal.

Untuk mempertahankan konfigurasi polling sibuk setelah thread dibuat ulang, Anda harus mendapatkan ID Proses (PID) thread yang baru dan mengikatnya kembali ke CPU. Anda dapat melakukannya dengan menjalankan fungsi enable_single_queue lagi.

Menonaktifkan polling sibuk di antrean RX

Bagian ini memberikan contoh cara menonaktifkan polling sibuk pada antrean RX tertentu yang digunakan oleh stack Onload.

  1. Dapatkan antrean RX yang digunakan oleh stack Onload dengan menjalankan onload_stackdump:

    onload_stackdump
    
  2. Jalankan skrip bash berikut di terminal Anda. Fungsi disable_single_queue melakukan hal berikut:

    • Mendapatkan napi_id yang sesuai dengan antrean RX menggunakan netlink (ynl)
    • Menetapkan properti berulir napi_id ke disabled
    disable_single_queue() {
      local -r interface="$1"
      local -r ifindex=$(cat "/sys/class/net/${interface}/ifindex")
      local -r q_id="$2"
    
      local napi_id
      napi_id=$(call_ynl --output-json --do queue-get \
        --json "{\"ifindex\": ${ifindex}, \"id\": ${q_id}, \"type\": \"rx\"}" | \
        jq -r '."napi-id"')
    
      if [[ -z "${napi_id}" || "${napi_id}" == "null" ]]; then
        echo "Error: No napi_id found for queue ${q_id} on interface ${interface}" >&2
        exit 1
      fi
    
      echo "Disabling busypolling for queue ${q_id} (NAPI ${napi_id})"
      call_ynl --do napi-set --json "{\"id\": \"${napi_id}\", \"threaded\": \"disabled\"}" >/dev/null
    }
  3. Jalankan perintah berikut untuk memanggil fungsi disable_single_queue:

    disable_single_queue NIC_NAME QUEUE_ID
    

    Ganti kode berikut:

    • NIC_NAME: nama OS antarmuka jaringan, seperti ens8f0.
    • QUEUE_ID: ID antrean yang Anda dapatkan sebelumnya.

Mendapatkan status polling sibuk antrean

Untuk memeriksa status NAPI antrean guna melihat apakah antrean sedang melakukan polling, Anda dapat menggunakan perintah berikut:

IFNAME=NIC_NAME
QUEUE_ID=QUEUE_ID
QUEUE_TYPE=QUEUE_TYPE

IFINDEX=$(cat "/sys/class/net/${IFNAME}/ifindex")
NAPI_ID=$(ynl --spec /usr/share/ynl/specs/netdev.yaml \
  --output-json --do queue-get \
  --json '{"ifindex": '${IFINDEX}', "id": '${QUEUE_ID}', "type": "'${QUEUE_TYPE}'"}' | \
  jq '."napi-id"')
ynl --spec /usr/share/ynl/specs/netdev.yaml \
  --output-json --do napi-get \
  --json '{"id": '${NAPI_ID}'}' | jq -r '"status: \(.threaded)"'

Ganti kode berikut:

  • NIC_NAME: nama OS antarmuka jaringan, seperti ens8f0.
  • QUEUE_ID: ID antrean yang ingin Anda periksa.
  • QUEUE_TYPE: rx atau tx.

Optimalkan performa

Bagian ini memberikan panduan umum untuk mengoptimalkan performa instance bare metal U4 (U4P dan U4C). Sesuaikan contoh dalam panduan ini sesuai kebutuhan workload Anda.

Meninjau topologi NUMA untuk instance bare metal U4

Tabel berikut menjelaskan antarmuka jaringan mana yang menggunakan node NUMA mana untuk instance bare metal U4:

NIC (Google Cloud name) NIC (nama OS) Node NUMA BDF PCIE
nic0 enp22s0f0 0 0000:16:00.0
nic1 ens8f0 0 0000:27:00.0
nic2 ens48f0 2 0000:b8:00.0

Tabel sebelumnya mencakup nama antarmuka jaringan yang ditetapkan OS umum untuk RHEL. Nama sebenarnya mungkin berbeda.

Menentukan skema isolasi CPU

Untuk performa terbaik, sebaiknya Anda mengisolasi hal berikut:

  • CPU yang digunakan oleh aplikasi Anda
  • CPU yang digunakan untuk melakukan polling sibuk pada antrean RX Onload
  • CPU yang digunakan untuk interupsi kernel dan driver

Tabel berikut memberikan contoh cara mengisolasi CPU pada instance bare metal U4. Sesuaikan pemetaan sesuai kebutuhan workload Anda, misalnya, Anda mungkin menginginkan lebih banyak CPU aplikasi.

Tujuan CPU
Interupsi kernel umum 0,1,30,31,60,61,90,91
Interupsi pengemudi nic0 untuk antrean 0-11 2
Interupsi pengemudi nic1 untuk antrean 0-11 3
Interupsi driver nic0 dan nic1 untuk antrean 12-15 4
nic1 polling sibuk 5-16
nic1 thread aplikasi (Onload) 17-29
nic0 polling sibuk 32-43
nic0 thread aplikasi (Onload) 44-59
Interupsi pengemudi nic2 untuk antrean 0-11 62
Interupsi driver nic2 untuk antrean 12-15 63
nic2 polling sibuk 64-75
nic2 thread aplikasi (Onload) 76-89

Menginstal dependensi untuk pengoptimalan performa

Untuk menginstal dependensi yang diperlukan untuk pengoptimalan performa, jalankan perintah berikut:

dnf -y install numactl tuna jq

Mengonfigurasi parameter booting kernel

Untuk mengisolasi CPU dari penjadwalan kernel, jalankan perintah berikut. Tindakan ini juga menonaktifkan Intel QuickAssist Technology (QAT) agar tidak mengganggu core terisolasi Anda.

Contoh perintah berikut mengisolasi CPU 2-29, 32-59, dan 62-89 serta menetapkan 0,1,30,31,60,61,90,91 untuk interupsi kernel umum. Nilai ini sesuai dengan skema isolasi CPU contoh. Ganti nilai sesuai kebutuhan, bergantung pada skema isolasi CPU Anda.

grubby --args="isolcpus=domain,managed_irq,2-29,32-59,62-89 nohz=on nohz_full=2-29,32-59,62-89 rcu_nocbs=2-29,32-59,62-89 irqaffinity=0,1,30,31,60,61,90,91 rcu_nocb_poll modprobe.blacklist=intel_qat,qat_4xxx" --update-kernel=ALL
reboot

Mengonfigurasi isolasi CPU setelah booting

Untuk mengisolasi CPU setelah booting, jalankan perintah berikut. Nilai sesuai dengan contoh skema isolasi CPU. Ganti nilai sesuai kebutuhan, bergantung pada skema isolasi CPU kita.

tuna isolate -c 2-29,32-59,62-89

Menetapkan interupsi antrean ke CPU tertentu

Bagian ini menjelaskan cara memindahkan permintaan interupsi (IRQ) antrean gve ke CPU tertentu. Driver gve digunakan oleh jenis antarmuka jaringan GVNIC di Google Cloud.

  1. Tentukan IRQ untuk antarmuka jaringan dan rentang antrean tertentu. Lihat contoh bash berikut, yang menentukan fungsi irq_list.

    irq_list() {
      local ifname=$1
      local queue_begin=$2
      local queue_end=$3
    
      pci_name=$(basename $(readlink /sys/class/net/${ifname}/device))
      rx_ntfy_blk_start=$(ethtool -l "${ifname}" | awk '
        /Pre-set maximums:/ { in_preset = 1 }
        /Current hardware settings:/ { in_preset = 0 }
        in_preset && $1 == "RX:" { rx = $2 }
        in_preset && $1 == "TX:" { tx = $2 }
        END { print int((rx + tx) / 2) }
      ')
      for i in $(seq "${queue_begin}" "${queue_end}"); do
        irq_tx="gve-ntfy-blk${i}@pci:${pci_name}"
        irq_rx="gve-ntfy-blk$(($i + rx_ntfy_blk_start))@pci:${pci_name}"
        # gve IRQ names are stored in a char[IFNAMSIZ + 16] so capped to 31 characters.
        echo "${irq_tx:0:31}"
        echo "${irq_rx:0:31}"
      done | paste -sd ','
    }
  2. Tetapkan IRQ ke CPU yang sesuai berdasarkan skema isolasi CPU Anda. Contoh skrip berikut menggunakan tuna dan fungsi irq_list dari langkah sebelumnya:

    tuna move -c 2 -q "$(irq_list enp22s0f0 0 11)"
    tuna move -c 4 -q "$(irq_list enp22s0f0 12 15)"
    
    tuna move -c 3 -q "$(irq_list ens8f0 0 11)"
    tuna move -c 4 -q "$(irq_list ens8f0 12 15)"
    
    tuna move -c 62 -q "$(irq_list ens48f0 0 11)"
    tuna move -c 63 -q "$(irq_list ens48f0 12 15)"

Mengonfigurasi setelan OS dan perangkat

  1. Jalankan skrip berikut untuk mengonfigurasi setelan yang membantu meminimalkan latensi dan mencegah perilaku OS default mengganggu konfigurasi Onload Anda.

    echo 0 > /proc/sys/net/core/busy_poll
    echo 0 > /proc/sys/net/core/busy_read
    echo 0 > /proc/sys/kernel/timer_migration
    echo 0 > /proc/sys/net/core/rps_sock_flow_entries
    echo -1 > /proc/sys/kernel/sched_rt_runtime_us
    
    for IFNAME in "${IFNAMES[@]}"; do
      ethtool -C "${IFNAME}" rx-usecs 0 tx-usecs 0
      echo 0 > "/sys/class/net/${IFNAME}/napi_defer_hard_irqs"
      echo 15000 > "/sys/class/net/${IFNAME}/gro_flush_timeout"
    done
  2. Untuk mengalihkan traffic dari antrean yang dikhususkan untuk workload Onload, gunakan RSS (ethtool -X). Contoh skrip berikut didasarkan pada nilai dalam contoh skema isolasi CPU. Karena Onload menggunakan antrean 0-11, skrip mengarahkan semua traffic lainnya ke antrean 12-15.

    for IFNAME in "${IFNAMES[@]}"; do
      ethtool -X "${IFNAME}" weight 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1
    done

Langkah berikutnya