{"id":13878894,"url":"https://github.com/socketry/benchmark-http","last_synced_at":"2025-10-25T08:06:42.088Z","repository":{"id":62554103,"uuid":"126980252","full_name":"socketry/benchmark-http","owner":"socketry","description":null,"archived":false,"fork":false,"pushed_at":"2024-11-18T00:07:15.000Z","size":154,"stargazers_count":20,"open_issues_count":1,"forks_count":2,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-10-21T07:56:15.750Z","etag":null,"topics":["async","async-http","benchmark","concurrency","latency","spider"],"latest_commit_sha":null,"homepage":null,"language":"Ruby","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/socketry.png","metadata":{"files":{"readme":"readme.md","changelog":null,"contributing":null,"funding":null,"license":"license.md","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},"funding":{"custom":"https://github.com/socketry/community/#funding","github":"ioquatix"}},"created_at":"2018-03-27T12:05:23.000Z","updated_at":"2025-07-25T17:58:01.000Z","dependencies_parsed_at":"2024-11-18T01:32:27.823Z","dependency_job_id":null,"html_url":"https://github.com/socketry/benchmark-http","commit_stats":{"total_commits":81,"total_committers":2,"mean_commits":40.5,"dds":"0.012345679012345734","last_synced_commit":"7c9c45634c0cd80af1fca01483fe3b818c32c739"},"previous_names":[],"tags_count":26,"template":false,"template_full_name":null,"purl":"pkg:github/socketry/benchmark-http","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/socketry%2Fbenchmark-http","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/socketry%2Fbenchmark-http/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/socketry%2Fbenchmark-http/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/socketry%2Fbenchmark-http/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/socketry","download_url":"https://codeload.github.com/socketry/benchmark-http/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/socketry%2Fbenchmark-http/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":280923455,"owners_count":26414237,"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","status":"online","status_checked_at":"2025-10-25T02:00:06.499Z","response_time":81,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"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":["async","async-http","benchmark","concurrency","latency","spider"],"created_at":"2024-08-06T08:02:03.536Z","updated_at":"2025-10-25T08:06:42.034Z","avatar_url":"https://github.com/socketry.png","language":"Ruby","readme":"# Benchmark::HTTP\n\nAn asynchronous HTTP benchmark tool built on top of [async](https://github.com/socketry/async), [async-io](https://github.com/socketry/async-io) and [async-http](https://github.com/socketry/async-http). Useful for analysing server performance. Supports HTTP1 and HTTP2.\n\n[![Development Status](https://github.com/socketry/benchmark-http/workflows/Test/badge.svg)](https://github.com/socketry/benchmark-http/actions?workflow=Test)\n\n## Installation\n\nInstall it yourself:\n\n    $ gem install benchmark-http\n\n## Usage\n\nYou can run `benchmark-http` is a top level tool for invoking specific benchmarks.\n\n### Spider\n\nThis benchmark spiders a website and generates some statistics on general access time.\n\n``` shell\n$ benchmark-http spider https://www.oriontransfer.co.nz/welcome/index\nHEAD https://www.oriontransfer.co.nz/welcome/index -\u003e HTTP/2.0 404 (unspecified bytes)\nGET https://www.oriontransfer.co.nz/welcome/index (depth = 10)\nGET https://www.oriontransfer.co.nz/welcome/index -\u003e HTTP/2.0 404 (2263 bytes)\nHEAD https://www.oriontransfer.co.nz/products/index -\u003e HTTP/2.0 200 (unspecified bytes)\nGET https://www.oriontransfer.co.nz/products/index (depth = 9)\nHEAD https://www.oriontransfer.co.nz/services/index -\u003e HTTP/2.0 200 (unspecified bytes)\nGET https://www.oriontransfer.co.nz/services/index (depth = 9)\nHEAD https://www.oriontransfer.co.nz/support/index -\u003e HTTP/2.0 200 (unspecified bytes)\nGET https://www.oriontransfer.co.nz/support/index (depth = 9)\nHEAD https://www.oriontransfer.co.nz/support/contact-us -\u003e HTTP/2.0 307 (unspecified bytes)\nFollowing redirect to https://www.oriontransfer.co.nz/support/contact-us/index...\nHEAD https://www.oriontransfer.co.nz/support/terms-of-service -\u003e HTTP/2.0 200 (unspecified bytes)\nGET https://www.oriontransfer.co.nz/support/terms-of-service (depth = 9)\nGET https://www.oriontransfer.co.nz/products/index -\u003e HTTP/2.0 200 (3469 bytes)\nGET https://www.oriontransfer.co.nz/services/index -\u003e HTTP/2.0 200 (2488 bytes)\nGET https://www.oriontransfer.co.nz/support/index -\u003e HTTP/2.0 200 (2246 bytes)\nHEAD https://www.oriontransfer.co.nz/support/contact-us/index -\u003e HTTP/2.0 200 (unspecified bytes)\nGET https://www.oriontransfer.co.nz/support/contact-us/index (depth = 8)\nGET https://www.oriontransfer.co.nz/support/terms-of-service -\u003e HTTP/2.0 200 (8466 bytes)\nHEAD https://www.oriontransfer.co.nz/products/library-inspector/index -\u003e HTTP/2.0 200 (unspecified bytes)\nGET https://www.oriontransfer.co.nz/products/library-inspector/index (depth = 8)\nHEAD https://www.oriontransfer.co.nz/products/truth-tables/index -\u003e HTTP/2.0 200 (unspecified bytes)\nGET https://www.oriontransfer.co.nz/products/truth-tables/index (depth = 8)\nHEAD https://www.oriontransfer.co.nz/products/fingerprint/index -\u003e HTTP/2.0 200 (unspecified bytes)\nGET https://www.oriontransfer.co.nz/products/fingerprint/index (depth = 8)\nHEAD https://www.oriontransfer.co.nz/services/internet-services -\u003e HTTP/2.0 200 (unspecified bytes)\nGET https://www.oriontransfer.co.nz/services/internet-services (depth = 8)\nHEAD https://www.oriontransfer.co.nz/services/software-development -\u003e HTTP/2.0 200 (unspecified bytes)\nGET https://www.oriontransfer.co.nz/services/software-development (depth = 8)\nHEAD https://www.oriontransfer.co.nz/services/systems-administration -\u003e HTTP/2.0 200 (unspecified bytes)\nGET https://www.oriontransfer.co.nz/services/systems-administration (depth = 8)\nHEAD https://www.oriontransfer.co.nz/services/website-development -\u003e HTTP/2.0 200 (unspecified bytes)\nGET https://www.oriontransfer.co.nz/services/website-development (depth = 8)\nHEAD https://www.oriontransfer.co.nz/support/contact-us/ -\u003e HTTP/2.0 307 (unspecified bytes)\nFollowing redirect to https://www.oriontransfer.co.nz/support/contact-us/index...\nGET https://www.oriontransfer.co.nz/support/contact-us/index -\u003e HTTP/2.0 200 (3094 bytes)\nGET https://www.oriontransfer.co.nz/products/library-inspector/index -\u003e HTTP/2.0 200 (5592 bytes)\nGET https://www.oriontransfer.co.nz/products/truth-tables/index -\u003e HTTP/2.0 200 (4160 bytes)\nGET https://www.oriontransfer.co.nz/products/fingerprint/index -\u003e HTTP/2.0 200 (4414 bytes)\nGET https://www.oriontransfer.co.nz/services/internet-services -\u003e HTTP/2.0 200 (3362 bytes)\nGET https://www.oriontransfer.co.nz/services/software-development -\u003e HTTP/2.0 200 (3521 bytes)\nGET https://www.oriontransfer.co.nz/services/systems-administration -\u003e HTTP/2.0 200 (2979 bytes)\nGET https://www.oriontransfer.co.nz/services/website-development -\u003e HTTP/2.0 200 (3943 bytes)\nHEAD https://www.oriontransfer.co.nz/_gallery/products/library-inspector/_screenshots/large/Library%20Inspector%20(Libraries).png -\u003e HTTP/2.0 200 (unspecified bytes)\nUnsupported content type: image/png\nHEAD https://www.oriontransfer.co.nz/_gallery/products/library-inspector/_screenshots/large/Library%20Inspector%20(Libraries%20Disassembly).png -\u003e HTTP/2.0 200 (unspecified bytes)\nUnsupported content type: image/png\nHEAD https://www.oriontransfer.co.nz/_gallery/products/library-inspector/_screenshots/large/Library%20Inspector%20(Libraries%20QuickLook).png -\u003e HTTP/2.0 200 (unspecified bytes)\nUnsupported content type: image/png\nHEAD https://www.oriontransfer.co.nz/_gallery/products/library-inspector/_screenshots/large/Library%20Inspector%20(App).png -\u003e HTTP/2.0 200 (unspecified bytes)\nUnsupported content type: image/png\nHEAD https://www.oriontransfer.co.nz/_gallery/products/library-inspector/_screenshots/large/Library%20Inspector%20(App%20Headers).png -\u003e HTTP/2.0 200 (unspecified bytes)\nUnsupported content type: image/png\nHEAD https://www.oriontransfer.co.nz/_gallery/products/truth-tables/_screenshots/large/Reformat%20Expression.png -\u003e HTTP/2.0 200 (unspecified bytes)\nUnsupported content type: image/png\nHEAD https://www.oriontransfer.co.nz/_gallery/products/truth-tables/_screenshots/large/Large%20Tables.png -\u003e HTTP/2.0 200 (unspecified bytes)\nUnsupported content type: image/png\nHEAD https://www.oriontransfer.co.nz/_gallery/products/truth-tables/_screenshots/large/Tutor.png -\u003e HTTP/2.0 200 (unspecified bytes)\nUnsupported content type: image/png\nHEAD https://www.oriontransfer.co.nz/_gallery/products/truth-tables/_screenshots/large/Informative%20Text.png -\u003e HTTP/2.0 200 (unspecified bytes)\nUnsupported content type: image/png\nHEAD https://www.oriontransfer.co.nz/_gallery/products/fingerprint/_screenshots/large/Fingerprint%20(3).png -\u003e HTTP/2.0 200 (unspecified bytes)\nUnsupported content type: image/png\nHEAD https://www.oriontransfer.co.nz/_gallery/products/fingerprint/_screenshots/large/Fingerprint%20(2).png -\u003e HTTP/2.0 200 (unspecified bytes)\nUnsupported content type: image/png\nHEAD https://www.oriontransfer.co.nz/_gallery/products/fingerprint/_screenshots/large/Fingerprint%20(1).png -\u003e HTTP/2.0 200 (unspecified bytes)\nUnsupported content type: image/png\nHEAD https://www.oriontransfer.co.nz/services/training -\u003e HTTP/2.0 200 (unspecified bytes)\nGET https://www.oriontransfer.co.nz/services/training (depth = 7)\nGET https://www.oriontransfer.co.nz/services/training -\u003e HTTP/2.0 200 (2994 bytes)\n14 samples: 13x 200; 1x 404. 15.12 requests per second. S/D: 35.69ms.\n```\n\n### Concurrency\n\nThis benchmark determines the optimal level of concurrency (maximise throughput while keeping latency to a minimum).\n\n``` shell\n$ benchmark-http concurrency https://www.oriontransfer.co.nz/welcome/index\nI am going to benchmark https://www.oriontransfer.co.nz/welcome/index...\nI am running 1 asynchronous tasks that will each make sequential requests...\nI made 273 requests in 52.4s. The per-request latency was 191.79ms. That's 5.214149911737622 asynchronous requests/second.\n\t          Variance: 997.437µs\n\tStandard Deviation: 31.58ms\n\t    Standard Error: 0.0019114428646174592\nI am running 2 asynchronous tasks that will each make sequential requests...\nI made 177 requests in 16.8s. The per-request latency was 190.19ms. That's 10.51600772540387 asynchronous requests/second.\n\t          Variance: 632.076µs\n\tStandard Deviation: 25.14ms\n\t    Standard Error: 0.001889722381767832\nI am running 4 asynchronous tasks that will each make sequential requests...\nI made 8 requests in 372.49ms. The per-request latency was 186.25ms. That's 21.476841588829895 asynchronous requests/second.\n\t          Variance: 0.048µs\n\tStandard Deviation: 219.819µs\n\t    Standard Error: 7.771792696588776e-05\nI am running 8 asynchronous tasks that will each make sequential requests...\nI made 128 requests in 3.0s. The per-request latency was 188.10ms. That's 42.53004421587869 asynchronous requests/second.\n\t          Variance: 399.781µs\n\tStandard Deviation: 19.99ms\n\t    Standard Error: 0.0017672840585127617\nI am running 16 asynchronous tasks that will each make sequential requests...\nI made 184 requests in 2.2s. The per-request latency was 188.46ms. That's 84.89938672881854 asynchronous requests/second.\n\t          Variance: 548.641µs\n\tStandard Deviation: 23.42ms\n\t    Standard Error: 0.0017267724185582615\nI am running 32 asynchronous tasks that will each make sequential requests...\nI made 152 requests in 891.06ms. The per-request latency was 187.59ms. That's 170.58399627520865 asynchronous requests/second.\n\t          Variance: 335.694µs\n\tStandard Deviation: 18.32ms\n\t    Standard Error: 0.00148610620533633\nI am running 64 asynchronous tasks that will each make sequential requests...\nI made 438 requests in 1.3s. The per-request latency was 191.68ms. That's 333.89790173541496 asynchronous requests/second.\n\t          Variance: 1.19ms\n\tStandard Deviation: 34.51ms\n\t    Standard Error: 0.001648801656177374\nI am running 128 asynchronous tasks that will each make sequential requests...\nI made 360 requests in 533.83ms. The per-request latency was 189.81ms. That's 674.373540567776 asynchronous requests/second.\n\t          Variance: 555.212µs\n\tStandard Deviation: 23.56ms\n\t    Standard Error: 0.0012418759009531876\nI am running 256 asynchronous tasks that will each make sequential requests...\nI made 512 requests in 463.03ms. The per-request latency was 231.51ms. That's 1105.762787139087 asynchronous requests/second.\n\t          Variance: 888.185µs\n\tStandard Deviation: 29.80ms\n\t    Standard Error: 0.0013170938569343825\nI am running 192 asynchronous tasks that will each make sequential requests...\nI made 384 requests in 380.97ms. The per-request latency was 190.48ms. That's 1007.9615261872923 asynchronous requests/second.\n\t          Variance: 142.770µs\n\tStandard Deviation: 11.95ms\n\t    Standard Error: 0.0006097518459132856\nI am running 224 asynchronous tasks that will each make sequential requests...\nI made 448 requests in 411.79ms. The per-request latency was 205.89ms. That's 1087.9398101463066 asynchronous requests/second.\n\t          Variance: 215.480µs\n\tStandard Deviation: 14.68ms\n\t    Standard Error: 0.0006935294886115942\nI am running 240 asynchronous tasks that will each make sequential requests...\nI made 480 requests in 401.62ms. The per-request latency was 200.81ms. That's 1195.1473779597363 asynchronous requests/second.\n\t          Variance: 292.021µs\n\tStandard Deviation: 17.09ms\n\t    Standard Error: 0.0007799848849992035\nI am running 248 asynchronous tasks that will each make sequential requests...\nI made 496 requests in 432.58ms. The per-request latency was 216.29ms. That's 1146.621534849607 asynchronous requests/second.\n\t          Variance: 446.681µs\n\tStandard Deviation: 21.13ms\n\t    Standard Error: 0.0009489813840514241\nI am running 252 asynchronous tasks that will each make sequential requests...\nI made 504 requests in 417.86ms. The per-request latency was 208.93ms. That's 1206.1477638702509 asynchronous requests/second.\n\t          Variance: 222.939µs\n\tStandard Deviation: 14.93ms\n\t    Standard Error: 0.0006650854376052381\nI am running 254 asynchronous tasks that will each make sequential requests...\nI made 508 requests in 419.67ms. The per-request latency was 209.83ms. That's 1210.4835614086478 asynchronous requests/second.\n\t          Variance: 177.005µs\n\tStandard Deviation: 13.30ms\n\t    Standard Error: 0.0005902836562252991\nI am running 255 asynchronous tasks that will each make sequential requests...\nI made 510 requests in 434.38ms. The per-request latency was 217.19ms. That's 1174.0936493567908 asynchronous requests/second.\n\t          Variance: 457.592µs\n\tStandard Deviation: 21.39ms\n\t    Standard Error: 0.000947227304291054\nYour server can handle 255 concurrent requests.\nAt this level of concurrency, requests have ~1.13x higher latency.\n```\n\n## Contributing\n\nWe welcome contributions to this project.\n\n1.  Fork it.\n2.  Create your feature branch (`git checkout -b my-new-feature`).\n3.  Commit your changes (`git commit -am 'Add some feature'`).\n4.  Push to the branch (`git push origin my-new-feature`).\n5.  Create new Pull Request.\n\n### Developer Certificate of Origin\n\nIn order to protect users of this project, we require all contributors to comply with the [Developer Certificate of Origin](https://developercertificate.org/). This ensures that all contributions are properly licensed and attributed.\n\n### Community Guidelines\n\nThis project is best served by a collaborative and respectful environment. Treat each other professionally, respect differing viewpoints, and engage constructively. Harassment, discrimination, or harmful behavior is not tolerated. Communicate clearly, listen actively, and support one another. If any issues arise, please inform the project maintainers.\n","funding_links":["https://github.com/socketry/community/#funding","https://github.com/sponsors/ioquatix"],"categories":["By Language","Ruby"],"sub_categories":["Ruby"],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fsocketry%2Fbenchmark-http","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fsocketry%2Fbenchmark-http","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fsocketry%2Fbenchmark-http/lists"}