Attach XDP program to interface before running ctstraffic #178
Workflow file for this run
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# Copyright (c) Microsoft Corporation | |
# SPDX-License-Identifier: MIT | |
# This workflow will download the latest ebpf-for-windows MSI installer and run | |
# the BPF performance tests. The results will be uploaded as an artifact. | |
name: ebpf-for-windows | |
on: | |
# Permit manual runs of the workflow. | |
workflow_dispatch: | |
inputs: | |
ref: | |
description: 'EBPF Branch or Commit' | |
required: false | |
default: 'main' | |
type: string | |
profile: | |
description: 'Capture CPU profile' | |
required: false | |
default: false | |
type: boolean | |
pull_request: | |
branches: | |
- main | |
paths: | |
- .github/workflows/ebpf.yml | |
repository_dispatch: | |
types: [run-ebpf] | |
# Args: { guid, sha, ref, pr } | |
concurrency: | |
group: ebpf-${{ github.event.client_payload.pr || github.event.client_payload.sha || inputs.ref || github.event.pull_request.number || 'main' }} | |
cancel-in-progress: true | |
permissions: | |
contents: read | |
security-events: write # Required by codeql task | |
jobs: | |
# For automated identification of the workflow. | |
name: | |
name: For ${{ github.event.client_payload.guid }} | |
if: ${{ github.event_name == 'repository_dispatch' }} | |
needs: [] | |
runs-on: ubuntu-20.04 | |
steps: | |
- run: | | |
echo "guid: ${{ github.event.client_payload.guid }}" | |
echo "sha: ${{ github.event.client_payload.sha }}" | |
echo "ref: ${{ github.event.client_payload.ref }}" | |
echo "pr: ${{ github.event.client_payload.pr }}" | |
build: | |
name: Build ebpf-for-windows | |
uses: microsoft/ebpf-for-windows/.github/workflows/reusable-build.yml@main | |
with: | |
build_artifact: none | |
build_msi: true | |
build_nuget: false | |
build_options: /t:installer\ebpf-for-windows | |
repository: 'microsoft/ebpf-for-windows' | |
configurations: '["NativeOnlyRelease"]' | |
ref: ${{ github.event.client_payload.sha || github.event.client_payload.ref || inputs.ref || 'main' }} | |
perform_skip_check: false | |
build_cts_traffic: | |
name: Build cts-traffic test tool | |
uses: microsoft/ctsTraffic/.github/workflows/reusable-build.yml@master | |
with: | |
build_artifact: cts-traffic | |
repository: 'microsoft/ctsTraffic' | |
configurations: '["Release"]' | |
ref: 'master' | |
test: | |
name: Test Windows eBPF Performance | |
needs: [build, build_cts_traffic] | |
strategy: | |
fail-fast: false | |
matrix: | |
vec: [ | |
{ env: "azure", os: "2022", arch: "x64" }, | |
{ env: "azure", os: "2025", arch: "x64" }, | |
{ env: "lab", os: "2022", arch: "x64" }, | |
] | |
runs-on: | |
- self-hosted | |
- ${{ matrix.vec.env }} | |
- os-windows-${{ matrix.vec.os }} | |
- ${{ matrix.vec.arch }} | |
steps: | |
- name: Setup workspace | |
run: | | |
$process = Start-Process -FilePath "msiexec" -ArgumentList "/x {022C44B5-8969-4B75-8DB0-73F98B1BD7DC} /quiet /qn /norestart /log uninstall.log" -Wait -NoNewWindow | |
$process = Start-Process -FilePath "msiexec" -ArgumentList "/x {9363C0E3-4DE9-4067-9F5E-6A1A06034B59} /quiet /qn /norestart /log uninstall.log" -Wait -NoNewWindow | |
$url = "https://raw.githubusercontent.com/Alan-Jowett/ebpf-for-windows/0e409d1bc6880143f321bf87c497a86ce7f30b45/scripts/Cleanup-Installer.ps1" | |
iex "& { $(irm $url) }" | |
if (Test-Path ${{ github.workspace }}\bpf_performance) { Remove-Item -Recurse -Force ${{ github.workspace }}\bpf_performance } | |
if (Test-Path ${{ github.workspace }}\xdp) { Remove-Item -Recurse -Force ${{ github.workspace }}\xdp } | |
if (Test-Path ${{ github.workspace }}\cts-traffic) { Remove-Item -Recurse -Force ${{ github.workspace }}\cts-traffic } | |
if (Test-Path ${{ github.workspace }}\ETL) { Remove-Item -Recurse -Force ${{ github.workspace }}\ETL } | |
New-item -ItemType Directory -Path ${{ github.workspace }}\bpf_performance | |
New-item -ItemType Directory -Path ${{ github.workspace }}\xdp | |
New-item -ItemType Directory -Path ${{ github.workspace }}\cts-traffic | |
New-item -ItemType Directory -Path ${{ github.workspace }}\ETL | |
- name: Download ebpf-for-windows | |
uses: actions/download-artifact@eaceaf801fd36c7dee90939fad912460b18a1ffe | |
with: | |
name: "ebpf-for-windows - MSI installer (none_NativeOnlyRelease)" | |
path: ${{ github.workspace }}\bpf_performance | |
- name: Install ebpf-for-windows | |
working-directory: ${{ github.workspace }}\bpf_performance | |
run: | | |
$process = Start-Process -FilePath "msiexec" -ArgumentList "/i ebpf-for-windows.msi /quiet /qn /norestart /log install.log ADDLOCAL=ALL" -Wait -NoNewWindow -PassThru | |
if ($process.ExitCode -ne 0) { exit $process.ExitCode } | |
echo "C:\Program Files\ebpf-for-windows" | Out-File -FilePath $env:GITHUB_PATH -Encoding utf8 -Append | |
- name: Download xdp-for-windows | |
working-directory: ${{ github.workspace }}\xdp | |
run: | | |
$ProgressPreference = 'SilentlyContinue' | |
$packageUrl = "https://github.com/microsoft/xdp-for-windows/releases/download/v1.1.0%2B3b7480bf/xdp-for-windows.1.1.0.msi" | |
Invoke-WebRequest -Uri $packageUrl -OutFile xdp-for-windows.1.1.0.msi | |
dir *.msi | |
$packageUrl = "https://github.com/microsoft/xdp-for-windows/releases/download/v1.1.0%2B3b7480bf/xdp-devkit-x64-1.1.0.zip" | |
Invoke-WebRequest -Uri $packageUrl -OutFile xdp-devkit-x64-1.1.0.zip | |
dir *.zip | |
Expand-Archive -Path "xdp-devkit-x64-1.1.0.zip" -DestinationPath . | |
- name: Install xdp-for-windows | |
working-directory: ${{ github.workspace }}\xdp | |
run: | | |
$installPath = "${{ github.workspace }}\xdp" | |
Write-Output "xdp installPath: $installPath" | |
Write-Output "Installing XDP for Windows" | |
CertUtil.exe -addstore Root bin\CoreNetSignRoot.cer | |
CertUtil.exe -addstore TrustedPublisher bin\CoreNetSignRoot.cer | |
$process = Start-Process msiexec.exe -Wait -ArgumentList "/i xdp-for-windows.1.1.0.msi INSTALLFOLDER=$installPath /qn" -PassThru | |
if ($process.ExitCode -ne 0) { exit $process.ExitCode } | |
Write-Output "XDP for Windows installed" | |
sc.exe query xdp | |
reg.exe add HKLM\SYSTEM\CurrentControlSet\Services\xdp\Parameters /v XdpEbpfEnabled /d 1 /t REG_DWORD /f | |
sc.exe stop xdp | |
sc.exe start xdp | |
- name: Download bpf_performance repository artifacts | |
working-directory: ${{ github.workspace }}\bpf_performance | |
run: | | |
Invoke-WebRequest https://github.com/microsoft/bpf_performance/releases/download/v0.0.9/build-Release-windows-2022.zip -OutFile bpf_performance.zip | |
- name: Unzip bpf_performance repository artifacts | |
working-directory: ${{ github.workspace }}\bpf_performance | |
run: | | |
Expand-Archive -Path bpf_performance.zip -DestinationPath . | |
- name: Download cts-traffic | |
uses: actions/download-artifact@eaceaf801fd36c7dee90939fad912460b18a1ffe | |
with: | |
name: "cts-traffic Release" | |
path: ${{ github.workspace }}\cts-traffic | |
# Run CTS traffic without XDP installed to establish a baseline. | |
- name: Run CTS cts-traffic | |
working-directory: ${{ github.workspace }}\cts-traffic | |
# Note: The script is not in the repository, but is downloaded from the web. | |
run: | | |
dir . | |
$url = "https://raw.githubusercontent.com/microsoft/bpf_performance/main/scripts/two-machine-perf.ps1" | |
iex "& { $(irm $url) }" | |
# The resulting CSV file's header is updated to match the format produced by the BPF performance tests. | |
# The "Average Duration (ns)" column is the metric of interest. | |
- name: Fixup cts traffic results | |
working-directory: ${{ github.workspace }}\cts-traffic | |
run: | | |
$content = Get-Content ctsTrafficResults.csv | |
$content[0] = "Timestamp,Test,Average Duration (ns)" | |
$content | Set-Content ctsTrafficResults.csv | |
- name: Upload CTS cts-traffic results | |
if: always() | |
uses: actions/upload-artifact@v2 | |
with: | |
name: cts_traffic_baseline_${{ matrix.vec.env }}_${{ matrix.vec.os }}_${{ matrix.vec.arch }} | |
path: ${{ github.workspace }}\cts-traffic\ctsTrafficResults.csv | |
- name: Start XDP tracing | |
run: | | |
Invoke-WebRequest -Uri "https://raw.githubusercontent.com/microsoft/xdp-for-windows/main/tools/xdptrace.wprp" -OutFile xdptrace.wprp | |
wpr.exe -start xdptrace.wprp -filemode | |
- name: Attach xdp baseline program to interface (first program in xdp.sys) | |
working-directory: ${{ github.workspace }}\bpf_performance | |
run: | | |
Test-Connection -ComputerName netperf-peer -Count 1 -Ping | |
$remote_address = [System.Net.Dns]::GetHostAddresses("netperf-peer")[0] | |
Write-Output "Remote address: $remote_address" | |
$route = Find-NetRoute -RemoteIPAddress $remote_address | |
Write-Output "Route: $route" | |
$if_index = $route[0].InterfaceIndex | |
Write-Output "Interface index: $if_index" | |
Get-NetAdapter -ifIndex $if_index | |
netsh ebpf add prog filenam=xdp.sys interface=$if_index | |
bpftool prog show | |
Test-Connection -ComputerName netperf-peer -Count 1 -Ping | |
- name: Stop XDP tracing | |
if: always() | |
run: | | |
wpr.exe -stop xdptrace.etl | |
- name: Upload xdp trace | |
if: always() | |
uses: actions/upload-artifact@v2 | |
with: | |
name: xdp_trace_${{ matrix.vec.env }}_${{ matrix.vec.os }}_${{ matrix.vec.arch }} | |
path: xdptrace.etl | |
# Run CTS traffic with XDP installed to measure the impact of XDP on performance. | |
- name: Run CTS cts-traffic | |
working-directory: ${{ github.workspace }}\cts-traffic | |
# Note: The script is not in the repository, but is downloaded from the web. | |
run: | | |
dir . | |
$url = "https://raw.githubusercontent.com/microsoft/bpf_performance/main/scripts/two-machine-perf.ps1" | |
iex "& { $(irm $url) }" | |
- name: Detach xdp baseline program from interface | |
run: | | |
$programs = (bpftool prog show) | |
Write-Output "Programs: $programs" | |
if ($programs.length -gt 0) { netsh ebpf del prog ($programs.split(':')[0]) } | |
# The resulting CSV file's header is updated to match the format produced by the BPF performance tests. | |
# The "Average Duration (ns)" column is the metric of interest. | |
- name: Fixup cts traffic results | |
working-directory: ${{ github.workspace }}\cts-traffic | |
run: | | |
$content = Get-Content ctsTrafficResults.csv | |
$content[0] = "Timestamp,Test,Average Duration (ns)" | |
$content | Set-Content ctsTrafficResults.csv | |
- name: Upload CTS cts-traffic results | |
if: always() | |
uses: actions/upload-artifact@v2 | |
with: | |
name: cts_traffic_xdp_${{ matrix.vec.env }}_${{ matrix.vec.os }}_${{ matrix.vec.arch }} | |
path: ${{ github.workspace }}\cts-traffic\ctsTrafficResults.csv | |
- name: Run BPF performance tests | |
working-directory: ${{ github.workspace }}\bpf_performance | |
run: | | |
if ("${{inputs.profile}}" -eq "true") { | |
$pre_command = 'wpr.exe -start CPU' | |
$post_command = 'wpr.exe -stop ""${{ github.workspace }}\ETL\%NAME%.etl""' | |
Release\bpf_performance_runner.exe -i tests.yml -e .sys -r -p 4 --pre "$pre_command" --post "$post_command" | Tee-Object -FilePath result.csv | |
} | |
else { | |
Release\bpf_performance_runner.exe -i tests.yml -e .sys -r -p 4 | Tee-Object -FilePath result.csv | |
} | |
Get-Content result.csv | Where-Object { $_ -notmatch "^Program returned non-zero" } | Set-Content bpf_performance_native.csv | |
- name: Upload BPF performance test results | |
if: always() | |
uses: actions/upload-artifact@v2 | |
with: | |
name: bpf_performance_native_${{ matrix.vec.env }}_${{ matrix.vec.os }}_${{ matrix.vec.arch }} | |
path: ${{ github.workspace }}\bpf_performance\bpf_performance_native.csv | |
- name: Upload CPU profile | |
if: ${{ inputs.profile == true }} | |
uses: actions/upload-artifact@v2 | |
with: | |
name: CPU_Profile_${{ matrix.vec.env }}_${{ matrix.vec.os }}_${{ matrix.vec.arch }} | |
path: ETL | |
- name: Cleanup workspace | |
if: always() | |
run: | | |
$process = Start-Process -FilePath "msiexec" -ArgumentList "/x {022C44B5-8969-4B75-8DB0-73F98B1BD7DC} /quiet /qn /norestart /log uninstall.log" -Wait -NoNewWindow | |
$process = Start-Process -FilePath "msiexec" -ArgumentList "/x {9363C0E3-4DE9-4067-9F5E-6A1A06034B59} /quiet /qn /norestart /log uninstall.log" -Wait -NoNewWindow | |
if (Test-Path ${{ github.workspace }}\bpf_performance) { Remove-Item -Recurse -Force ${{ github.workspace }}\bpf_performance } | |
if (Test-Path ${{ github.workspace }}\xdp) { Remove-Item -Recurse -Force ${{ github.workspace }}\xdp } | |
if (Test-Path ${{ github.workspace }}\cts-traffic) { Remove-Item -Recurse -Force ${{ github.workspace }}\cts-traffic } | |
if (Test-Path ${{ github.workspace }}\ETL) { Remove-Item -Recurse -Force ${{ github.workspace }}\ETL } |