Menggunakan Onload

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

Tentang Onload

Onload adalah stack jaringan berperforma tinggi untuk aplikasi sensitif latensi yang memerlukan latensi ultra-rendah, jitter minimal, dan performa yang konsisten. Onload menyediakan implementasi TCP/IP yang mengabaikan kernel sistem operasi dan berjalan langsung di ruang pengguna sekaligus memungkinkan aplikasi menggunakan API socket 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.

Membuat instance U4

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

Menghubungkan ke instance menggunakan SSH

Jika belum, hubungkan ke instance 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 mengeksekusinya 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 numactl \
       python3-setuptools \
       linuxptp \
       libcap-devel libbpf-devel libxdp-devel
    

Mengambil sumber Onload

Untuk mengambil 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

# Latest commit on v9_2 branch to which patches can be applied cleanly
git -C /usr/src/onload checkout f4283aa7258cbaaf1f0c9946a67176b1b4997003

# Verify tree hash for the base commit
[[ "$(git -C /usr/src/onload rev-parse HEAD^{tree})" \
    == "e6e6f1e86ae667050433049f2c23d674f013f794" ]] || \
    { echo "ERROR: mismatch tree hash"; exit 1; }

# 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 -3
curl -L https://github.com/Xilinx-CNS/onload/pull/282.patch | git -C /usr/src/onload am -3
curl -L https://github.com/Xilinx-CNS/onload/pull/325.patch | git -C /usr/src/onload am -3
curl -L https://github.com/Xilinx-CNS/onload/pull/327.patch | git -C /usr/src/onload am -3

# Verify tree hash after applying patches
[[ "$(git -C /usr/src/onload rev-parse HEAD^{tree})" \
    == "7a5f1772431d9dc55560ace0fee6b6231cf7dac2" ]] || \
    { echo "ERROR: mismatch tree hash"; exit 1; }

Membangun 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 Indirect Branch Tracking (IBT)

IBT harus dinonaktifkan untuk menggunakan Onload seperti yang dijelaskan dalam Ketidakcocokan Indirect Branch Tracking (IBT) .

Untuk menonaktifkan IBT, jalankan perintah berikut:

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

Memuat Onload

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
  ethtool -K "${IFNAME}" rx-gro-hw off
  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
ethtool -K "$IFNAME" rx-gro-hw off
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 penerima (RX) dan pengirim (TX) yang akan dialokasikan untuk Onload di antarmuka jaringan. Tetapkan nilai ini ke setengah dari jumlah total 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 penerima dan pengirim.

Mengonfigurasi flag Onload

Untuk mengoptimalkan performa dan membantu mengurangi latensi, Anda dapat menggunakan kumpulan variabel lingkungan dan flag 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

Menghapus muatan Onload

Untuk menghapus muatan 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 memulai Onload

Untuk memulai Onload secara otomatis saat instance Anda melakukan booting, Anda dapat mendaftarkannya sebagai systemd layanan. 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 Memuat Onload.
  • OPTIMIZATION_SCRIPT_PATH: jalur ke skrip opsional yang menerapkan konfigurasi pengoptimalan. Jika diinginkan, Anda dapat membuat skrip yang menyertakan pengoptimalan performa dan menyertakan nya di sini. Jika tidak, Anda dapat menghapus baris yang menyertakan variabel ini.
  • STOP_SCRIPT_PATH: jalur ke skrip yang menghentikan Onload, seperti skrip di Menghapus muatan 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 polling sibuknya ingin Anda aktifkan atau nonaktifkan.

  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 di 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 dari 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 mungkin memengaruhi konfigurasi polling sibuk Anda.

Merencanakan peristiwa pembuatan ulang thread

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

  • Link flaps/resets
  • Lampiran program XDP (misalnya, saat menjalankan skrip untuk memuat Onload atau melampirkan program XDP kustom)
  • Perubahan parameter ring (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) baru dari thread dan mengikatnya kembali ke CPU. Anda dapat melakukannya dengan menjalankan enable_single_queue fungsi lagi.

Menonaktifkan polling sibuk di antrean RX

Bagian ini memberikan contoh cara menonaktifkan polling sibuk di 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 thread dari 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 tersebut sibuk 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.

Mengoptimalkan performa

Bagian ini memberikan panduan umum untuk mengoptimalkan performa instance bare metal U4 (U4P dan U4C). Sesuaikan contoh dalam panduan ini sesuai kebutuhan untuk 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 nama) NIC (nama OS) Node NUMA PCIE BDF
nic0 enp22s0f0 0 0000:16:00.0
nic1 ens8f0 0 0000:27:00.0
nic2 ens48f0 2 0000:b8:00.0

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

Menentukan skema isolasi CPU

Untuk performa terbaik, sebaiknya isolasi hal berikut:

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

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

Tujuan CPU
Interupsi kernel umum 0,1,30,31,60,61,90,91
Interupsi driver nic0 untuk antrean 0-11 2
Interupsi driver nic1 untuk antrean 0-11 3
Interupsi driver nic0 dan nic1 untuk antrean 12-15 4
Polling sibuk nic1 5-16
Thread aplikasi nic1 (Onload) 17-29
Polling sibuk nic0 32-43
Thread aplikasi nic0 (Onload) 44-59
Interupsi driver nic2 untuk antrean 0-11 62
Interupsi driver nic2 untuk antrean 12-15 63
Polling sibuk nic2 64-75
Thread aplikasi nic2 (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) sehingga 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 contoh skema isolasi CPU. 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 pasca-booting

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

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

Menetapkan interupsi antrean ke CPU tertentu

Bagian ini menjelaskan cara memindahkan permintaan interupsi antrean (IRQ) 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 mengarahkan 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 akan 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