Skip to content

Conversation

@Sashan
Copy link
Contributor

@Sashan Sashan commented Nov 5, 2025

This enables as to evaluate performance of OpenSSL QUIC stack against other QUIC implementations.

@Sashan Sashan moved this to Waiting Review in Development Board Nov 5, 2025
@Sashan
Copy link
Contributor Author

Sashan commented Nov 5, 2025

those changes were tested with tqclient/tqserver:

# git clone --recurse https://github.com/Tencent/tquic
# cd tquic
# cargo build --all # to build also tools/examples
# echo $?

if build is successful tqserver can be launched:

# cd target/debug/
# ./tquic_server -l 127.0.0.1:7070 -c path/to/servercert.pem -k path/to/serverkey.pem
# echo 'payload' > payload

Feel free to use servercert.pem and serverkey.pem found in $OPENSSL_SRCDIR/test/certs.
Command above starts QUIC server listening to port 7070. Use command here to connect:

# cd $PERFTOOLS./source/build
# ./ssl_poll_perf -m c -a 0 -c 100 -b 1 -u 0 http://127.0.0.1:7070/payload

command above launches client which performs 100 connections to tquic_server. Each connection
opens single bi-directional stream and fetches file payload.

to run tquic_client against ssl_poll_perf server, launch server first:

# cd $PERFTOOLS./source/build
# ./ssl_poll_perf -p 8080  -m s -a 0 path/to/servercert.pem path/to/serverkey.pem

To download 7 bytes from server above use URL http://127.0.0.1:8080/7 using
tquic_client command below:

./tquic_client \
    -t 1 \ # use one thread
    --max-concurrent-conns 100 \ # 100 concurrent connections
    --max-concurrent-requests 100 \ # 100 concurrent requests
    --max-requests-per-conn 1 \ # one request per connection
    --total-requests-per-thread 100 \ # 100 requests
    -d 0 # wait until all requests are completed
    -a http/0.9 # use http/0.9
    http://127.0.0.1:8080/7

@Sashan Sashan requested review from nhorman and quarckster and removed request for quarckster November 5, 2025 12:20
@quarckster
Copy link
Contributor

I'm wondering how to better run this in our performance benchmark lab. Is it enough to run both server and client on the same machine? Or the client and the server must be resided on separate hosts. In that case does it matter the platform of the counterpart? It will also bring questions of the simultaneous access to the counterpart from different testing machines. How will it affect on the results?

Copy link
Contributor

@jogme jogme left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

First iteration

@t8m
Copy link
Member

t8m commented Nov 6, 2025

I'm wondering how to better run this in our performance benchmark lab. Is it enough to run both server and client on the same machine? Or the client and the server must be resided on separate hosts. In that case does it matter the platform of the counterpart? It will also bring questions of the simultaneous access to the counterpart from different testing machines. How will it affect on the results?

IMO it SHOULD run on the same machine over loopback to avoid network latencies, etc.

@Sashan
Copy link
Contributor Author

Sashan commented Nov 6, 2025

I'm wondering how to better run this in our performance benchmark lab. Is it enough to run both server and client on the same machine? Or the client and the server must be resided on separate hosts. In that case does it matter the platform of the counterpart? It will also bring questions of the simultaneous access to the counterpart from different testing machines. How will it affect on the results?

this is should be sufficient:

lifty$ ./ssl_poll_perf -t /path/to/certs/servercert.pem /path/to/certs/serverkey.pem  
268.1150

The output is the time it took to establish 10 connections. each connection opens 10 bidirectional streams and 10 unidirectional stream pairs. each stream performs http/1.0 request to obtaub 64bytes. This is a default pre-set. We can either change defaults here:

3405     const char *ccountstr = "10";
3406     const char *bstreamstr = "10";
3407     const char *ustreamstr = "10";
3408     const char *rep_sizestr = "64";
3409     const char *req_sizestr = "64";

Or you can pass commandline options which control those settings. command below performs the same workload as ./ssl_poll_perf -t /path/to/certs//... comands

./ssl_poll_test -c 10 -b 10 -u 10 -w 64 -s 64 -t /path/to/certs/servercert.pem /path/to/certs/serverkey.pem  

Or are you asking how to cross test OpenSSL quic stack with other QUIC clients/servers?

@Sashan Sashan requested a review from jogme November 6, 2025 10:06
@Sashan Sashan requested a review from jogme November 6, 2025 11:50
Copy link
Contributor

@jogme jogme left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Looks good to me, thank you!

@github-project-automation github-project-automation bot moved this from Waiting Review to Waiting Merge in Development Board Nov 19, 2025
This enables us to evaluate performance of OpenSSL QUIC stack
against other QUIC implementations.
Sashan added a commit that referenced this pull request Nov 21, 2025
This enables us to evaluate performance of OpenSSL QUIC stack
against other QUIC implementations.

Reviewed-by: Norbert Pocs <norbertp@openssl.org>
(Merged from #63)
@Sashan
Copy link
Contributor Author

Sashan commented Nov 21, 2025

merged via 513dec3

@Sashan Sashan closed this Nov 21, 2025
@github-project-automation github-project-automation bot moved this from Waiting Merge to Done in Development Board Nov 21, 2025
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

Status: Done

Development

Successfully merging this pull request may close these issues.

5 participants