sftp benchmark github action

pull/784/head
JacobBarthelmeh 2025-02-24 14:13:00 -07:00
parent 2d43d89e66
commit 5873f9f1b8
3 changed files with 102 additions and 37 deletions

View File

@ -6,6 +6,12 @@ on:
pull_request:
branches: [ '*' ]
# give permissions to write a comment on the pull request
permissions:
pull-requests: write
actions: read
contents: read
concurrency:
group: ${{ github.workflow }}-${{ github.ref }}
cancel-in-progress: true
@ -43,13 +49,12 @@ jobs:
build_wolfssh:
needs:
- build_wolfssl
- create_matrix
strategy:
fail-fast: false
matrix:
os: [ ubuntu-latest ]
wolfssl: ${{ fromJson(needs.create_matrix.outputs['versions']) }}
name: Build and test wolfsshd
wolfssl: [ master ]
name: Collect SFTP performance
runs-on: ${{ matrix.os }}
timeout-minutes: 10
steps:
@ -71,53 +76,109 @@ jobs:
- name: configure
working-directory: ./wolfssh/
run : |
./configure --enable-all LDFLAGS="-L${{ github.workspace }}/build-dir/lib" CPPFLAGS="-I${{ github.workspace }}/build-dir/include -DWOLFSSH_NO_FPKI -DWOLFSSH_NO_SFTP_TIMEOUT -DWOLFSSH_MAX_SFTP_RW=4000000 -DMAX_PATH_SZ=120"
./configure --enable-all LDFLAGS="-L${{ github.workspace }}/build-dir/lib" CPPFLAGS="-I${{ github.workspace }}/build-dir/include -DWOLFSSH_NO_FPKI -DWOLFSSH_NO_SFTP_TIMEOUT -DWOLFSSH_MAX_SFTP_RW=4000000 -DMAX_PATH_SZ=120 -DEXAMPLE_SFTP_BENCHMARK"
- name: make
working-directory: ./wolfssh/
run: make
- name: Get Saved OpenSSH Upload Results
uses: actions/downlad-artifact@v4
id: cache-upload
uses: actions/cache@v4
with:
path: ./wolfssh/
artifact_id: 'openssh-upload'
path: wolfssh/openssh-average-download.csv
key: openssh-average-download.csv
fail-on-cache-miss: false
- name: Get Saved OpenSSH Download Results
id: cache-download
uses: actions/cache@v4
with:
path: wolfssh/openssh-average-upload.csv
key: openssh-averavge-upload.csv
fail-on-cache-miss: false
- name: Put test key in authorized keys file
- name: Install gnuplot
run: sudo apt-get install gnuplot
- name: Setup OpenSSH Test Server
working-directory: ./wolfssh/
run: |
touch ~/.ssh/authorized_keys_test
cat ./keys/hansel-*.pub > authorized_keys_test
sudo apt-get install openssh-server
mkdir ~/.ssh
chmod 700 ~/.ssh
echo "AuthorizedKeysFile $PWD/keys/hansel-key-ecc.pub" >> sshd-config-test.txt
echo "PubkeyAuthentication yes" >> sshd-config-test.txt
echo "Subsystem sftp internal-sftp" >> sshd-config-test.txt
echo "KbdInteractiveAuthentication no" >> sshd-config-test.txt
sed -i.bak "s/hansel/$USER/" ./keys/hansel-key-ecc.pub
chmod 600 ./keys/hansel-key-*.pem
sudo systemctl restart sshd
sudo service sshd restart
chmod 600 ./keys/hansel-key-*.pub
sudo mkdir -p /run/sshd
sudo chmod 755 /run/sshd
sudo /usr/sbin/sshd -p 22222 -f sshd-config-test.txt -E $PWD/sshd-log.txt
cat sshd-config-test.txt
ps -e | grep sshd
- name: Run SFTP client benchmark
working-directory: ./wolfssh/
timeout-minutes: 5
run: |
./scripts/get-sftp-benchmark.sh
./scripts/get-sftp-benchmark.sh 22222
- name: Store Upload Speed PNG
uses: actions/upload-artifact@v4
with:
name: upload-results.png
name: upload-results-pr${{ github.event.pull_request.number }}.png
path: wolfssh/upload-results.png
retention-days: 2
- name: Store Download Speed PNG
uses: actions/upload-artifact@v4
with:
name: download-results.png
name: download-results-pr${{ github.event.pull_request.number }}.png
path: wolfssh/download-results.png
retention-days: 2
- name: Comment on PR about performance
env:
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
- name: Upload OpenSSH Download Results
if: steps.cache-download.outputs.cache-hit != 'true'
uses: actions/cache@v4
with:
path: wolfssh/openssh-average-download.csv
key: openssh-average-download.csv
- name: Upload OpenSSH Upload Results
if: steps.cache-upload.outputs.cache-hit != 'true'
uses: actions/cache@v4
with:
path: wolfssh/openssh-average-upload.csv
key: openssh-average-upload.csv
# Currently the comment in PR does not work correctly
# - name: Comment on PR about performance
# env:
# GITHUB_URL: ${{ github.event.pull_request.comments_url }}
# GH_TOKEN: ${{ github.token }}
# PR_NUMBER: ${{ github.event.pull_request.number }}
# RUN_ID: ${{ github.run_id }}
# run: |
# # Get both artifact IDs
# DOWNLOAD_ARTIFACT=$(gh api repos/${{ github.repository }}/actions/artifacts \
# --jq '.artifacts[] | select(.name | contains("download-results-pr")) | .id')
# UPLOAD_ARTIFACT=$(gh api repos/${{ github.repository }}/actions/artifacts \
# --jq '.artifacts[] | select(.name | contains("upload-results-pr")) | .id')
#
# # Create the comment with direct link to download
# curl -X POST \
# $GITHUB_URL \
# -H "Content-Type: application/json" \
# -H "Authorization: token $GH_TOKEN" \
# -d "{\"body\":\"Performance test results:\n\n- [Download Results](https://github.com/${{ github.repository }}/actions/runs/$RUN_ID/artifacts/$DOWNLOAD_ARTIFACT)\n- [Upload Results](https://github.com/${{ github.repository }}/actions/runs/$RUN_ID/artifacts/$UPLOAD_ARTIFACT)\"}"
- name: Print logs if failed
working-directory: ./wolfssh/
if: failure()
run: |
PR_NUMBER=$(jq --raw-output .pull_request.number "$GITHUB_EVENT_PATH")
gh pr comment $PR_NUMBER --body "Attached is the performance results" \
--attach download-results.png \
--attach upload-results.png
sudo cat sshd-log.txt
cat log.csv
artifacts:
'openssh-upload': { 'path': 'wolfssh/openssh-average-upload.csv' }
'openssh-download': { 'path': 'wolfssh/openssh-average-download.csv' }

View File

@ -132,8 +132,6 @@ static void err_msg(const char* s)
#else
#include <sys/time.h>
double current_time_ms(int);
/* return number of seconds*/
word32 current_time(int reset)
{
@ -145,6 +143,9 @@ static void err_msg(const char* s)
return (word32)tv.tv_sec;
}
#ifdef EXAMPLE_SFTP_BENCHMARK
double current_time_ms(int);
/* return number of micro seconds */
double current_time_ms(int reset)
{
@ -155,7 +156,7 @@ static void err_msg(const char* s)
gettimeofday(&tv, 0);
return (word64)(tv.tv_sec*1000000) + tv.tv_usec;
}
#endif
#endif /* USE_WINDOWS_API */
#endif /* !WOLFSSH_NO_TIMESTAMP */
@ -1120,7 +1121,8 @@ static int doAutopilot(int cmd, char* local, char* remote)
char fullpath[128] = ".";
WS_SFTPNAME* name = NULL;
byte remoteAbsPath = 0;
#if !defined(WOLFSSH_NO_TIMESTAMP) && !defined(USE_WINDOWS_API)
#if !defined(WOLFSSH_NO_TIMESTAMP) && !defined(USE_WINDOWS_API) &&\
defined(EXAMPLE_SFTP_BENCHMARK)
double currentTime;
double longBytes = 0;
FILE* f;
@ -1157,7 +1159,8 @@ static int doAutopilot(int cmd, char* local, char* remote)
remote);
}
#if !defined(WOLFSSH_NO_TIMESTAMP) && !defined(USE_WINDOWS_API)
#if !defined(WOLFSSH_NO_TIMESTAMP) && !defined(USE_WINDOWS_API) &&\
defined(EXAMPLE_SFTP_BENCHMARK)
ret = WFOPEN(NULL, &f, fullpath, "rb");
if (ret != 0 || f == WBADFILE) return WS_BAD_FILE_E;
if (WFSEEK(NULL, f, 0, WSEEK_END) != 0) {
@ -1190,7 +1193,8 @@ static int doAutopilot(int cmd, char* local, char* remote)
fullpath, local);
}
}
#if !defined(WOLFSSH_NO_TIMESTAMP) && !defined(USE_WINDOWS_API)
#if !defined(WOLFSSH_NO_TIMESTAMP) && !defined(USE_WINDOWS_API) &&\
defined(EXAMPLE_SFTP_BENCHMARK)
else {
currentTime = current_time_ms(0) - currentTime;
double result;

View File

@ -1,7 +1,7 @@
#!/bin/bash
KEY="keys/hansel-key-ecc.pem"
TEST_FILE="/home/jak/Documents/wolfssh-fork/test"
KEY="$PWD/keys/hansel-key-ecc.pem"
TEST_FILE="$PWD/test"
FILE_SIZES=("5000" "10000" "50000" "100000" "150000" "200000" "250000" "300000" "350000" "400000" "500000" "1000000")
TRANSFER_MBS=""
NUMBER_RUNS=10
@ -19,7 +19,7 @@ fi
do_openssh_put_test() {
cp $TEST_FILE $TEST_FILE-out
sftp_command="sftp -P$PORT -i $KEY jak@127.0.0.1"
sftp_command="sftp -P$PORT -o \"StrictHostKeyChecking no\" -i $KEY $USER@127.0.0.1"
output_file="sftp_log.txt"
# Start the script command to capture the sftp session
@ -37,7 +37,7 @@ EOF" /dev/null 2>&1 | tee $output_file | while read line; do
do_openssh_get_test() {
cp $TEST_FILE $TEST_FILE-out
sftp_command="sftp -P $PORT -i $KEY jak@127.0.0.1"
sftp_command="sftp -P $PORT -o \"StrictHostKeyChecking no\" -i $KEY $USER@127.0.0.1"
output_file="sftp_log.txt"
# Start the script command to capture the sftp session
@ -55,14 +55,14 @@ EOF" /dev/null 2>&1 | tee $output_file | while read line; do
do_wolfssh_put_test() {
cp $TEST_FILE $TEST_FILE-out
RESULT=$(./examples/sftpclient/wolfsftp -g -l $TEST_FILE -r $TEST_FILE-out -i $PWD/keys/hansel-key-ecc.der -j $PWD/keys/hansel-key-ecc.pub -u jak -p $PORT)
RESULT=$(./examples/sftpclient/wolfsftp -g -l $TEST_FILE -r $TEST_FILE-out -i $PWD/keys/hansel-key-ecc.der -j $PWD/keys/hansel-key-ecc.pub -u $USER -p $PORT)
TRANSFER_MBS="$(echo "$RESULT" | awk '{print $(NF-0)}' | sed 's/MB\/s//')"
printf " $TRANSFER_MBS" >> $LOG_FILE
}
do_wolfssh_get_test() {
cp $TEST_FILE $TEST_FILE-out
RESULT=$(./examples/sftpclient/wolfsftp -G -l $TEST_FILE-out -r $TEST_FILE -i $PWD/keys/hansel-key-ecc.der -j $PWD/keys/hansel-key-ecc.pub -u jak -p $PORT)
RESULT=$(./examples/sftpclient/wolfsftp -G -l $TEST_FILE-out -r $TEST_FILE -i $PWD/keys/hansel-key-ecc.der -j $PWD/keys/hansel-key-ecc.pub -u $USER -p $PORT)
TRANSFER_MBS="$(echo "$RESULT" | awk '{print $(NF-0)}' | sed 's/MB\/s//')"
printf " $TRANSFER_MBS" >> $LOG_FILE
}