{"id":28666406,"url":"https://github.com/thoughtscript/perf_tests_2025","last_synced_at":"2026-04-13T12:02:11.494Z","repository":{"id":298788476,"uuid":"1000523038","full_name":"Thoughtscript/perf_tests_2025","owner":"Thoughtscript","description":"Simple Examples for Performance Testing","archived":false,"fork":false,"pushed_at":"2025-06-13T02:54:52.000Z","size":31,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2025-06-13T03:35:50.810Z","etag":null,"topics":["docker","java","spring-boot","webflux"],"latest_commit_sha":null,"homepage":"","language":"Java","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/Thoughtscript.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null}},"created_at":"2025-06-11T23:27:56.000Z","updated_at":"2025-06-13T02:54:55.000Z","dependencies_parsed_at":"2025-06-13T03:37:10.362Z","dependency_job_id":null,"html_url":"https://github.com/Thoughtscript/perf_tests_2025","commit_stats":null,"previous_names":["thoughtscript/spring_perf_tests_2025","thoughtscript/perf_tests_2025"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/Thoughtscript/perf_tests_2025","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Thoughtscript%2Fperf_tests_2025","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Thoughtscript%2Fperf_tests_2025/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Thoughtscript%2Fperf_tests_2025/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Thoughtscript%2Fperf_tests_2025/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/Thoughtscript","download_url":"https://codeload.github.com/Thoughtscript/perf_tests_2025/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Thoughtscript%2Fperf_tests_2025/sbom","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":259659773,"owners_count":22891683,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["docker","java","spring-boot","webflux"],"created_at":"2025-06-13T14:16:02.037Z","updated_at":"2026-04-13T12:02:11.483Z","avatar_url":"https://github.com/Thoughtscript.png","language":"Java","funding_links":[],"categories":[],"sub_categories":[],"readme":"# perf_tests_2025\r\n\r\n[![](https://img.shields.io/badge/Spring%20Boot-3.5.0-green.svg)](https://spring.io/projects/spring-boot)\r\n[![](https://img.shields.io/badge/Spring%20Boot-4.0.0M3-green.svg)](https://spring.io/projects/spring-boot)\r\n[![](https://img.shields.io/badge/Maven-3.8.6-white.svg)](https://maven.apache.org/download.cgi)\r\n[![](https://img.shields.io/badge/Node.js-23.11.1-yellowgreen.svg)](https://nodejs.org/en/) \r\n[![](https://img.shields.io/badge/FastAPI-0.115.12-yellow.svg)](https://fastapi.tiangolo.com/) \r\n[![](https://img.shields.io/badge/Golang-1.24.0-lightblue.svg)](https://go.dev/) \r\n[![](https://img.shields.io/badge/Docker-blue.svg)](https://www.docker.com/) \r\n\r\n## Testing\r\n\r\n```bash\r\ndocker compose up\r\n```\r\n\r\n1. Using [Test Client](https://github.com/Thoughtscript/test_client)\r\n2. [Postman](https://www.postman.com/)\r\n3. Using [JMeter](https://jmeter.apache.org/)\r\n\r\n## Test Client Findings\r\n\r\nThese have been [tested](https://github.com/Thoughtscript/test_client) up to `100,000` near-concurrent requests/connections partly to:\r\n1. See what kind of load they can handle.\r\n2. And to isolate the impact of other dependencies that might cause inefficient Virtual Threading elsewhere.\r\n\r\nConfiguration:\r\n```yaml\r\nclient:\r\n  logging:\r\n    full: true\r\n    stats: true\r\n  concurrent:\r\n    workers: 100000\r\n    cycles: 2\r\n    pause: 1000\r\n```\r\n\r\n\u003e Verifies that there are no errors: no `5XX`, no `4XX` - retrieves and logs Response Body.\r\n\r\n| Detail  | Spring Boot 22 | Spring WebFlux | Node.js | FastAPI | Go | Spring Boot 25 |\r\n| ---  | --- | --- | --- | --- | --- | --- |\r\n| Near Concurrent Connections  | `100,000` in `2` cycles | `100,000` in `2` cycles |  `100,000` in `2` cycles | `100,000` in `2` cycles |  `100,000` in `2` cycles | `100,000` in `2` cycles |\r\n| Total Duration | `137347ms`  |  `137114ms` | `131182ms` | `145531ms` | `113625ms` | `146942ms` |\r\n| Average Client Request Duration | `0ms` | `0ms` | `0ms` | `0ms` | `0ms` | `0ms` |\r\n| Docker Desktop Memory Utilization | `378.9MB` | `412.1MB` | `224.4MB` | `273.1MB` | `135.5MB ` | `473.3MB` |\r\n| Docker Desktop Peak CPU Utilization  | `291.54%` | `63%` | `25.83%` | `28.6%`| `20%` | `31.13%` |\r\n| Docker Desktop CPU Utilization  | `29.41%` | `26.25%` |  `27.43%` | `27.14%` | `19.84%` | `28.9%` | \r\n| Docker  | `maven:3.9.6-eclipse-temurin-22-alpine` | `maven:3.9.6-eclipse-temurin-22-alpine` | `node:23.11.1` | `python:3.12.3` | `golang:1.24.0` | `maven:3.9.6-eclipse-temurin-22-alpine` |\r\n| Config of Note  | Virtual Threads (`100`) | Webflux/Reactor Threads (`5-10`) |  HTTPS Fork Cluster (`8`), SSL | Uvicorn Workers (`8`) | Go Routines/Channels, SSL | Virtual Threads (`100`) \r\n| Version | Java `22`, Spring Boot `3.5.0` | Java `22`, Spring Boot `3.5.0` | Node `23.11.1` | Python `3.12.3`, fastapi `0.115.12` | Go `1.24.0` |  Java `25`, Spring Boot `4.0.0M3` |\r\n| Endpoints | http://localhost:8888/api/example/all | http://localhost:7777/api/example/all | https://localhost:8787/api/example/all | http://localhost:6767/api/example/all | https://localhost:9999/api/example/all | http://localhost:8989/api/example/all |\r\n\r\n\u003e Tested on Machine: `AMD Ryzen 5 5600X (6/12 Core), 32 GB RAM, Windows 11 Pro`\r\n\r\n## JMeter Findings\r\n\r\n\u003e Available [here](./_jmeter/).\r\n\r\n## Resources and Links\r\n\r\n1. Node [1M Users](https://noncodersuccess.medium.com/how-id-scale-a-website-to-1-million-users-with-node-js-examples-53fb58c22302)\r\n2. Node [500K Users - 1K Concurrent](https://medium.com/unboxd/how-i-built-an-app-with-500-000-users-in-5-days-on-a-100-server-77deeb238e83)\r\n3. Node [10K Concurrent](https://www.metabrew.com/article/a-million-user-comet-application-with-mochiweb-part-1)\r\n4. Node [100K Users - 50K Concurrent](https://blog.devgenius.io/how-a-failed-startup-led-me-to-master-node-js-design-patterns-c9dd88e46afe)\r\n5. WebFlux [10K Concurrent](https://aabir-hassan.medium.com/demystifying-spring-webflux-the-event-loop-threading-models-and-schedulers-part-1-7d2711d2f60e)\r\n6. Node, Boot, and WebFlux [10K, 1K, and 10K Concurrent](https://www.brilworks.com/blog/node-js-vs-spring-boot/), respectively\r\n7. Boot [15K Concurrent](https://haril.dev/en/blog/2023/11/10/Spring-MVC-Traffic-Testing)","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fthoughtscript%2Fperf_tests_2025","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fthoughtscript%2Fperf_tests_2025","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fthoughtscript%2Fperf_tests_2025/lists"}