Skip to content

Conversation

justinlin-linkedin
Copy link
Collaborator

Summary

Create a tool to generate synthetic load to a single ambry-server instance for testing. It can generate all get, put, delete, update ttl traffic at the desired qps, either at the same time, or separately. It doesn't provide any client side metric so all the performance result has to be observed from server side metric.

Testing Done

Use this tool to test a single server.

@codecov-commenter
Copy link

codecov-commenter commented May 19, 2025

Codecov Report

Attention: Patch coverage is 0% with 398 lines in your changes missing coverage. Please review.

Project coverage is 69.43%. Comparing base (52ba813) to head (9f9c939).
Report is 253 commits behind head on master.

Files with missing lines Patch % Lines
...hub/ambry/tools/perf/ConcurrentServerLoadTest.java 0.00% 398 Missing ⚠️
Additional details and impacted files
@@             Coverage Diff              @@
##             master    #3101      +/-   ##
============================================
+ Coverage     64.24%   69.43%   +5.18%     
- Complexity    10398    12538    +2140     
============================================
  Files           840      919      +79     
  Lines         71755    77911    +6156     
  Branches       8611     9309     +698     
============================================
+ Hits          46099    54097    +7998     
+ Misses        23004    20984    -2020     
- Partials       2652     2830     +178     

☔ View full report in Codecov by Sentry.
📢 Have feedback on the report? Share it here.

🚀 New features to boost your workflow:
  • ❄️ Test Analytics: Detect flaky tests, report on failures, and find test suite problems.
  • 📦 JS Bundle Analysis: Save yourself from yourself by tracking and limiting bundle sizes in JS merges.

@djycheng
Copy link
Contributor

What's the difference between this test and the one we wrote with forge fire? Can we run the forgefire test on a one-node cluster if we wanted to verify performance of a single server?

try {
putBlobSizeDistributionMap.putAll(objectMapper.readValue(putBlobSizeDistribution, Map.class));
int previousSize = 0;
for (String key : Arrays.asList("0.5", "0.75", "0.95", "0.999")) {
Copy link
Contributor

Choose a reason for hiding this comment

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

Is it possible that the distribution input is 0.3/0.6/0.9... Is this a valid input?


SSLFactory sslFactory = new NettySslHttp2Factory(new SSLConfig(verifiableProperties));
Http2ClientConfig http2ClientConfig = new Http2ClientConfig(verifiableProperties);
connectionPool =
Copy link
Contributor

Choose a reason for hiding this comment

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

What is connectionPool used for?


private void start() {
connectionPool.start();
// Assume each operation is going to take 20 milliseconds to finish on average, which means one thread can execute
Copy link
Contributor

Choose a reason for hiding this comment

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

Curious why 20ms? How to determine this


for (int i = 0; i < numThreads; i++) {
try {
loadTestThreads.get(i).join();
Copy link
Contributor

Choose a reason for hiding this comment

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

Do we need to set timeout for single thread?

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

4 participants