aboutsummaryrefslogtreecommitdiffstats
AgeCommit message (Collapse)Author
2025-02-05Don't run perf suites by defaultLoïc Hoguin
2025-02-05Implement dynamic socket buffer sizesLoïc Hoguin
Cowboy will set the socket's buffer size dynamically to better fit the current workload. When the incoming data is small, a low buffer size reduces the memory footprint and improves responsiveness and therefore performance. When the incoming data is large, such as large HTTP request bodies, a larger buffer size helps us avoid doing too many binary appends and related allocations. Setting a large buffer size for all use cases is sub-optimal because allocating more than needed necessarily results in a performance hit (not just increased memory usage). By default Cowboy starts with a buffer size of 8192 bytes. It then doubles or halves the buffer size depending on the size of the data it receives from the socket. It stops decreasing at 8192 and increasing at 131072 by default. To keep track of the size of the incoming data Cowboy maintains a moving average. It allows Cowboy to avoid changing the buffer too often but still react quickly when necessary. Cowboy will increase the buffer size when the moving average is above 90% of the current buffer size, and decrease when the moving average is below 40% of the current buffer size. The current buffer size and moving average are propagated when switching protocols. The dynamic buffer is implemented in HTTP/1, HTTP/2 and HTTP/1 Websocket. HTTP/2 Websocket has it disabled because it doesn't interact directly with the socket; in that case it is HTTP/2 that has a dynamic buffer. The dynamic buffer provides a very large performance improvement in many scenarios, at minimal cost for others. Because it largely depend on the underlying protocol the improvements are no all equal. TLS and compression also impact the results. The improvement when reading a large request body, with the requests repeated in a fast loop are: * HTTP: 6x to 20x faster * HTTPS: 2x to 6x faster * H2: 4x to 5x faster * H2C: 20x to 40x faster I am not sure why H2C's performance was so bad, especially compared to H2, when using default buffer sizes. Dynamic buffers make H2C a lot more viable with default settings. The performance impact on "hello world" type requests is minimal, it goes from -5% to +5% roughly. Websocket improvements vary again depending on the protocol, but also depending on whether compression is enabled: * HTTP echo: roughly 2x faster * HTTP send: roughly 4x faster * H2C echo: roughly 2x faster * H2C send: 3x to 4x faster In the echo test we reply back, and Gun doesn't have the dynamic buffer optimisation, so that probably explains the x2 difference. With compression however there isn't much improvement. The results are roughly within -10% to +10% of each other. Zlib compression seems to be a bottleneck, or at least to modify the performance profile to such an extent that the size of the buffer does not matter. This happens to randomly generated binary data as well so it is probably not caused by the test data.
2025-01-24Cancel timers asyncDavid Ansari
Where it wasn't already async. To slightly improve performance.
2025-01-24Add initial http_perf_SUITELoïc Hoguin
2025-01-23Fix supported OTP version in user guideLoïc Hoguin
2025-01-23Fix a few underspec'd types in cowboy_staticMarko Mindek
2025-01-23Correcting TransOpts in send_timeout_close testsBjörn Svensson
2025-01-23Add WS compression test where only server sets client_max_window_bitsJose M Perez
When the server has a non-default value configured and the client doesn't send one the extension negotiation should fail.
2025-01-22Websocket: Also apply max_frame_size limit to decompressed dataLoïc Hoguin
Before this commit frames could "cheat" by compressing data below the limit which would get expanded above the limit. Now Cowboy will stop decompressing data when the limit is reached.
2025-01-22Use cow_deflate in cowboy_decompress_hLoïc Hoguin
The function inflate/3 was moved there to make it usable from within Cowlib itself.
2025-01-22Add compressed Websocket to ws_perf_SUITELoïc Hoguin
2025-01-16Websocket: Allow setting the max_frame_size option dynamicallyLoïc Hoguin
This can be used to limit the maximum frame size before some authentication or other validation is completed.
2025-01-15Switch to running autobahntestsuite via DockerLoïc Hoguin
2025-01-15Avoid resetting HTTP/2 idle_timeout timer too oftenLoïc Hoguin
Following the same strategy as Websocket described in commit cbed21c383e4cebb7df5a0a8b81f18c1738bef3e Gains are comparable as far as Websocket over HTTP/2 is concerned.
2025-01-15Avoid resetting Websocket idle_timeout timer too oftenLoïc Hoguin
`perf` has shown that Cowboy spends a lot of time cancelling and starting this timer. Instead of resetting for every data received, we now only reset a field in the state. Before it was working like this: - start idle timeout timer - on trigger, close the connection - on data, cancel and start again Now it's working like this: - start idle timeout timer for a tenth of its duration, with tick number = 0 - on trigger, if tick number != 10 - start the timer again, again for a tenth of its duration - increment tick number - on trigger, if tick number = 10 - close the connection - on data, set tick number to 0
2025-01-15Add ws_perf_SUITE to measure Websocket performanceLoïc Hoguin
It benchmarks binary, ascii, mixed and japanese data using Websocket and Websocket over HTTP/2. HTTP/2 options get set to ensure that performance is better than the default HTTP/2 options. It switches to Gun and Ranch branches that include fixes that are required for tests to complete successfully.
2024-11-27Update Discord link to a permanent inviteLoïc Hoguin
2024-11-15Update CONTRIBUTING.asciidocLoïc Hoguin
2024-11-15Add Discord server to READMELoïc Hoguin
2024-11-08CI: Remove unneeded envLoïc Hoguin
2024-11-08CI: Add concurrency rulesLoïc Hoguin
2024-11-08CI: Simplify testing for examplesLoïc Hoguin
Since we only test them on Ubuntu we can use setup-beam to install Erlang/OTP and avoid waiting for all other checks to complete. Also make the "delete master" job conditional rather than only its step.
2024-11-07CI: Fix master build deletionLoïc Hoguin
Some things likely changed and made it not work anymore. Also seems that the macOS runner is now ARM64.
2024-11-07Fix markdown example for OTP-27Loïc Hoguin
2024-11-06CI: Upload logs in examples job tooLoïc Hoguin
2024-11-06Update Erlang.mkLoïc Hoguin
2024-04-05Add VU#421644 to the HTTP/2 CONTINUATION Flood testLoïc Hoguin
2024-03-26Initial HTTP/3 implementationhttp3Loïc Hoguin
This includes Websocket over HTTP/3. Since quicer, which provides the QUIC implementation, is a NIF, Cowboy cannot depend directly on it. In order to enable QUIC and HTTP/3, users have to set the COWBOY_QUICER environment variable: export COWBOY_QUICER=1 In order to run the test suites, the same must be done for Gun: export GUN_QUICER=1 HTTP/3 support is currently not available on Windows due to compilation issues of quicer which have yet to be looked at or resolved. HTTP/3 support is also unavailable on the upcoming OTP-27 due to compilation errors in quicer dependencies. Once resolved HTTP/3 should work on OTP-27. Because of how QUIC currently works, it's possible that streams that get reset after sending a response do not receive that response. The test suite was modified to accomodate for that. A future extension to QUIC will allow us to gracefully reset streams. This also updates Erlang.mk.
2024-03-14Cowboy 2.12.02.12.0Loïc Hoguin
2024-03-14Update erlang.mkLoïc Hoguin
2024-03-14Add max_fragmented_header_block_size HTTP/2 optionLoïc Hoguin
2024-01-29Make sure we can cancel ct-examples in CI2.11.0Loïc Hoguin
2024-01-26Update ssl_hello_world example certificateLoïc Hoguin
2024-01-26Don't use specific actions versions and update cache to v4Loïc Hoguin
2024-01-26Run make ct-examples at the end of normal CILoïc Hoguin
2024-01-25Refresh copyright linesLoïc Hoguin
2024-01-23Cowboy 2.11Loïc Hoguin
2024-01-23Document reset_idle_timeout_on_send optionLoïc Hoguin
2024-01-23Fix match_qs with constraints when key is not presentgeeksilva97
Original fix by Ali Farhadi <[email protected]>.
2024-01-23Getting started must include relx in depsLoïc Hoguin
2024-01-23Update the guide with range requests supportLoïc Hoguin
Also update the list of headers cowboy_rest might set and tweak a small number of other items.
2024-01-22Document range requestsLoïc Hoguin
2024-01-18Reduce sleep in chunked_one_byte_at_a_timeLoïc Hoguin
To avoid having the connection get closed due to us taking too long on unreliable environments like GitHub Actions.
2024-01-18Retry the read_urlencoded_body_too_large if timeout triggersLoïc Hoguin
This is caused by the timeout being 1s after the period. When the CI environment is overloaded, sometimes the timeout will trigger. We retry, knowing that the timetrap will catch us if we retry too much.
2024-01-17Improve reliability of a few testsLoïc Hoguin
GitHub Actions runners are not as good as self-hosted BuildKite so some adjustments need to be made to timeouts and such.
2024-01-17Show links in README in make prepare_tagLoïc Hoguin
2024-01-17Add missing manual pages for cowboy_stream functionsLoïc Hoguin
2024-01-16REST: Allow generate_etag to return undefinedLoïc Hoguin
This allows conditionally generating an etag.
2024-01-16Recommend increasing max_frame_size_received HTTP/2 optionLoïc Hoguin
2024-01-16Confirm Websocket pong frames are received by handlersLoïc Hoguin