2024-01-12 01:01:40 +03:00
<#
NOTE :
This script assumes the latest MsQuic commit is built and downloaded as artifacts in the current session .
. PARAMETER LogProfile
Configures the logging scope for the test . None by default .
. PARAMETER MsQuicCommit
The MsQuic commit to use for the test . Defaults to " manual " which means the latest commit built and downloaded as artifacts in the current session .
. PARAMETER plat
The platform ( linux or windows ) this test is running on .
. PARAMETER os
The full OS name and version being tested ( i . e . , ubuntu - 20.04 ) .
. PARAMETER arch
The architecture being tested ( i . e . , x64 ) .
. PARAMETER tls
The TLS library being used ( openssl or schannel ) . Not all libraries are supported on all platforms .
2024-01-19 22:09:04 +03:00
. PARAMETER io
The network IO interface to be used ( not all are supported on all platforms ) .
2024-01-25 17:44:57 +03:00
. PARAMETER filter
Run only the tests whose arguments match one of the positive patterns but
none of the negative patterns ( prefixed by '-' ) . '?' matches any single
character ; '*' matches any substring ; ';' separates two patterns .
2024-01-12 01:01:40 +03:00
#>
# Import the helper module.
Using module . \ secnetperf-helpers . psm1
param (
[ ValidateSet ( " " , " NULL " , " Basic.Light " , " Datapath.Light " , " Datapath.Verbose " , " Stacks.Light " , " Stacks.Verbose " , " RPS.Light " , " RPS.Verbose " , " Performance.Light " , " Basic.Verbose " , " Performance.Light " , " Performance.Verbose " , " Full.Light " , " Full.Verbose " , " SpinQuic.Light " , " SpinQuicWarnings.Light " ) ]
[ string ] $LogProfile = " " ,
[ Parameter ( Mandatory = $true ) ]
[ string ] $MsQuicCommit = " manual " ,
[ Parameter ( Mandatory = $true ) ]
[ ValidateSet ( " windows " , " linux " ) ]
[ string ] $plat = " windows " ,
[ Parameter ( Mandatory = $true ) ]
[ string ] $os = " windows-2022 " ,
[ Parameter ( Mandatory = $true ) ]
[ ValidateSet ( " x64 " , " arm64 " ) ]
[ string ] $arch = " x64 " ,
[ Parameter ( Mandatory = $true ) ]
[ ValidateSet ( " openssl " , " openssl3 " , " schannel " ) ]
[ string ] $tls = " schannel " ,
2024-01-19 22:09:04 +03:00
[ Parameter ( Mandatory = $false ) ]
[ ValidateSet ( " " , " iocp " , " rio " , " xdp " , " qtip " , " wsk " , " epoll " , " kqueue " ) ]
[ string ] $io = " " ,
2024-01-25 17:44:57 +03:00
[ Parameter ( Mandatory = $false ) ]
[ string ] $filter = " " ,
2024-01-12 01:01:40 +03:00
[ Parameter ( Mandatory = $false ) ]
[ string ] $RemoteName = " netperf-peer "
)
2024-01-24 02:11:17 +03:00
Set-StrictMode -Version " Latest "
$PSDefaultParameterValues [ " *:ErrorAction " ] = " Stop "
2024-01-16 18:09:22 +03:00
2024-01-12 01:01:40 +03:00
# Set up some important paths.
$RemoteDir = " C:/_work/quic "
if ( ! $isWindows ) {
$RemoteDir = " /home/secnetperf/_work/quic "
}
$SecNetPerfDir = " artifacts/bin/ $plat / $( $arch ) _Release_ $tls "
$SecNetPerfPath = " $SecNetPerfDir /secnetperf "
2024-01-19 22:09:04 +03:00
if ( $io -eq " " ) {
if ( $isWindows ) {
$io = " iocp "
} else {
$io = " epoll "
}
}
2024-01-30 22:39:06 +03:00
if ( $isWindows -and ( $LogProfile -eq " " -or $LogProfile -eq " NULL " ) ) {
# Always collect basic, low volume logs on Windows.
$LogProfile = " Basic.Light "
}
2024-01-12 01:01:40 +03:00
# Set up the connection to the peer over remote powershell.
2024-01-19 22:09:04 +03:00
Write-Host " Connecting to $RemoteName "
2024-01-12 01:01:40 +03:00
if ( $isWindows ) {
$Session = New-PSSession -ComputerName $RemoteName -ConfigurationName PowerShell . 7
} else {
$Session = New-PSSession -HostName $RemoteName -UserName secnetperf -SSHTransport
}
if ( $null -eq $Session ) {
Write-GHError " Failed to create remote session "
exit 1
}
# Make sure nothing is running from a previous run.
2024-01-22 21:49:16 +03:00
Cleanup-State $Session $RemoteDir
if ( $io -eq " wsk " ) {
# WSK also needs the kernel mode binaries in the usermode path.
Write-Host " Moving kernel binaries to usermode path "
$KernelDir = " artifacts/bin/winkernel/ $( $arch ) _Release_ $tls "
Copy-Item " $KernelDir /secnetperfdrvpriv.sys " $SecNetPerfDir
Copy-Item " $KernelDir /secnetperfdrvpriv.pdb " $SecNetPerfDir
Copy-Item " $KernelDir /msquicpriv.sys " $SecNetPerfDir
Copy-Item " $KernelDir /msquicpriv.pdb " $SecNetPerfDir
# Remove all the other kernel binaries since we don't need them any more.
Remove-Item -Force -Recurse $KernelDir | Out-Null
2024-01-12 01:01:40 +03:00
}
# Copy the artifacts to the peer.
2024-01-19 22:09:04 +03:00
Write-Host " Copying files to peer "
2024-01-12 01:01:40 +03:00
Invoke-Command -Session $Session -ScriptBlock {
2024-01-23 18:16:56 +03:00
if ( Test-Path $Using : RemoteDir ) {
Remove-Item -Force -Recurse $Using : RemoteDir | Out-Null
}
2024-01-30 22:39:06 +03:00
New-Item -ItemType Directory -Path $Using : RemoteDir -Force | Out-Null
2024-01-12 01:01:40 +03:00
}
Copy-Item -ToSession $Session . / artifacts -Destination " $RemoteDir /artifacts " -Recurse
Copy-Item -ToSession $Session . / scripts -Destination " $RemoteDir /scripts " -Recurse
Copy-Item -ToSession $Session . / src / manifest / MsQuic . wprp -Destination " $RemoteDir /scripts "
2024-01-16 18:09:22 +03:00
$SQL = @"
INSERT OR IGNORE INTO Secnetperf_builds ( Secnetperf_Commit , Build_date_time , TLS_enabled , Advanced_build_config )
2024-01-24 02:11:17 +03:00
VALUES ( " $MsQuicCommit " , " $( Get-Date -Format " yyyy-MM-dd HH:mm:ss " ) " , 1 , " TODO " ) ;
2024-01-16 18:09:22 +03:00
" @
$json = @ { }
2024-02-05 20:29:33 +03:00
$json [ " commit " ] = " $MsQuicCommit "
2024-01-24 02:11:17 +03:00
$allTests = [ System.Collections.Specialized.OrderedDictionary ] :: new ( )
# > All tests:
2024-01-24 22:24:19 +03:00
$allTests [ " tput-up " ] = " -exec:maxtput -up:12s -ptput:1 "
$allTests [ " tput-down " ] = " -exec:maxtput -down:12s -ptput:1 "
$allTests [ " hps-conns-100 " ] = " -exec:maxtput -rconn:1 -share:1 -conns:100 -run:12s -prate:1 "
$allTests [ " rps-up-512-down-4000 " ] = " -exec:lowlat -rstream:1 -up:512 -down:4000 -run:20s -plat:1 "
2024-01-24 02:11:17 +03:00
2024-01-16 18:09:22 +03:00
$env = $isWindows ? 1 : 2
$hasFailures = $false
2024-01-12 01:01:40 +03:00
try {
mkdir . / artifacts / logs | Out-Null
# Prepare the machines for the testing.
2024-01-22 21:49:16 +03:00
if ( $isWindows ) {
2024-01-19 22:09:04 +03:00
Write-Host " Preparing local machine for testing "
2024-01-22 21:49:16 +03:00
. / scripts / prepare-machine . ps1 -ForTest -InstallSigningCertificates
2024-01-12 01:01:40 +03:00
2024-01-19 22:09:04 +03:00
Write-Host " Preparing peer machine for testing "
2024-01-12 01:01:40 +03:00
Invoke-Command -Session $Session -ScriptBlock {
2024-01-22 21:49:16 +03:00
& " $Using :RemoteDir/scripts/prepare-machine.ps1 " -ForTest -InstallSigningCertificates
2024-01-12 01:01:40 +03:00
}
2024-01-19 22:09:04 +03:00
$HasTestSigning = $false
try { $HasTestSigning = ( " $( bcdedit ) " | Select-String -Pattern " testsigning\s+Yes " ) . Matches . Success } catch { }
if ( ! $HasTestSigning ) { Write-Host " Test Signing Not Enabled! " }
2024-01-12 01:01:40 +03:00
}
2024-01-16 18:09:22 +03:00
# Configure the dump collection.
Configure-DumpCollection $Session
2024-01-22 21:49:16 +03:00
# Install any dependent drivers.
if ( $io -eq " xdp " ) { Install-XDP $Session $RemoteDir }
if ( $io -eq " wsk " ) { Install-Kernel $Session $RemoteDir $SecNetPerfDir }
2024-01-19 22:09:04 +03:00
2024-01-12 01:01:40 +03:00
if ( ! $isWindows ) {
# Make sure the secnetperf binary is executable.
2024-01-19 22:09:04 +03:00
Write-Host " Updating secnetperf permissions "
2024-01-12 01:01:40 +03:00
Invoke-Command -Session $Session -ScriptBlock {
$env:LD_LIBRARY_PATH = " ${env:LD_LIBRARY_PATH} : $Using :RemoteDir/ $Using :SecNetPerfDir "
chmod + x " $Using :RemoteDir/ $Using :SecNetPerfPath "
}
2024-01-19 22:09:04 +03:00
$fullPath = Repo-Path $SecNetPerfDir
2024-01-18 23:32:54 +03:00
$env:LD_LIBRARY_PATH = " ${env:LD_LIBRARY_PATH} : $fullPath "
2024-01-12 01:01:40 +03:00
chmod + x " ./ $SecNetPerfPath "
2024-01-18 23:32:54 +03:00
if ( ( Get-Content " /etc/security/limits.conf " ) -notcontains " root soft core unlimited " ) {
# Enable core dumps for the system.
2024-01-19 22:09:04 +03:00
Write-Host " Setting core dump size limit "
2024-01-24 02:11:17 +03:00
sudo sh -c " echo " root soft core unlimited " >> /etc/security/limits.conf "
sudo sh -c " echo " root hard core unlimited " >> /etc/security/limits.conf "
sudo sh -c " echo " * soft core unlimited " >> /etc/security/limits.conf "
sudo sh -c " echo " * hard core unlimited " >> /etc/security/limits.conf "
2024-01-18 23:32:54 +03:00
}
# Set the core dump pattern.
2024-01-19 22:09:04 +03:00
Write-Host " Setting core dump pattern "
2024-01-24 23:21:09 +03:00
sudo sh -c " echo -n " % e . client . % p . % t . core " > /proc/sys/kernel/core_pattern "
2024-01-12 01:01:40 +03:00
}
2024-01-16 18:09:22 +03:00
# Run all the test cases.
2024-01-19 22:09:04 +03:00
Write-Host " Setup complete! Running all tests "
2024-01-24 02:11:17 +03:00
foreach ( $testId in $allTests . Keys ) {
$ExeArgs = $allTests [ $testId ] + " -io: $io "
2024-01-25 17:44:57 +03:00
$Output = Invoke-Secnetperf $Session $RemoteName $RemoteDir $SecNetPerfPath $LogProfile $testId $ExeArgs $io $filter
2024-01-16 18:09:22 +03:00
$Test = $Output [ -1 ]
if ( $Test . HasFailures ) { $hasFailures = $true }
# Process the results and add them to the SQL and JSON.
$SQL + = @"
2024-01-24 02:11:17 +03:00
` nINSERT OR IGNORE INTO Secnetperf_tests ( Secnetperf_test_ID , Kernel_mode , Run_arguments ) VALUES ( " $TestId -tcp-0 " , 0 , " $ExeArgs -tcp:0 " ) ;
2024-01-24 05:29:14 +03:00
INSERT OR IGNORE INTO Secnetperf_tests ( Secnetperf_test_ID , Kernel_mode , Run_arguments ) VALUES ( " $TestId -tcp-1 " , 0 , " $ExeArgs -tcp:1 " ) ;
2024-01-12 01:01:40 +03:00
" @
2024-01-16 18:09:22 +03:00
for ( $tcp = 0 ; $tcp -lt $Test . Values . Length ; $tcp + + ) {
2024-01-19 22:09:04 +03:00
if ( $Test . Values [ $tcp ] . Length -eq 0 ) { continue }
2024-01-16 18:09:22 +03:00
$transport = $tcp -eq 1 ? " tcp " : " quic "
2024-01-24 23:21:09 +03:00
$json [ " $testId - $transport " ] = $Test . Values [ $tcp ]
2024-02-05 20:29:33 +03:00
if ( $Test . Metric -eq " throughput " -or $Test . Metric -eq " hps " ) {
2024-01-17 05:49:55 +03:00
foreach ( $item in $Test . Values [ $tcp ] ) {
2024-01-16 18:09:22 +03:00
$SQL + = @"
2024-01-24 02:11:17 +03:00
` nINSERT INTO Secnetperf_test_runs ( Secnetperf_test_ID , Secnetperf_commit , Client_environment_ID , Server_environment_ID , Result , Secnetperf_latency_stats_ID , io , tls )
VALUES ( " $TestId -tcp- $tcp " , " $MsQuicCommit " , $env , $env , $item , NULL , " $io " , " $tls " ) ;
" @
}
2024-01-24 23:21:09 +03:00
} elseif ( $Test . Metric -eq " latency " ) {
2024-01-24 02:11:17 +03:00
# Test.Values[...] is a flattened 1D array of the form: [ first run + RPS, second run + RPS, third run + RPS..... ], ie. if each run has 8 values + RPS, then the array has 27 elements (8*3 + 3)
for ( $offset = 0 ; $offset -lt $Test . Values [ $tcp ] . Length ; $offset + = 9 ) {
$SQL + = @"
` nINSERT INTO Secnetperf_latency_stats ( p0 , p50 , p90 , p99 , p999 , p9999 , p99999 , p999999 )
VALUES ( $ ( $Test . Values [ $tcp ] [ $offset ] ) , $ ( $Test . Values [ $tcp ] [ $offset + 1 ] ) , $ ( $Test . Values [ $tcp ] [ $offset + 2 ] ) , $ ( $Test . Values [ $tcp ] [ $offset + 3 ] ) , $ ( $Test . Values [ $tcp ] [ $offset + 4 ] ) , $ ( $Test . Values [ $tcp ] [ $offset + 5 ] ) , $ ( $Test . Values [ $tcp ] [ $offset + 6 ] ) , $ ( $Test . Values [ $tcp ] [ $offset + 7 ] ) ) ;
INSERT INTO Secnetperf_test_runs ( Secnetperf_test_ID , Secnetperf_commit , Client_environment_ID , Server_environment_ID , Result , Secnetperf_latency_stats_ID , io , tls )
VALUES ( " $TestId -tcp- $tcp " , " $MsQuicCommit " , $env , $env , $ ( $Test . Values [ $tcp ] [ $offset + 8 ] ) , LAST_INSERT_ROWID ( ) , " $io " , " $tls " ) ;
2024-01-16 18:09:22 +03:00
" @
}
}
}
}
2024-01-12 01:01:40 +03:00
2024-01-16 18:09:22 +03:00
Write-Host " Tests complete! "
2024-01-12 01:01:40 +03:00
} catch {
2024-01-16 18:09:22 +03:00
Write-GHError " Exception while running tests! "
2024-01-12 01:01:40 +03:00
Write-GHError $_
2024-01-16 18:09:22 +03:00
Get-Error
$_ | Format-List *
$hasFailures = $true
2024-01-12 01:01:40 +03:00
} finally {
2024-01-19 22:09:04 +03:00
2024-01-22 21:49:16 +03:00
# Perform any necessary cleanup.
try { Cleanup-State $Session $RemoteDir } catch { }
try {
if ( Get-ChildItem -Path . / artifacts / logs -File -Recurse ) {
# Logs or dumps were generated. Copy the necessary symbols/files to
# the same direcotry be able to open them.
Write-Host " Copying debugging files to logs directory "
if ( $isWindows ) {
Copy-Item " $SecNetPerfDir /*.pdb " . / artifacts / logs
} else {
Copy-Item " $SecNetPerfDir /libmsquic.so " . / artifacts / logs
Copy-Item " $SecNetPerfDir /secnetperf " . / artifacts / logs
}
}
} catch { }
2024-01-19 22:09:04 +03:00
2024-01-16 18:09:22 +03:00
# Save the test results (sql and json).
2024-01-19 22:09:04 +03:00
Write-Host " ` Writing test-results- $plat - $os - $arch - $tls - $io .sql "
$SQL | Set-Content -Path " test-results- $plat - $os - $arch - $tls - $io .sql "
Write-Host " ` Writing json-test-results- $plat - $os - $arch - $tls - $io .json "
$json | ConvertTo-Json | Set-Content -Path " json-test-results- $plat - $os - $arch - $tls - $io .json "
2024-01-12 01:01:40 +03:00
}
2024-01-23 18:16:56 +03:00
# Clear out any exit codes from previous commands.
$global:LastExitCode = 0
2024-01-16 18:09:22 +03:00
if ( $hasFailures ) {
2024-01-12 01:01:40 +03:00
exit 1
}