From 93060512f1793e1e625b3d3f2a9064ef8802adf3 Mon Sep 17 00:00:00 2001 From: Takeshi Yoshino <4511440+tyoshino@users.noreply.github.com> Date: Tue, 3 Mar 2026 13:58:21 +0000 Subject: [PATCH 1/5] feat(http2): add a simple http2 server and client --- http2/.gitignore | 5 + http2/CMakeLists.txt | 24 +++++ http2/Makefile | 222 +++++++++++++++++++++++++++++++++++++++ http2/client.c | 215 ++++++++++++++++++++++++++++++++++++++ http2/server.c | 241 +++++++++++++++++++++++++++++++++++++++++++ 5 files changed, 707 insertions(+) create mode 100644 http2/.gitignore create mode 100644 http2/CMakeLists.txt create mode 100644 http2/Makefile create mode 100644 http2/client.c create mode 100644 http2/server.c diff --git a/http2/.gitignore b/http2/.gitignore new file mode 100644 index 0000000..bb667eb --- /dev/null +++ b/http2/.gitignore @@ -0,0 +1,5 @@ +h2_bench_client +h2_echo_server + +CMakeFiles +CMakeCache.txt \ No newline at end of file diff --git a/http2/CMakeLists.txt b/http2/CMakeLists.txt new file mode 100644 index 0000000..9dccf44 --- /dev/null +++ b/http2/CMakeLists.txt @@ -0,0 +1,24 @@ +cmake_minimum_required(VERSION 3.10) +project(http2_echo_server C) + +set(CMAKE_C_STANDARD 11) + +find_package(PkgConfig REQUIRED) +pkg_check_modules(LIBEVENT REQUIRED libevent) +pkg_check_modules(LIBNGHTTP2 REQUIRED libnghttp2) + +include_directories( + ${LIBEVENT_INCLUDE_DIRS} + ${LIBNGHTTP2_INCLUDE_DIRS} +) + +link_directories( + ${LIBEVENT_LIBRARY_DIRS} + ${LIBNGHTTP2_LIBRARY_DIRS} +) + +add_executable(h2_echo_server server.c) +target_link_libraries(h2_echo_server ${LIBEVENT_LIBRARIES} ${LIBNGHTTP2_LIBRARIES}) + +add_executable(h2_bench_client client.c) +target_link_libraries(h2_bench_client ${LIBEVENT_LIBRARIES} ${LIBNGHTTP2_LIBRARIES}) diff --git a/http2/Makefile b/http2/Makefile new file mode 100644 index 0000000..27edb22 --- /dev/null +++ b/http2/Makefile @@ -0,0 +1,222 @@ +# CMAKE generated file: DO NOT EDIT! +# Generated by "Unix Makefiles" Generator, CMake Version 3.31 + +# Default target executed when no arguments are given to make. +default_target: all +.PHONY : default_target + +# Allow only one "make -f Makefile2" at a time, but pass parallelism. +.NOTPARALLEL: + +#============================================================================= +# Special targets provided by cmake. + +# Disable implicit rules so canonical targets will work. +.SUFFIXES: + +# Disable VCS-based implicit rules. +% : %,v + +# Disable VCS-based implicit rules. +% : RCS/% + +# Disable VCS-based implicit rules. +% : RCS/%,v + +# Disable VCS-based implicit rules. +% : SCCS/s.% + +# Disable VCS-based implicit rules. +% : s.% + +.SUFFIXES: .hpux_make_needs_suffix_list + +# Command-line flag to silence nested $(MAKE). +$(VERBOSE)MAKESILENT = -s + +#Suppress display of executed commands. +$(VERBOSE).SILENT: + +# A target that is always out of date. +cmake_force: +.PHONY : cmake_force + +#============================================================================= +# Set environment variables for the build. + +# The shell in which to execute make rules. +SHELL = /bin/sh + +# The CMake executable. +CMAKE_COMMAND = /usr/bin/cmake + +# The command to remove a file. +RM = /usr/bin/cmake -E rm -f + +# Escaping for special characters. +EQUALS = = + +# The top-level source directory on which CMake was run. +CMAKE_SOURCE_DIR = /home/ysnysnysn/net_http/http2 + +# The top-level build directory on which CMake was run. +CMAKE_BINARY_DIR = /home/ysnysnysn/net_http/http2 + +#============================================================================= +# Targets provided globally by CMake. + +# Special rule for the target edit_cache +edit_cache: + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --cyan "No interactive CMake dialog available..." + /usr/bin/cmake -E echo No\ interactive\ CMake\ dialog\ available. +.PHONY : edit_cache + +# Special rule for the target edit_cache +edit_cache/fast: edit_cache +.PHONY : edit_cache/fast + +# Special rule for the target rebuild_cache +rebuild_cache: + @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --cyan "Running CMake to regenerate build system..." + /usr/bin/cmake --regenerate-during-build -S$(CMAKE_SOURCE_DIR) -B$(CMAKE_BINARY_DIR) +.PHONY : rebuild_cache + +# Special rule for the target rebuild_cache +rebuild_cache/fast: rebuild_cache +.PHONY : rebuild_cache/fast + +# The main all target +all: cmake_check_build_system + $(CMAKE_COMMAND) -E cmake_progress_start /home/ysnysnysn/net_http/http2/CMakeFiles /home/ysnysnysn/net_http/http2//CMakeFiles/progress.marks + $(MAKE) $(MAKESILENT) -f CMakeFiles/Makefile2 all + $(CMAKE_COMMAND) -E cmake_progress_start /home/ysnysnysn/net_http/http2/CMakeFiles 0 +.PHONY : all + +# The main clean target +clean: + $(MAKE) $(MAKESILENT) -f CMakeFiles/Makefile2 clean +.PHONY : clean + +# The main clean target +clean/fast: clean +.PHONY : clean/fast + +# Prepare targets for installation. +preinstall: all + $(MAKE) $(MAKESILENT) -f CMakeFiles/Makefile2 preinstall +.PHONY : preinstall + +# Prepare targets for installation. +preinstall/fast: + $(MAKE) $(MAKESILENT) -f CMakeFiles/Makefile2 preinstall +.PHONY : preinstall/fast + +# clear depends +depend: + $(CMAKE_COMMAND) -S$(CMAKE_SOURCE_DIR) -B$(CMAKE_BINARY_DIR) --check-build-system CMakeFiles/Makefile.cmake 1 +.PHONY : depend + +#============================================================================= +# Target rules for targets named h2_echo_server + +# Build rule for target. +h2_echo_server: cmake_check_build_system + $(MAKE) $(MAKESILENT) -f CMakeFiles/Makefile2 h2_echo_server +.PHONY : h2_echo_server + +# fast build rule for target. +h2_echo_server/fast: + $(MAKE) $(MAKESILENT) -f CMakeFiles/h2_echo_server.dir/build.make CMakeFiles/h2_echo_server.dir/build +.PHONY : h2_echo_server/fast + +#============================================================================= +# Target rules for targets named h2_bench_client + +# Build rule for target. +h2_bench_client: cmake_check_build_system + $(MAKE) $(MAKESILENT) -f CMakeFiles/Makefile2 h2_bench_client +.PHONY : h2_bench_client + +# fast build rule for target. +h2_bench_client/fast: + $(MAKE) $(MAKESILENT) -f CMakeFiles/h2_bench_client.dir/build.make CMakeFiles/h2_bench_client.dir/build +.PHONY : h2_bench_client/fast + +client.o: client.c.o +.PHONY : client.o + +# target to build an object file +client.c.o: + $(MAKE) $(MAKESILENT) -f CMakeFiles/h2_bench_client.dir/build.make CMakeFiles/h2_bench_client.dir/client.c.o +.PHONY : client.c.o + +client.i: client.c.i +.PHONY : client.i + +# target to preprocess a source file +client.c.i: + $(MAKE) $(MAKESILENT) -f CMakeFiles/h2_bench_client.dir/build.make CMakeFiles/h2_bench_client.dir/client.c.i +.PHONY : client.c.i + +client.s: client.c.s +.PHONY : client.s + +# target to generate assembly for a file +client.c.s: + $(MAKE) $(MAKESILENT) -f CMakeFiles/h2_bench_client.dir/build.make CMakeFiles/h2_bench_client.dir/client.c.s +.PHONY : client.c.s + +server.o: server.c.o +.PHONY : server.o + +# target to build an object file +server.c.o: + $(MAKE) $(MAKESILENT) -f CMakeFiles/h2_echo_server.dir/build.make CMakeFiles/h2_echo_server.dir/server.c.o +.PHONY : server.c.o + +server.i: server.c.i +.PHONY : server.i + +# target to preprocess a source file +server.c.i: + $(MAKE) $(MAKESILENT) -f CMakeFiles/h2_echo_server.dir/build.make CMakeFiles/h2_echo_server.dir/server.c.i +.PHONY : server.c.i + +server.s: server.c.s +.PHONY : server.s + +# target to generate assembly for a file +server.c.s: + $(MAKE) $(MAKESILENT) -f CMakeFiles/h2_echo_server.dir/build.make CMakeFiles/h2_echo_server.dir/server.c.s +.PHONY : server.c.s + +# Help Target +help: + @echo "The following are some of the valid targets for this Makefile:" + @echo "... all (the default if no target is provided)" + @echo "... clean" + @echo "... depend" + @echo "... edit_cache" + @echo "... rebuild_cache" + @echo "... h2_bench_client" + @echo "... h2_echo_server" + @echo "... client.o" + @echo "... client.i" + @echo "... client.s" + @echo "... server.o" + @echo "... server.i" + @echo "... server.s" +.PHONY : help + + + +#============================================================================= +# Special targets to cleanup operation of make. + +# Special rule to run CMake to check the build system integrity. +# No rule that depends on this can have commands that come from listfiles +# because they might be regenerated. +cmake_check_build_system: + $(CMAKE_COMMAND) -S$(CMAKE_SOURCE_DIR) -B$(CMAKE_BINARY_DIR) --check-build-system CMakeFiles/Makefile.cmake 0 +.PHONY : cmake_check_build_system + diff --git a/http2/client.c b/http2/client.c new file mode 100644 index 0000000..6bed098 --- /dev/null +++ b/http2/client.c @@ -0,0 +1,215 @@ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#define MAKE_NV(name, value) \ + { \ + (uint8_t*)(name), (uint8_t*)(value), strlen(name), strlen(value), \ + NGHTTP2_NV_FLAG_NONE} + +#define REQUEST_PAYLOAD "Hello, HTTP/2 echo server!" +#define CONCURRENT_REQUESTS 100 + +struct ClientSession { + struct bufferevent* bev; + nghttp2_session* session; + struct event_base* evbase; + int requests_completed; + int requests_in_flight; + struct timeval start_time; +}; + +static void submit_request(struct ClientSession* client); + +static ssize_t send_callback(nghttp2_session* session, const uint8_t* data, size_t length, int flags, void* user_data) { + struct ClientSession* client = (struct ClientSession*)user_data; + struct bufferevent* bev = client->bev; + struct evbuffer* output = bufferevent_get_output(bev); + evbuffer_add(output, data, length); + return (ssize_t)length; +} + +static int on_frame_recv_callback(nghttp2_session* session, const nghttp2_frame* frame, void* user_data) { + struct ClientSession* client = (struct ClientSession*)user_data; + printf("Client received frame type %d on stream %d\n", frame->hd.type, frame->hd.stream_id); + if (frame->hd.type == NGHTTP2_DATA && (frame->hd.flags & NGHTTP2_FLAG_END_STREAM)) { + client->requests_completed++; + client->requests_in_flight--; + submit_request(client); // Submit another request to keep pipeline full + + if (client->requests_completed % 1000 == 0) { + struct timeval now; + gettimeofday(&now, NULL); + double elapsed = (now.tv_sec - client->start_time.tv_sec) + + (now.tv_usec - client->start_time.tv_usec) / 1000000.0; + printf("Completed %d requests. RPS: %.2f\n", + client->requests_completed, client->requests_completed / elapsed); + } + } else if (frame->hd.type == NGHTTP2_HEADERS && (frame->hd.flags & NGHTTP2_FLAG_END_STREAM)) { + // If server sent end stream on headers (e.g., error without body) + printf("Client received END_STREAM on headers\n"); + } + return 0; +} + +static ssize_t data_provider_callback(nghttp2_session* session, int32_t stream_id, uint8_t* buf, size_t length, uint32_t* data_flags, nghttp2_data_source* source, void* user_data) { + int* sent = (int*)source->ptr; + size_t payload_len = strlen(REQUEST_PAYLOAD); + + if (*sent) { + *data_flags |= NGHTTP2_DATA_FLAG_EOF; + free(sent); + return 0; + } + + size_t send_len = payload_len < length ? payload_len : length; + memcpy(buf, REQUEST_PAYLOAD, send_len); + + if (send_len == payload_len) { + *data_flags |= NGHTTP2_DATA_FLAG_EOF; + free(sent); + } else { + *sent = 1; // Simplification: assume we send it all in one go or it's a bug in our tiny benchmark + } + + return send_len; +} + +static void submit_request(struct ClientSession* client) { + const nghttp2_nv hdrs[] = { + MAKE_NV(":method", "POST"), + MAKE_NV(":path", "/"), + MAKE_NV(":scheme", "http"), + MAKE_NV(":authority", "127.0.0.1:8080"), + }; + + int* sent = malloc(sizeof(int)); + *sent = 0; + + nghttp2_data_provider data_prd; + data_prd.source.ptr = sent; + data_prd.read_callback = data_provider_callback; + + int32_t stream_id = nghttp2_submit_request(client->session, NULL, hdrs, 4, &data_prd, NULL); + if (stream_id < 0) { + printf("nghttp2_submit_request error\n"); + } else { + client->requests_in_flight++; + } + nghttp2_session_send(client->session); +} + +static void setup_nghttp2_callbacks(nghttp2_session_callbacks* callbacks) { + nghttp2_session_callbacks_set_send_callback(callbacks, send_callback); + nghttp2_session_callbacks_set_on_frame_recv_callback(callbacks, on_frame_recv_callback); +} + +static void readcb(struct bufferevent* bev, void* ptr) { + struct ClientSession* client = (struct ClientSession*)ptr; + + struct evbuffer* input = bufferevent_get_input(bev); + size_t datalen = evbuffer_get_length(input); + printf("Client readcb: got %zu bytes\n", datalen); + fflush(stdout); + + if (datalen == 0) return; + + unsigned char* data = evbuffer_pullup(input, -1); + ssize_t readlen = nghttp2_session_mem_recv(client->session, data, datalen); + if (readlen < 0) { + printf("Client: nghttp2_session_mem_recv error: %s\n", nghttp2_strerror((int)readlen)); + fflush(stdout); + return; + } + + printf("Client readcb: consumed %zd bytes\n", readlen); + fflush(stdout); + + evbuffer_drain(input, readlen); + nghttp2_session_send(client->session); +} + +static void eventcb(struct bufferevent* bev, short events, void* ptr) { + struct ClientSession* client = (struct ClientSession*)ptr; + + if (events & BEV_EVENT_CONNECTED) { + printf("Connected to server.\n"); + + nghttp2_session_callbacks* callbacks; + nghttp2_session_callbacks_new(&callbacks); + setup_nghttp2_callbacks(callbacks); + + nghttp2_session_client_new(&client->session, callbacks, client); + + nghttp2_session_callbacks_del(callbacks); + + // Send connection preface and initial settings + nghttp2_settings_entry iv[1] = { + {NGHTTP2_SETTINGS_MAX_CONCURRENT_STREAMS, CONCURRENT_REQUESTS}}; + nghttp2_submit_settings(client->session, NGHTTP2_FLAG_NONE, iv, 1); + + gettimeofday(&client->start_time, NULL); + + for (int i = 0; i < CONCURRENT_REQUESTS; i++) { + submit_request(client); + } + + return; + } + + if (events & (BEV_EVENT_EOF | BEV_EVENT_ERROR)) { + printf("Connection closed or error.\n"); + event_base_loopexit(client->evbase, NULL); + } +} + +int main(int argc, char** argv) { + struct ClientSession client; + memset(&client, 0, sizeof(client)); + + struct event_base* base = event_base_new(); + client.evbase = base; + + struct sockaddr_in sin; + memset(&sin, 0, sizeof(sin)); + + const char* host = "127.0.0.1"; + int port = 8080; + if (argc >= 3) { + host = argv[1]; + port = atoi(argv[2]); + } + + sin.sin_family = AF_INET; + sin.sin_addr.s_addr = inet_addr(host); + sin.sin_port = htons(port); + + struct bufferevent* bev = bufferevent_socket_new(base, -1, BEV_OPT_CLOSE_ON_FREE); + client.bev = bev; + + bufferevent_setcb(bev, readcb, NULL, eventcb, &client); + bufferevent_enable(bev, EV_READ | EV_WRITE); + + if (bufferevent_socket_connect(bev, (struct sockaddr*)&sin, sizeof(sin)) < 0) { + printf("Connect failed\n"); + return 1; + } + + event_base_dispatch(base); + + if (client.session) nghttp2_session_del(client.session); + bufferevent_free(bev); + event_base_free(base); + + return 0; +} diff --git a/http2/server.c b/http2/server.c new file mode 100644 index 0000000..348743d --- /dev/null +++ b/http2/server.c @@ -0,0 +1,241 @@ +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#define MAKE_NV(name, value) \ + { \ + (uint8_t*)(name), (uint8_t*)(value), strlen(name), strlen(value), \ + NGHTTP2_NV_FLAG_NONE} + +#define PORT 8080 + +struct app_context; +struct stream_data; + +struct ClientSession { + struct bufferevent* bev; + nghttp2_session* session; + struct app_context* app_ctx; +}; + +struct stream_data { + int32_t stream_id; + struct evbuffer* req_body; +}; + +struct app_context { + struct event_base* evbase; +}; + +static ssize_t send_callback(nghttp2_session* session, const uint8_t* data, size_t length, int flags, void* user_data) { + struct ClientSession* client = (struct ClientSession*)user_data; + struct bufferevent* bev = client->bev; + struct evbuffer* output = bufferevent_get_output(bev); + evbuffer_add(output, data, length); + return (ssize_t)length; +} + +static ssize_t echo_data_provider_callback(nghttp2_session* session, int32_t stream_id, uint8_t* buf, size_t length, uint32_t* data_flags, nghttp2_data_source* source, void* user_data); + +static int on_frame_recv_callback(nghttp2_session* session, const nghttp2_frame* frame, void* user_data) { + struct ClientSession* client = (struct ClientSession*)user_data; + printf("Server received frame type %d\n", frame->hd.type); + switch (frame->hd.type) { + case NGHTTP2_HEADERS: + if (frame->headers.cat == NGHTTP2_HCAT_REQUEST) { + struct stream_data* sd = malloc(sizeof(struct stream_data)); + sd->stream_id = frame->hd.stream_id; + sd->req_body = evbuffer_new(); + nghttp2_session_set_stream_user_data(session, frame->hd.stream_id, sd); + } + break; + case NGHTTP2_DATA: + printf("Server logic: DATA frame on stream %d, flags %x\n", frame->hd.stream_id, frame->hd.flags); + if (frame->hd.flags & NGHTTP2_FLAG_END_STREAM) { + printf("Server logic: END_STREAM seen\n"); + const nghttp2_nv hdrs[] = { + MAKE_NV(":status", "200")}; + struct stream_data* sd = nghttp2_session_get_stream_user_data(session, frame->hd.stream_id); + if (sd) { + nghttp2_data_provider data_prd; + data_prd.source.ptr = sd; + data_prd.read_callback = echo_data_provider_callback; + int rv = nghttp2_submit_response(session, frame->hd.stream_id, hdrs, 1, &data_prd); + printf("nghttp2_submit_response returned %d\n", rv); + nghttp2_session_send(session); // flush to output + } else { + printf("Server logic: No stream data found!\n"); + } + } + break; + } + return 0; +} + +static int on_data_chunk_recv_callback(nghttp2_session* session, uint8_t flags, int32_t stream_id, const uint8_t* data, size_t len, void* user_data) { + struct stream_data* sd = nghttp2_session_get_stream_user_data(session, stream_id); + if (sd) { + evbuffer_add(sd->req_body, data, len); + } + return 0; +} + +static ssize_t echo_data_provider_callback(nghttp2_session* session, int32_t stream_id, uint8_t* buf, size_t length, uint32_t* data_flags, nghttp2_data_source* source, void* user_data) { + struct stream_data* sd = (struct stream_data*)source->ptr; + + size_t avail = evbuffer_get_length(sd->req_body); + size_t send_len = avail < length ? avail : length; + + if (send_len > 0) { + evbuffer_remove(sd->req_body, buf, send_len); + } + + if (evbuffer_get_length(sd->req_body) == 0) { + *data_flags |= NGHTTP2_DATA_FLAG_EOF; + evbuffer_free(sd->req_body); + free(sd); + nghttp2_session_set_stream_user_data(session, stream_id, NULL); + } + + return send_len; +} + +static int on_stream_close_callback(nghttp2_session* session, int32_t stream_id, uint32_t error_code, void* user_data) { + struct stream_data* sd = nghttp2_session_get_stream_user_data(session, stream_id); + if (sd) { + evbuffer_free(sd->req_body); + free(sd); + nghttp2_session_set_stream_user_data(session, stream_id, NULL); + } + return 0; +} + +static int on_header_callback(nghttp2_session* session, const nghttp2_frame* frame, const uint8_t* name, size_t namelen, const uint8_t* value, size_t valuelen, uint8_t flags, void* user_data) { + // We could inspect headers here if needed + return 0; +} + +static int on_begin_headers_callback(nghttp2_session* session, const nghttp2_frame* frame, void* user_data) { + // Only care about request + return 0; +} + +// nghttp2 callbacks +static void setup_nghttp2_callbacks(nghttp2_session_callbacks* callbacks) { + nghttp2_session_callbacks_set_send_callback(callbacks, send_callback); + nghttp2_session_callbacks_set_on_frame_recv_callback(callbacks, on_frame_recv_callback); + nghttp2_session_callbacks_set_on_data_chunk_recv_callback(callbacks, on_data_chunk_recv_callback); + nghttp2_session_callbacks_set_on_stream_close_callback(callbacks, on_stream_close_callback); + nghttp2_session_callbacks_set_on_header_callback(callbacks, on_header_callback); + nghttp2_session_callbacks_set_on_begin_headers_callback(callbacks, on_begin_headers_callback); +} + +// Read from network +static void readcb(struct bufferevent* bev, void* ptr) { + struct ClientSession* client = (struct ClientSession*)ptr; + struct evbuffer* input = bufferevent_get_input(bev); + + size_t datalen = evbuffer_get_length(input); + printf("Server readcb: got %zu bytes\n", datalen); + fflush(stdout); + if (datalen == 0) return; + + unsigned char* data = evbuffer_pullup(input, -1); + + ssize_t readlen = nghttp2_session_mem_recv(client->session, data, datalen); + if (readlen < 0) { + printf("Server: nghttp2_session_mem_recv error: %s\n", nghttp2_strerror((int)readlen)); + fflush(stdout); + bufferevent_free(bev); + return; + } + printf("Server readcb: consumed %zd bytes\n", readlen); + fflush(stdout); + evbuffer_drain(input, readlen); + nghttp2_session_send(client->session); +} + +static void eventcb(struct bufferevent* bev, short events, void* ptr) { + struct ClientSession* client = (struct ClientSession*)ptr; + if (events & BEV_EVENT_ERROR) { + printf("Error from bufferevent\n"); + } + if (events & (BEV_EVENT_EOF | BEV_EVENT_ERROR)) { + nghttp2_session_del(client->session); + bufferevent_free(bev); + free(client); + } +} + +static void acceptcb(struct evconnlistener* listener, evutil_socket_t fd, struct sockaddr* a, int slen, void* p) { + struct app_context* app_ctx = (struct app_context*)p; + struct event_base* base = app_ctx->evbase; + struct bufferevent* bev = bufferevent_socket_new(base, fd, BEV_OPT_CLOSE_ON_FREE); + + struct ClientSession* client = malloc(sizeof(struct ClientSession)); + client->bev = bev; + client->app_ctx = app_ctx; + + nghttp2_session_callbacks* callbacks; + nghttp2_session_callbacks_new(&callbacks); + setup_nghttp2_callbacks(callbacks); + + nghttp2_session_server_new(&client->session, callbacks, client); + nghttp2_session_callbacks_del(callbacks); + + nghttp2_settings_entry iv[1] = { + {NGHTTP2_SETTINGS_MAX_CONCURRENT_STREAMS, 100}}; + nghttp2_submit_settings(client->session, NGHTTP2_FLAG_NONE, iv, 1); + nghttp2_session_send(client->session); + + bufferevent_setcb(bev, readcb, NULL, eventcb, client); + bufferevent_enable(bev, EV_READ | EV_WRITE); +} + +int main(int argc, char** argv) { + struct event_base* base; + struct evconnlistener* listener; + struct sockaddr_in sin; + struct app_context app_ctx; + + base = event_base_new(); + if (!base) { + fprintf(stderr, "Could not initialize libevent!\n"); + return 1; + } + + app_ctx.evbase = base; + + memset(&sin, 0, sizeof(sin)); + sin.sin_family = AF_INET; + sin.sin_addr.s_addr = htonl(0); + sin.sin_port = htons(PORT); + + listener = evconnlistener_new_bind(base, acceptcb, (void*)&app_ctx, + LEV_OPT_CLOSE_ON_FREE | LEV_OPT_REUSEABLE, -1, + (struct sockaddr*)&sin, sizeof(sin)); + if (!listener) { + fprintf(stderr, "Could not create a listener!\n"); + return 1; + } + + printf("Listening on port %d...\n", PORT); + + event_base_dispatch(base); + + evconnlistener_free(listener); + event_base_free(base); + + return 0; +} From d5b7044fa04d8098ff34e64d5b08986c4e1d4792 Mon Sep 17 00:00:00 2001 From: Takeshi Yoshino <4511440+tyoshino@users.noreply.github.com> Date: Wed, 4 Mar 2026 02:16:16 +0000 Subject: [PATCH 2/5] hoge --- http2/.gitignore | 8 +- http2/CMakeLists.txt | 21 ++++-- http2/{client.c => client.cc} | 138 ++++++++++++++++++++++++---------- http2/{server.c => server.cc} | 48 ++++++------ 4 files changed, 147 insertions(+), 68 deletions(-) rename http2/{client.c => client.cc} (56%) rename http2/{server.c => server.cc} (83%) diff --git a/http2/.gitignore b/http2/.gitignore index bb667eb..ee37f9a 100644 --- a/http2/.gitignore +++ b/http2/.gitignore @@ -2,4 +2,10 @@ h2_bench_client h2_echo_server CMakeFiles -CMakeCache.txt \ No newline at end of file +CMakeCache.txt +Makefile + +build +_deps + +*.log \ No newline at end of file diff --git a/http2/CMakeLists.txt b/http2/CMakeLists.txt index 9dccf44..9e45b4c 100644 --- a/http2/CMakeLists.txt +++ b/http2/CMakeLists.txt @@ -1,7 +1,16 @@ cmake_minimum_required(VERSION 3.10) -project(http2_echo_server C) +project(http2_echo_server CXX) -set(CMAKE_C_STANDARD 11) +set(CMAKE_CXX_STANDARD 17) +set(CMAKE_CXX_STANDARD_REQUIRED ON) + +include(FetchContent) +FetchContent_Declare( + absl + GIT_REPOSITORY https://github.com/abseil/abseil-cpp.git + GIT_TAG 20260107.1 +) +FetchContent_MakeAvailable(absl) find_package(PkgConfig REQUIRED) pkg_check_modules(LIBEVENT REQUIRED libevent) @@ -17,8 +26,8 @@ link_directories( ${LIBNGHTTP2_LIBRARY_DIRS} ) -add_executable(h2_echo_server server.c) -target_link_libraries(h2_echo_server ${LIBEVENT_LIBRARIES} ${LIBNGHTTP2_LIBRARIES}) +add_executable(h2_echo_server server.cc) +target_link_libraries(h2_echo_server ${LIBEVENT_LIBRARIES} ${LIBNGHTTP2_LIBRARIES} absl::log absl::log_initialize absl::flags absl::flags_parse "$") -add_executable(h2_bench_client client.c) -target_link_libraries(h2_bench_client ${LIBEVENT_LIBRARIES} ${LIBNGHTTP2_LIBRARIES}) +add_executable(h2_bench_client client.cc) +target_link_libraries(h2_bench_client ${LIBEVENT_LIBRARIES} ${LIBNGHTTP2_LIBRARIES} absl::log absl::log_initialize absl::flags absl::flags_parse "$") diff --git a/http2/client.c b/http2/client.cc similarity index 56% rename from http2/client.c rename to http2/client.cc index 6bed098..567c30a 100644 --- a/http2/client.c +++ b/http2/client.cc @@ -12,12 +12,29 @@ #include #include +#include +#include +#include +#include +#include +#include +#include + +#include "absl/flags/flag.h" +#include "absl/flags/parse.h" +#include "absl/log/flags.h" +#include "absl/log/initialize.h" +#include "absl/log/log.h" + +ABSL_FLAG(std::string, host, "127.0.0.1", "Server host to connect to"); +ABSL_FLAG(int, port, 8080, "Server port to connect to"); + #define MAKE_NV(name, value) \ { \ (uint8_t*)(name), (uint8_t*)(value), strlen(name), strlen(value), \ NGHTTP2_NV_FLAG_NONE} -#define REQUEST_PAYLOAD "Hello, HTTP/2 echo server!" +const std::string REQUEST_PAYLOAD_DATA(1024, 'A'); #define CONCURRENT_REQUESTS 100 struct ClientSession { @@ -26,7 +43,10 @@ struct ClientSession { struct event_base* evbase; int requests_completed; int requests_in_flight; + int total_requests_submitted; struct timeval start_time; + std::map request_start_times; + std::vector latencies; }; static void submit_request(struct ClientSession* client); @@ -41,50 +61,72 @@ static ssize_t send_callback(nghttp2_session* session, const uint8_t* data, size static int on_frame_recv_callback(nghttp2_session* session, const nghttp2_frame* frame, void* user_data) { struct ClientSession* client = (struct ClientSession*)user_data; - printf("Client received frame type %d on stream %d\n", frame->hd.type, frame->hd.stream_id); + + VLOG(2) << "Client received frame type " << static_cast(frame->hd.type) << " on stream " << frame->hd.stream_id; + if (frame->hd.type == NGHTTP2_DATA && (frame->hd.flags & NGHTTP2_FLAG_END_STREAM)) { client->requests_completed++; client->requests_in_flight--; - submit_request(client); // Submit another request to keep pipeline full if (client->requests_completed % 1000 == 0) { struct timeval now; gettimeofday(&now, NULL); double elapsed = (now.tv_sec - client->start_time.tv_sec) + (now.tv_usec - client->start_time.tv_usec) / 1000000.0; - printf("Completed %d requests. RPS: %.2f\n", - client->requests_completed, client->requests_completed / elapsed); + LOG(INFO) << "Completed " << client->requests_completed << " requests. RPS: " + << client->requests_completed / elapsed; + } + + auto it = client->request_start_times.find(frame->hd.stream_id); + if (it != client->request_start_times.end()) { + auto end_time = std::chrono::steady_clock::now(); + double duration = std::chrono::duration(end_time - it->second).count(); + client->latencies.push_back(duration); + client->request_start_times.erase(it); + } + + if (client->requests_completed < 50000) { // Limit total requests for bench + submit_request(client); + } else if (client->requests_in_flight == 0) { + event_base_loopexit(client->evbase, NULL); } } else if (frame->hd.type == NGHTTP2_HEADERS && (frame->hd.flags & NGHTTP2_FLAG_END_STREAM)) { // If server sent end stream on headers (e.g., error without body) - printf("Client received END_STREAM on headers\n"); + LOG(INFO) << "Client received END_STREAM on headers"; } return 0; } static ssize_t data_provider_callback(nghttp2_session* session, int32_t stream_id, uint8_t* buf, size_t length, uint32_t* data_flags, nghttp2_data_source* source, void* user_data) { - int* sent = (int*)source->ptr; - size_t payload_len = strlen(REQUEST_PAYLOAD); + int* bytes_sent = (int*)source->ptr; + size_t payload_len = REQUEST_PAYLOAD_DATA.length(); - if (*sent) { + if (*bytes_sent >= payload_len) { *data_flags |= NGHTTP2_DATA_FLAG_EOF; - free(sent); return 0; } - size_t send_len = payload_len < length ? payload_len : length; - memcpy(buf, REQUEST_PAYLOAD, send_len); + size_t remaining = payload_len - *bytes_sent; + size_t send_len = remaining < length ? remaining : length; + memcpy(buf, REQUEST_PAYLOAD_DATA.data() + *bytes_sent, send_len); + + *bytes_sent += send_len; - if (send_len == payload_len) { + if (*bytes_sent >= payload_len) { *data_flags |= NGHTTP2_DATA_FLAG_EOF; - free(sent); - } else { - *sent = 1; // Simplification: assume we send it all in one go or it's a bug in our tiny benchmark } return send_len; } +static int on_stream_close_callback(nghttp2_session* session, int32_t stream_id, uint32_t error_code, void* user_data) { + int* bytes_sent = (int*)nghttp2_session_get_stream_user_data(session, stream_id); + if (bytes_sent) { + delete bytes_sent; + } + return 0; +} + static void submit_request(struct ClientSession* client) { const nghttp2_nv hdrs[] = { MAKE_NV(":method", "POST"), @@ -93,18 +135,21 @@ static void submit_request(struct ClientSession* client) { MAKE_NV(":authority", "127.0.0.1:8080"), }; - int* sent = malloc(sizeof(int)); - *sent = 0; + int* bytes_sent = new int; + *bytes_sent = 0; nghttp2_data_provider data_prd; - data_prd.source.ptr = sent; + data_prd.source.ptr = bytes_sent; data_prd.read_callback = data_provider_callback; - int32_t stream_id = nghttp2_submit_request(client->session, NULL, hdrs, 4, &data_prd, NULL); + int32_t stream_id = nghttp2_submit_request(client->session, NULL, hdrs, 4, &data_prd, bytes_sent); if (stream_id < 0) { - printf("nghttp2_submit_request error\n"); + LOG(ERROR) << "nghttp2_submit_request error"; + delete bytes_sent; } else { client->requests_in_flight++; + client->total_requests_submitted++; + client->request_start_times[stream_id] = std::chrono::steady_clock::now(); } nghttp2_session_send(client->session); } @@ -112,6 +157,7 @@ static void submit_request(struct ClientSession* client) { static void setup_nghttp2_callbacks(nghttp2_session_callbacks* callbacks) { nghttp2_session_callbacks_set_send_callback(callbacks, send_callback); nghttp2_session_callbacks_set_on_frame_recv_callback(callbacks, on_frame_recv_callback); + nghttp2_session_callbacks_set_on_stream_close_callback(callbacks, on_stream_close_callback); } static void readcb(struct bufferevent* bev, void* ptr) { @@ -119,21 +165,18 @@ static void readcb(struct bufferevent* bev, void* ptr) { struct evbuffer* input = bufferevent_get_input(bev); size_t datalen = evbuffer_get_length(input); - printf("Client readcb: got %zu bytes\n", datalen); - fflush(stdout); + VLOG(2) << "Client readcb: got " << datalen << " bytes"; if (datalen == 0) return; unsigned char* data = evbuffer_pullup(input, -1); ssize_t readlen = nghttp2_session_mem_recv(client->session, data, datalen); if (readlen < 0) { - printf("Client: nghttp2_session_mem_recv error: %s\n", nghttp2_strerror((int)readlen)); - fflush(stdout); + LOG(ERROR) << "Client: nghttp2_session_mem_recv error: " << nghttp2_strerror(static_cast(readlen)); return; } - printf("Client readcb: consumed %zd bytes\n", readlen); - fflush(stdout); + VLOG(2) << "Client readcb: consumed " << readlen << " bytes"; evbuffer_drain(input, readlen); nghttp2_session_send(client->session); @@ -143,7 +186,7 @@ static void eventcb(struct bufferevent* bev, short events, void* ptr) { struct ClientSession* client = (struct ClientSession*)ptr; if (events & BEV_EVENT_CONNECTED) { - printf("Connected to server.\n"); + LOG(INFO) << "Connected to server."; nghttp2_session_callbacks* callbacks; nghttp2_session_callbacks_new(&callbacks); @@ -168,14 +211,22 @@ static void eventcb(struct bufferevent* bev, short events, void* ptr) { } if (events & (BEV_EVENT_EOF | BEV_EVENT_ERROR)) { - printf("Connection closed or error.\n"); + LOG(INFO) << "Connection closed or error."; event_base_loopexit(client->evbase, NULL); } } int main(int argc, char** argv) { - struct ClientSession client; - memset(&client, 0, sizeof(client)); + absl::ParseCommandLine(argc, argv); + + absl::InitializeLog(); + + LOG(INFO) << "Starting HTTP/2 benchmark client..."; + + ClientSession client = {}; + client.requests_completed = 0; + client.requests_in_flight = 0; + client.total_requests_submitted = 0; struct event_base* base = event_base_new(); client.evbase = base; @@ -183,12 +234,8 @@ int main(int argc, char** argv) { struct sockaddr_in sin; memset(&sin, 0, sizeof(sin)); - const char* host = "127.0.0.1"; - int port = 8080; - if (argc >= 3) { - host = argv[1]; - port = atoi(argv[2]); - } + const char* host = absl::GetFlag(FLAGS_host).c_str(); + int port = absl::GetFlag(FLAGS_port); sin.sin_family = AF_INET; sin.sin_addr.s_addr = inet_addr(host); @@ -201,12 +248,27 @@ int main(int argc, char** argv) { bufferevent_enable(bev, EV_READ | EV_WRITE); if (bufferevent_socket_connect(bev, (struct sockaddr*)&sin, sizeof(sin)) < 0) { - printf("Connect failed\n"); + LOG(ERROR) << "Connect failed"; return 1; } event_base_dispatch(base); + if (!client.latencies.empty()) { + double sum = std::accumulate(client.latencies.begin(), client.latencies.end(), 0.0); + double avg = sum / client.latencies.size(); + + double sq_sum = std::inner_product(client.latencies.begin(), client.latencies.end(), client.latencies.begin(), 0.0); + double stdev = std::sqrt(sq_sum / client.latencies.size() - avg * avg); + + LOG(INFO) << "Latency Stats (ms):"; + LOG(INFO) << " Average: " << avg; + LOG(INFO) << " StdDev: " << stdev; + LOG(INFO) << " Min: " << *std::min_element(client.latencies.begin(), client.latencies.end()); + LOG(INFO) << " Max: " << *std::max_element(client.latencies.begin(), client.latencies.end()); + LOG(INFO) << " Samples: " << client.latencies.size(); + } + if (client.session) nghttp2_session_del(client.session); bufferevent_free(bev); event_base_free(base); diff --git a/http2/server.c b/http2/server.cc similarity index 83% rename from http2/server.c rename to http2/server.cc index 348743d..d2ac44f 100644 --- a/http2/server.c +++ b/http2/server.cc @@ -13,6 +13,9 @@ #include #include +#include "absl/log/initialize.h" +#include "absl/log/log.h" + #define MAKE_NV(name, value) \ { \ (uint8_t*)(name), (uint8_t*)(value), strlen(name), strlen(value), \ @@ -50,32 +53,32 @@ static ssize_t echo_data_provider_callback(nghttp2_session* session, int32_t str static int on_frame_recv_callback(nghttp2_session* session, const nghttp2_frame* frame, void* user_data) { struct ClientSession* client = (struct ClientSession*)user_data; - printf("Server received frame type %d\n", frame->hd.type); + LOG(INFO) << "Server received frame type " << static_cast(frame->hd.type); switch (frame->hd.type) { case NGHTTP2_HEADERS: if (frame->headers.cat == NGHTTP2_HCAT_REQUEST) { - struct stream_data* sd = malloc(sizeof(struct stream_data)); + struct stream_data* sd = new stream_data; sd->stream_id = frame->hd.stream_id; sd->req_body = evbuffer_new(); nghttp2_session_set_stream_user_data(session, frame->hd.stream_id, sd); } break; case NGHTTP2_DATA: - printf("Server logic: DATA frame on stream %d, flags %x\n", frame->hd.stream_id, frame->hd.flags); + LOG(INFO) << "Server logic: DATA frame on stream " << frame->hd.stream_id << ", flags " << static_cast(frame->hd.flags); if (frame->hd.flags & NGHTTP2_FLAG_END_STREAM) { - printf("Server logic: END_STREAM seen\n"); + LOG(INFO) << "Server logic: END_STREAM seen"; const nghttp2_nv hdrs[] = { MAKE_NV(":status", "200")}; - struct stream_data* sd = nghttp2_session_get_stream_user_data(session, frame->hd.stream_id); + struct stream_data* sd = (struct stream_data*)nghttp2_session_get_stream_user_data(session, frame->hd.stream_id); if (sd) { nghttp2_data_provider data_prd; data_prd.source.ptr = sd; data_prd.read_callback = echo_data_provider_callback; int rv = nghttp2_submit_response(session, frame->hd.stream_id, hdrs, 1, &data_prd); - printf("nghttp2_submit_response returned %d\n", rv); + LOG(INFO) << "nghttp2_submit_response returned " << rv; nghttp2_session_send(session); // flush to output } else { - printf("Server logic: No stream data found!\n"); + LOG(ERROR) << "Server logic: No stream data found!"; } } break; @@ -84,7 +87,7 @@ static int on_frame_recv_callback(nghttp2_session* session, const nghttp2_frame* } static int on_data_chunk_recv_callback(nghttp2_session* session, uint8_t flags, int32_t stream_id, const uint8_t* data, size_t len, void* user_data) { - struct stream_data* sd = nghttp2_session_get_stream_user_data(session, stream_id); + struct stream_data* sd = (struct stream_data*)nghttp2_session_get_stream_user_data(session, stream_id); if (sd) { evbuffer_add(sd->req_body, data, len); } @@ -104,7 +107,7 @@ static ssize_t echo_data_provider_callback(nghttp2_session* session, int32_t str if (evbuffer_get_length(sd->req_body) == 0) { *data_flags |= NGHTTP2_DATA_FLAG_EOF; evbuffer_free(sd->req_body); - free(sd); + delete sd; nghttp2_session_set_stream_user_data(session, stream_id, NULL); } @@ -112,10 +115,10 @@ static ssize_t echo_data_provider_callback(nghttp2_session* session, int32_t str } static int on_stream_close_callback(nghttp2_session* session, int32_t stream_id, uint32_t error_code, void* user_data) { - struct stream_data* sd = nghttp2_session_get_stream_user_data(session, stream_id); + struct stream_data* sd = (struct stream_data*)nghttp2_session_get_stream_user_data(session, stream_id); if (sd) { evbuffer_free(sd->req_body); - free(sd); + delete sd; nghttp2_session_set_stream_user_data(session, stream_id, NULL); } return 0; @@ -147,21 +150,18 @@ static void readcb(struct bufferevent* bev, void* ptr) { struct evbuffer* input = bufferevent_get_input(bev); size_t datalen = evbuffer_get_length(input); - printf("Server readcb: got %zu bytes\n", datalen); - fflush(stdout); + LOG(INFO) << "Server readcb: got " << datalen << " bytes"; if (datalen == 0) return; unsigned char* data = evbuffer_pullup(input, -1); ssize_t readlen = nghttp2_session_mem_recv(client->session, data, datalen); if (readlen < 0) { - printf("Server: nghttp2_session_mem_recv error: %s\n", nghttp2_strerror((int)readlen)); - fflush(stdout); + LOG(ERROR) << "Server: nghttp2_session_mem_recv error: " << nghttp2_strerror(static_cast(readlen)); bufferevent_free(bev); return; } - printf("Server readcb: consumed %zd bytes\n", readlen); - fflush(stdout); + LOG(INFO) << "Server readcb: consumed " << readlen << " bytes"; evbuffer_drain(input, readlen); nghttp2_session_send(client->session); } @@ -169,12 +169,12 @@ static void readcb(struct bufferevent* bev, void* ptr) { static void eventcb(struct bufferevent* bev, short events, void* ptr) { struct ClientSession* client = (struct ClientSession*)ptr; if (events & BEV_EVENT_ERROR) { - printf("Error from bufferevent\n"); + LOG(ERROR) << "Error from bufferevent"; } if (events & (BEV_EVENT_EOF | BEV_EVENT_ERROR)) { nghttp2_session_del(client->session); bufferevent_free(bev); - free(client); + delete client; } } @@ -183,7 +183,7 @@ static void acceptcb(struct evconnlistener* listener, evutil_socket_t fd, struct struct event_base* base = app_ctx->evbase; struct bufferevent* bev = bufferevent_socket_new(base, fd, BEV_OPT_CLOSE_ON_FREE); - struct ClientSession* client = malloc(sizeof(struct ClientSession)); + struct ClientSession* client = new ClientSession; client->bev = bev; client->app_ctx = app_ctx; @@ -204,6 +204,8 @@ static void acceptcb(struct evconnlistener* listener, evutil_socket_t fd, struct } int main(int argc, char** argv) { + absl::InitializeLog(); + struct event_base* base; struct evconnlistener* listener; struct sockaddr_in sin; @@ -211,7 +213,7 @@ int main(int argc, char** argv) { base = event_base_new(); if (!base) { - fprintf(stderr, "Could not initialize libevent!\n"); + LOG(FATAL) << "Could not initialize libevent!"; return 1; } @@ -226,11 +228,11 @@ int main(int argc, char** argv) { LEV_OPT_CLOSE_ON_FREE | LEV_OPT_REUSEABLE, -1, (struct sockaddr*)&sin, sizeof(sin)); if (!listener) { - fprintf(stderr, "Could not create a listener!\n"); + LOG(FATAL) << "Could not create a listener!"; return 1; } - printf("Listening on port %d...\n", PORT); + LOG(INFO) << "Listening on port " << PORT << "..."; event_base_dispatch(base); From 4e95a212232fba6b9cb8a90ae1fcb8bc22f3aa17 Mon Sep 17 00:00:00 2001 From: Takeshi Yoshino <4511440+tyoshino@users.noreply.github.com> Date: Wed, 4 Mar 2026 23:09:49 +0000 Subject: [PATCH 3/5] fix --- http2/CMakeLists.txt | 71 ++++++++- http2/Makefile | 222 -------------------------- http2/benchmark.py | 70 +++++++++ http2/client.cc | 36 +++-- http2/grpc_client.cc | 142 +++++++++++++++++ http2/grpc_server.cc | 50 ++++++ http2/proto/echo.proto | 15 ++ http2/results.txt | 342 +++++++++++++++++++++++++++++++++++++++++ http2/server.cc | 20 +-- 9 files changed, 721 insertions(+), 247 deletions(-) delete mode 100644 http2/Makefile create mode 100644 http2/benchmark.py create mode 100644 http2/grpc_client.cc create mode 100644 http2/grpc_server.cc create mode 100644 http2/proto/echo.proto create mode 100644 http2/results.txt diff --git a/http2/CMakeLists.txt b/http2/CMakeLists.txt index 9e45b4c..034590b 100644 --- a/http2/CMakeLists.txt +++ b/http2/CMakeLists.txt @@ -1,16 +1,43 @@ -cmake_minimum_required(VERSION 3.10) -project(http2_echo_server CXX) +cmake_minimum_required(VERSION 3.15) +project(http2_echo_server) set(CMAKE_CXX_STANDARD 17) set(CMAKE_CXX_STANDARD_REQUIRED ON) include(FetchContent) + +set(FETCHCONTENT_QUIET OFF) + +# Abseil +set(ABSL_ENABLE_INSTALL OFF CACHE BOOL "" FORCE) +set(ABSL_PROPAGATE_CXX_STD ON) + +# Protobuf +set(protobuf_INSTALL OFF CACHE BOOL "" FORCE) +set(protobuf_BUILD_TESTS OFF CACHE BOOL "Disable protobuf tests" FORCE) +set(protobuf_WITH_ZLIB OFF CACHE BOOL "Disable protobuf zlib" FORCE) + +# gRPC +set(gRPC_ABSL_PROVIDER "module" CACHE STRING "" FORCE) +set(gRPC_CARES_PROVIDER "module" CACHE STRING "" FORCE) +set(gRPC_PROTOBUF_PROVIDER "module" CACHE STRING "" FORCE) +set(gRPC_RE2_PROVIDER "module" CACHE STRING "" FORCE) +set(gRPC_SSL_PROVIDER "module" CACHE STRING "" FORCE) +set(gRPC_ZLIB_PROVIDER "module" CACHE STRING "" FORCE) +set(gRPC_BUILD_HAS_SYSTEMD OFF) + +# To avoid issues with conflicts, we will use Abseil and protobuf from gRPC. FetchContent_Declare( - absl - GIT_REPOSITORY https://github.com/abseil/abseil-cpp.git - GIT_TAG 20260107.1 + grpc + GIT_REPOSITORY https://github.com/grpc/grpc.git + GIT_TAG v1.78.1 + GIT_SHALLOW TRUE ) -FetchContent_MakeAvailable(absl) + +FetchContent_MakeAvailable(grpc) + +# To use the `protobuf_generate` function. +include(${protobuf_SOURCE_DIR}/cmake/protobuf-generate.cmake) find_package(PkgConfig REQUIRED) pkg_check_modules(LIBEVENT REQUIRED libevent) @@ -19,6 +46,7 @@ pkg_check_modules(LIBNGHTTP2 REQUIRED libnghttp2) include_directories( ${LIBEVENT_INCLUDE_DIRS} ${LIBNGHTTP2_INCLUDE_DIRS} + ${CMAKE_CURRENT_BINARY_DIR} ) link_directories( @@ -26,8 +54,39 @@ link_directories( ${LIBNGHTTP2_LIBRARY_DIRS} ) +# Protobuf/gRPC generation + +add_library(echo_proto_lib OBJECT "${CMAKE_CURRENT_LIST_DIR}/proto/echo.proto") + +set(PROTO_BINARY_DIR "${CMAKE_CURRENT_BINARY_DIR}/generated") +set(PROTO_IMPORT_DIRS "${CMAKE_CURRENT_LIST_DIR}/proto") + +protobuf_generate( + TARGET echo_proto_lib + IMPORT_DIRS ${PROTO_IMPORT_DIRS} + PROTOC_OUT_DIR ${PROTO_BINARY_DIR}) + +protobuf_generate( + TARGET echo_proto_lib + LANGUAGE grpc + GENERATE_EXTENSIONS .grpc.pb.h .grpc.pb.cc + PLUGIN "protoc-gen-grpc=\$" + IMPORT_DIRS ${PROTO_IMPORT_DIRS} + PROTOC_OUT_DIR ${PROTO_BINARY_DIR}) + +target_include_directories(echo_proto_lib PUBLIC "$") +target_link_libraries(echo_proto_lib PUBLIC grpc++ libprotobuf) + +# HTTP/2 Benchmarks add_executable(h2_echo_server server.cc) target_link_libraries(h2_echo_server ${LIBEVENT_LIBRARIES} ${LIBNGHTTP2_LIBRARIES} absl::log absl::log_initialize absl::flags absl::flags_parse "$") add_executable(h2_bench_client client.cc) target_link_libraries(h2_bench_client ${LIBEVENT_LIBRARIES} ${LIBNGHTTP2_LIBRARIES} absl::log absl::log_initialize absl::flags absl::flags_parse "$") + +# gRPC Benchmarks +add_executable(grpc_echo_server grpc_server.cc) +target_link_libraries(grpc_echo_server echo_proto_lib absl::log absl::log_initialize absl::flags absl::flags_parse "$") + +add_executable(grpc_bench_client grpc_client.cc) +target_link_libraries(grpc_bench_client echo_proto_lib absl::log absl::log_initialize absl::flags absl::flags_parse "$") diff --git a/http2/Makefile b/http2/Makefile deleted file mode 100644 index 27edb22..0000000 --- a/http2/Makefile +++ /dev/null @@ -1,222 +0,0 @@ -# CMAKE generated file: DO NOT EDIT! -# Generated by "Unix Makefiles" Generator, CMake Version 3.31 - -# Default target executed when no arguments are given to make. -default_target: all -.PHONY : default_target - -# Allow only one "make -f Makefile2" at a time, but pass parallelism. -.NOTPARALLEL: - -#============================================================================= -# Special targets provided by cmake. - -# Disable implicit rules so canonical targets will work. -.SUFFIXES: - -# Disable VCS-based implicit rules. -% : %,v - -# Disable VCS-based implicit rules. -% : RCS/% - -# Disable VCS-based implicit rules. -% : RCS/%,v - -# Disable VCS-based implicit rules. -% : SCCS/s.% - -# Disable VCS-based implicit rules. -% : s.% - -.SUFFIXES: .hpux_make_needs_suffix_list - -# Command-line flag to silence nested $(MAKE). -$(VERBOSE)MAKESILENT = -s - -#Suppress display of executed commands. -$(VERBOSE).SILENT: - -# A target that is always out of date. -cmake_force: -.PHONY : cmake_force - -#============================================================================= -# Set environment variables for the build. - -# The shell in which to execute make rules. -SHELL = /bin/sh - -# The CMake executable. -CMAKE_COMMAND = /usr/bin/cmake - -# The command to remove a file. -RM = /usr/bin/cmake -E rm -f - -# Escaping for special characters. -EQUALS = = - -# The top-level source directory on which CMake was run. -CMAKE_SOURCE_DIR = /home/ysnysnysn/net_http/http2 - -# The top-level build directory on which CMake was run. -CMAKE_BINARY_DIR = /home/ysnysnysn/net_http/http2 - -#============================================================================= -# Targets provided globally by CMake. - -# Special rule for the target edit_cache -edit_cache: - @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --cyan "No interactive CMake dialog available..." - /usr/bin/cmake -E echo No\ interactive\ CMake\ dialog\ available. -.PHONY : edit_cache - -# Special rule for the target edit_cache -edit_cache/fast: edit_cache -.PHONY : edit_cache/fast - -# Special rule for the target rebuild_cache -rebuild_cache: - @$(CMAKE_COMMAND) -E cmake_echo_color "--switch=$(COLOR)" --cyan "Running CMake to regenerate build system..." - /usr/bin/cmake --regenerate-during-build -S$(CMAKE_SOURCE_DIR) -B$(CMAKE_BINARY_DIR) -.PHONY : rebuild_cache - -# Special rule for the target rebuild_cache -rebuild_cache/fast: rebuild_cache -.PHONY : rebuild_cache/fast - -# The main all target -all: cmake_check_build_system - $(CMAKE_COMMAND) -E cmake_progress_start /home/ysnysnysn/net_http/http2/CMakeFiles /home/ysnysnysn/net_http/http2//CMakeFiles/progress.marks - $(MAKE) $(MAKESILENT) -f CMakeFiles/Makefile2 all - $(CMAKE_COMMAND) -E cmake_progress_start /home/ysnysnysn/net_http/http2/CMakeFiles 0 -.PHONY : all - -# The main clean target -clean: - $(MAKE) $(MAKESILENT) -f CMakeFiles/Makefile2 clean -.PHONY : clean - -# The main clean target -clean/fast: clean -.PHONY : clean/fast - -# Prepare targets for installation. -preinstall: all - $(MAKE) $(MAKESILENT) -f CMakeFiles/Makefile2 preinstall -.PHONY : preinstall - -# Prepare targets for installation. -preinstall/fast: - $(MAKE) $(MAKESILENT) -f CMakeFiles/Makefile2 preinstall -.PHONY : preinstall/fast - -# clear depends -depend: - $(CMAKE_COMMAND) -S$(CMAKE_SOURCE_DIR) -B$(CMAKE_BINARY_DIR) --check-build-system CMakeFiles/Makefile.cmake 1 -.PHONY : depend - -#============================================================================= -# Target rules for targets named h2_echo_server - -# Build rule for target. -h2_echo_server: cmake_check_build_system - $(MAKE) $(MAKESILENT) -f CMakeFiles/Makefile2 h2_echo_server -.PHONY : h2_echo_server - -# fast build rule for target. -h2_echo_server/fast: - $(MAKE) $(MAKESILENT) -f CMakeFiles/h2_echo_server.dir/build.make CMakeFiles/h2_echo_server.dir/build -.PHONY : h2_echo_server/fast - -#============================================================================= -# Target rules for targets named h2_bench_client - -# Build rule for target. -h2_bench_client: cmake_check_build_system - $(MAKE) $(MAKESILENT) -f CMakeFiles/Makefile2 h2_bench_client -.PHONY : h2_bench_client - -# fast build rule for target. -h2_bench_client/fast: - $(MAKE) $(MAKESILENT) -f CMakeFiles/h2_bench_client.dir/build.make CMakeFiles/h2_bench_client.dir/build -.PHONY : h2_bench_client/fast - -client.o: client.c.o -.PHONY : client.o - -# target to build an object file -client.c.o: - $(MAKE) $(MAKESILENT) -f CMakeFiles/h2_bench_client.dir/build.make CMakeFiles/h2_bench_client.dir/client.c.o -.PHONY : client.c.o - -client.i: client.c.i -.PHONY : client.i - -# target to preprocess a source file -client.c.i: - $(MAKE) $(MAKESILENT) -f CMakeFiles/h2_bench_client.dir/build.make CMakeFiles/h2_bench_client.dir/client.c.i -.PHONY : client.c.i - -client.s: client.c.s -.PHONY : client.s - -# target to generate assembly for a file -client.c.s: - $(MAKE) $(MAKESILENT) -f CMakeFiles/h2_bench_client.dir/build.make CMakeFiles/h2_bench_client.dir/client.c.s -.PHONY : client.c.s - -server.o: server.c.o -.PHONY : server.o - -# target to build an object file -server.c.o: - $(MAKE) $(MAKESILENT) -f CMakeFiles/h2_echo_server.dir/build.make CMakeFiles/h2_echo_server.dir/server.c.o -.PHONY : server.c.o - -server.i: server.c.i -.PHONY : server.i - -# target to preprocess a source file -server.c.i: - $(MAKE) $(MAKESILENT) -f CMakeFiles/h2_echo_server.dir/build.make CMakeFiles/h2_echo_server.dir/server.c.i -.PHONY : server.c.i - -server.s: server.c.s -.PHONY : server.s - -# target to generate assembly for a file -server.c.s: - $(MAKE) $(MAKESILENT) -f CMakeFiles/h2_echo_server.dir/build.make CMakeFiles/h2_echo_server.dir/server.c.s -.PHONY : server.c.s - -# Help Target -help: - @echo "The following are some of the valid targets for this Makefile:" - @echo "... all (the default if no target is provided)" - @echo "... clean" - @echo "... depend" - @echo "... edit_cache" - @echo "... rebuild_cache" - @echo "... h2_bench_client" - @echo "... h2_echo_server" - @echo "... client.o" - @echo "... client.i" - @echo "... client.s" - @echo "... server.o" - @echo "... server.i" - @echo "... server.s" -.PHONY : help - - - -#============================================================================= -# Special targets to cleanup operation of make. - -# Special rule to run CMake to check the build system integrity. -# No rule that depends on this can have commands that come from listfiles -# because they might be regenerated. -cmake_check_build_system: - $(CMAKE_COMMAND) -S$(CMAKE_SOURCE_DIR) -B$(CMAKE_BINARY_DIR) --check-build-system CMakeFiles/Makefile.cmake 0 -.PHONY : cmake_check_build_system - diff --git a/http2/benchmark.py b/http2/benchmark.py new file mode 100644 index 0000000..52bdc12 --- /dev/null +++ b/http2/benchmark.py @@ -0,0 +1,70 @@ +import subprocess +import time +import os + +TOTAL_DATA_BYTES = 128 * 1024 * 1024 + +PAYLOAD_SIZES = { + "1KiB": 1024, + "128KiB": 131072, + "1MiB": 1048576, +} + +def run_benchmark(): + with open("results.txt", "w") as f: + for name, size in PAYLOAD_SIZES.items(): + num_requests = TOTAL_DATA_BYTES // size + f.write(f"=== Benchmark for {name} payload ({size} bytes), {num_requests} requests ===\n\n") + + f.write("--- Raw HTTP/2 ---\n") + print(f"Running Raw HTTP/2 bench for {name}...") + server_process = subprocess.Popen(["./build/h2_echo_server"]) + time.sleep(1) # wait for server to start + try: + client_output = subprocess.check_output([ + "./build/h2_bench_client", + f"--payload_size={size}", + f"--num_requests={num_requests}", + "--stderrthreshold=0", + ], stderr=subprocess.STDOUT, text=True) + f.write(client_output) + except subprocess.CalledProcessError as e: + f.write(f"Error running raw HTTP/2 client:\n{e.output}\n") + except Exception as e: + f.write(f"Failed to start/run HTTP/2 client: {e}\n") + finally: + server_process.terminate() + server_process.wait() + + f.write("\n") + + f.write("--- gRPC ---\n") + print(f"Running gRPC bench for {name}...") + grpc_server_process = subprocess.Popen(["./build/grpc_echo_server"]) + time.sleep(1) # wait for server to start + try: + grpc_client_output = subprocess.check_output([ + "./build/grpc_bench_client", + f"--payload_size={size}", + f"--num_requests={num_requests}", + "--stderrthreshold=0", + ], stderr=subprocess.STDOUT, text=True) + f.write(grpc_client_output) + except subprocess.CalledProcessError as e: + f.write(f"Error running gRPC client:\n{e.output}\n") + except Exception as e: + f.write(f"Failed to start/run gRPC client: {e}\n") + finally: + grpc_server_process.terminate() + grpc_server_process.wait() + + f.write("\n\n") + +if __name__ == "__main__": + if not os.path.isdir("build"): + print("Error: 'build' directory not found. Please compile the project first.") + exit(1) + + print("Starting benchmarks...") + run_benchmark() + print("Benchmark complete! Results saved to results.txt.") diff --git a/http2/client.cc b/http2/client.cc index 567c30a..3b76495 100644 --- a/http2/client.cc +++ b/http2/client.cc @@ -28,14 +28,17 @@ ABSL_FLAG(std::string, host, "127.0.0.1", "Server host to connect to"); ABSL_FLAG(int, port, 8080, "Server port to connect to"); +ABSL_FLAG(int, num_requests, 5000, "Total number of requests to send"); +ABSL_FLAG(int, payload_size, 1024 * 1024, "Size of the request payload in bytes"); +ABSL_FLAG(int, report_interval, 1000, "Frequency of progress reports"); +ABSL_FLAG(int, concurrent_requests, 100, "Number of concurrent requests"); #define MAKE_NV(name, value) \ { \ (uint8_t*)(name), (uint8_t*)(value), strlen(name), strlen(value), \ NGHTTP2_NV_FLAG_NONE} -const std::string REQUEST_PAYLOAD_DATA(1024, 'A'); -#define CONCURRENT_REQUESTS 100 +std::string request_payload_data; struct ClientSession { struct bufferevent* bev; @@ -68,7 +71,8 @@ static int on_frame_recv_callback(nghttp2_session* session, const nghttp2_frame* client->requests_completed++; client->requests_in_flight--; - if (client->requests_completed % 1000 == 0) { + int report_interval = absl::GetFlag(FLAGS_report_interval); + if (report_interval > 0 && client->requests_completed % report_interval == 0) { struct timeval now; gettimeofday(&now, NULL); double elapsed = (now.tv_sec - client->start_time.tv_sec) + @@ -85,7 +89,7 @@ static int on_frame_recv_callback(nghttp2_session* session, const nghttp2_frame* client->request_start_times.erase(it); } - if (client->requests_completed < 50000) { // Limit total requests for bench + if (client->requests_completed < absl::GetFlag(FLAGS_num_requests)) { // Limit total requests for bench submit_request(client); } else if (client->requests_in_flight == 0) { event_base_loopexit(client->evbase, NULL); @@ -99,7 +103,7 @@ static int on_frame_recv_callback(nghttp2_session* session, const nghttp2_frame* static ssize_t data_provider_callback(nghttp2_session* session, int32_t stream_id, uint8_t* buf, size_t length, uint32_t* data_flags, nghttp2_data_source* source, void* user_data) { int* bytes_sent = (int*)source->ptr; - size_t payload_len = REQUEST_PAYLOAD_DATA.length(); + size_t payload_len = request_payload_data.length(); if (*bytes_sent >= payload_len) { *data_flags |= NGHTTP2_DATA_FLAG_EOF; @@ -108,7 +112,7 @@ static ssize_t data_provider_callback(nghttp2_session* session, int32_t stream_i size_t remaining = payload_len - *bytes_sent; size_t send_len = remaining < length ? remaining : length; - memcpy(buf, REQUEST_PAYLOAD_DATA.data() + *bytes_sent, send_len); + memcpy(buf, request_payload_data.data() + *bytes_sent, send_len); *bytes_sent += send_len; @@ -197,13 +201,15 @@ static void eventcb(struct bufferevent* bev, short events, void* ptr) { nghttp2_session_callbacks_del(callbacks); // Send connection preface and initial settings - nghttp2_settings_entry iv[1] = { - {NGHTTP2_SETTINGS_MAX_CONCURRENT_STREAMS, CONCURRENT_REQUESTS}}; - nghttp2_submit_settings(client->session, NGHTTP2_FLAG_NONE, iv, 1); + nghttp2_settings_entry iv[2] = { + {NGHTTP2_SETTINGS_MAX_CONCURRENT_STREAMS, static_cast(absl::GetFlag(FLAGS_concurrent_requests))}, + {NGHTTP2_SETTINGS_INITIAL_WINDOW_SIZE, 128 * 1024 * 1024}}; + nghttp2_submit_settings(client->session, NGHTTP2_FLAG_NONE, iv, 2); + nghttp2_submit_window_update(client->session, NGHTTP2_FLAG_NONE, 0, 128 * 1024 * 1024); gettimeofday(&client->start_time, NULL); - for (int i = 0; i < CONCURRENT_REQUESTS; i++) { + for (int i = 0; i < absl::GetFlag(FLAGS_concurrent_requests); i++) { submit_request(client); } @@ -221,6 +227,8 @@ int main(int argc, char** argv) { absl::InitializeLog(); + request_payload_data = std::string(absl::GetFlag(FLAGS_payload_size), 'A'); + LOG(INFO) << "Starting HTTP/2 benchmark client..."; ClientSession client = {}; @@ -254,6 +262,14 @@ int main(int argc, char** argv) { event_base_dispatch(base); + struct timeval end_time; + gettimeofday(&end_time, NULL); + double total_elapsed = (end_time.tv_sec - client.start_time.tv_sec) + + (end_time.tv_usec - client.start_time.tv_usec) / 1000000.0; + + LOG(INFO) << "Finished benchmark."; + LOG(INFO) << "Total RPS: " << client.requests_completed / total_elapsed; + if (!client.latencies.empty()) { double sum = std::accumulate(client.latencies.begin(), client.latencies.end(), 0.0); double avg = sum / client.latencies.size(); diff --git a/http2/grpc_client.cc b/http2/grpc_client.cc new file mode 100644 index 0000000..0f4ca43 --- /dev/null +++ b/http2/grpc_client.cc @@ -0,0 +1,142 @@ +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "absl/flags/flag.h" +#include "absl/flags/parse.h" +#include "absl/log/initialize.h" +#include "absl/log/log.h" +#include "echo.grpc.pb.h" + +ABSL_FLAG(std::string, host, "127.0.0.1", "Server host"); +ABSL_FLAG(int, port, 50051, "Server port"); +ABSL_FLAG(int, num_requests, 5000, "Total number of requests to complete"); +ABSL_FLAG(int, payload_size, 1024 * 1024, "Size of the request payload in bytes"); +ABSL_FLAG(int, report_interval, 1000, "Frequency of progress reports"); +ABSL_FLAG(int, concurrent_requests, 100, "Number of concurrent requests"); + +using echo::EchoRequest; +using echo::EchoResponse; +using echo::EchoServer; +using grpc::Channel; +using grpc::ClientAsyncResponseReader; +using grpc::ClientContext; +using grpc::CompletionQueue; +using grpc::Status; + +std::string request_payload_data; + +struct AsyncClientCall { + EchoResponse reply; + ClientContext context; + Status status; + std::unique_ptr> response_reader; + std::chrono::steady_clock::time_point start_time; +}; + +class GrpcBenchClient { + public: + explicit GrpcBenchClient(std::shared_ptr channel) + : stub_(EchoServer::NewStub(channel)) {} + + void Run(int concurrency, int total_requests) { + int requests_submitted = 0; + int requests_completed = 0; + std::vector latencies; + auto start_bench = std::chrono::steady_clock::now(); + + // Warm up/Seed concurrency + for (int i = 0; i < concurrency && requests_submitted < total_requests; i++) { + AsyncEcho(requests_submitted++); + } + + void* got_tag; + bool ok = false; + while (cq_.Next(&got_tag, &ok)) { + AsyncClientCall* call = static_cast(got_tag); + requests_completed++; + + if (ok && call->status.ok()) { + auto end_time = std::chrono::steady_clock::now(); + double duration = std::chrono::duration(end_time - call->start_time).count(); + latencies.push_back(duration); + } else { + LOG(ERROR) << "RPC failed"; + } + + int report_interval = absl::GetFlag(FLAGS_report_interval); + if (report_interval > 0 && requests_completed % report_interval == 0) { + auto now = std::chrono::steady_clock::now(); + double elapsed = std::chrono::duration(now - start_bench).count(); + LOG(INFO) << "Completed " << requests_completed << " requests. RPS: " << requests_completed / elapsed; + } + + delete call; + + if (requests_submitted < total_requests) { + AsyncEcho(requests_submitted++); + } else if (requests_completed == total_requests) { + break; + } + } + + auto end_bench = std::chrono::steady_clock::now(); + double total_elapsed = std::chrono::duration(end_bench - start_bench).count(); + + LOG(INFO) << "Finished benchmark."; + LOG(INFO) << "Total RPS: " << requests_completed / total_elapsed; + + if (!latencies.empty()) { + double sum = std::accumulate(latencies.begin(), latencies.end(), 0.0); + double avg = sum / latencies.size(); + double sq_sum = std::inner_product(latencies.begin(), latencies.end(), latencies.begin(), 0.0); + double stdev = std::sqrt(sq_sum / latencies.size() - avg * avg); + + LOG(INFO) << "Latency Stats (ms):"; + LOG(INFO) << " Average: " << avg; + LOG(INFO) << " StdDev: " << stdev; + LOG(INFO) << " Min: " << *std::min_element(latencies.begin(), latencies.end()); + LOG(INFO) << " Max: " << *std::max_element(latencies.begin(), latencies.end()); + LOG(INFO) << " Samples: " << latencies.size(); + } + } + + private: + void AsyncEcho(int id) { + AsyncClientCall* call = new AsyncClientCall; + call->start_time = std::chrono::steady_clock::now(); + + EchoRequest request; + request.set_data(request_payload_data); + + call->response_reader = stub_->PrepareAsyncEcho(&call->context, request, &cq_); + call->response_reader->StartCall(); + call->response_reader->Finish(&call->reply, &call->status, (void*)call); + } + + std::unique_ptr stub_; + CompletionQueue cq_; +}; + +int main(int argc, char** argv) { + absl::ParseCommandLine(argc, argv); + absl::InitializeLog(); + + std::string target = absl::GetFlag(FLAGS_host) + ":" + std::to_string(absl::GetFlag(FLAGS_port)); + GrpcBenchClient client(grpc::CreateChannel(target, grpc::InsecureChannelCredentials())); + + request_payload_data = std::string(absl::GetFlag(FLAGS_payload_size), 'A'); + + LOG(INFO) << "Starting gRPC benchmark client connecting to " << target; + client.Run(absl::GetFlag(FLAGS_concurrent_requests), absl::GetFlag(FLAGS_num_requests)); + + return 0; +} diff --git a/http2/grpc_server.cc b/http2/grpc_server.cc new file mode 100644 index 0000000..feaccd3 --- /dev/null +++ b/http2/grpc_server.cc @@ -0,0 +1,50 @@ +#include +#include +#include + +#include +#include "echo.grpc.pb.h" + +#include "absl/flags/flag.h" +#include "absl/flags/parse.h" +#include "absl/log/initialize.h" +#include "absl/log/log.h" + +ABSL_FLAG(int, port, 50051, "Port to listen on"); + +using grpc::Server; +using grpc::ServerBuilder; +using grpc::ServerContext; +using grpc::Status; +using echo::EchoRequest; +using echo::EchoResponse; +using echo::EchoServer; + +class EchoServiceImpl final : public EchoServer::Service { + Status Echo(ServerContext* context, const EchoRequest* request, + EchoResponse* response) override { + response->set_data(request->data()); + return Status::OK; + } +}; + +void RunServer(int port) { + std::string server_address("0.0.0.0:" + std::to_string(port)); + EchoServiceImpl service; + + ServerBuilder builder; + builder.AddListeningPort(server_address, grpc::InsecureServerCredentials()); + builder.RegisterService(&service); + std::unique_ptr server(builder.BuildAndStart()); + LOG(INFO) << "gRPC Echo Server listening on " << server_address; + server->Wait(); +} + +int main(int argc, char** argv) { + absl::ParseCommandLine(argc, argv); + absl::InitializeLog(); + + RunServer(absl::GetFlag(FLAGS_port)); + + return 0; +} diff --git a/http2/proto/echo.proto b/http2/proto/echo.proto new file mode 100644 index 0000000..e452376 --- /dev/null +++ b/http2/proto/echo.proto @@ -0,0 +1,15 @@ +syntax = "proto3"; + +package echo; + +service EchoServer { + rpc Echo(EchoRequest) returns (EchoResponse); +} + +message EchoRequest { + bytes data = 1; +} + +message EchoResponse { + bytes data = 1; +} diff --git a/http2/results.txt b/http2/results.txt new file mode 100644 index 0000000..f593901 --- /dev/null +++ b/http2/results.txt @@ -0,0 +1,342 @@ +=== Benchmark for 1KiB payload (1024 bytes), 131072 requests === + +--- Raw HTTP/2 --- +I0304 23:07:31.630222 667691 client.cc:232] Starting HTTP/2 benchmark client... +I0304 23:07:31.630441 667691 client.cc:193] Connected to server. +I0304 23:07:31.641636 667691 client.cc:80] Completed 1000 requests. RPS: 89839.2 +I0304 23:07:31.652396 667691 client.cc:80] Completed 2000 requests. RPS: 91361.7 +I0304 23:07:31.663099 667691 client.cc:80] Completed 3000 requests. RPS: 92041.5 +I0304 23:07:31.673957 667691 client.cc:80] Completed 4000 requests. RPS: 92055.6 +I0304 23:07:31.684318 667691 client.cc:80] Completed 5000 requests. RPS: 92912.6 +I0304 23:07:31.742711 667691 client.cc:80] Completed 6000 requests. RPS: 53473.1 +I0304 23:07:31.757169 667691 client.cc:80] Completed 7000 requests. RPS: 55264.3 +I0304 23:07:31.770137 667691 client.cc:80] Completed 8000 requests. RPS: 57293.5 +I0304 23:07:31.781884 667691 client.cc:80] Completed 9000 requests. RPS: 59453.4 +I0304 23:07:31.792564 667691 client.cc:80] Completed 10000 requests. RPS: 61705.9 +I0304 23:07:31.803119 667691 client.cc:80] Completed 11000 requests. RPS: 63726 +I0304 23:07:31.813764 667691 client.cc:80] Completed 12000 requests. RPS: 65481.1 +I0304 23:07:31.824275 667691 client.cc:80] Completed 13000 requests. RPS: 67089.8 +I0304 23:07:31.835100 667691 client.cc:80] Completed 14000 requests. RPS: 68428.2 +I0304 23:07:31.846390 667691 client.cc:80] Completed 15000 requests. RPS: 69481.4 +I0304 23:07:31.860161 667691 client.cc:80] Completed 16000 requests. RPS: 69669.4 +I0304 23:07:31.871403 667691 client.cc:80] Completed 17000 requests. RPS: 70569.6 +I0304 23:07:31.882367 667691 client.cc:80] Completed 18000 requests. RPS: 71467.7 +I0304 23:07:31.892463 667691 client.cc:80] Completed 19000 requests. RPS: 72530.7 +I0304 23:07:31.902932 667691 client.cc:80] Completed 20000 requests. RPS: 73414.2 +I0304 23:07:31.913294 667691 client.cc:80] Completed 21000 requests. RPS: 74260.3 +I0304 23:07:31.923325 667691 client.cc:80] Completed 22000 requests. RPS: 75131.5 +I0304 23:07:31.933994 667691 client.cc:80] Completed 23000 requests. RPS: 75785.3 +I0304 23:07:31.944703 667691 client.cc:80] Completed 24000 requests. RPS: 76385 +I0304 23:07:31.955531 667691 client.cc:80] Completed 25000 requests. RPS: 76916.9 +I0304 23:07:31.966201 667691 client.cc:80] Completed 26000 requests. RPS: 77451 +I0304 23:07:31.975323 667691 client.cc:80] Completed 27000 requests. RPS: 78302.2 +I0304 23:07:31.986282 667691 client.cc:80] Completed 28000 requests. RPS: 78701 +I0304 23:07:31.996856 667691 client.cc:80] Completed 29000 requests. RPS: 79159.1 +I0304 23:07:32.007565 667691 client.cc:80] Completed 30000 requests. RPS: 79563.1 +I0304 23:07:32.017819 667691 client.cc:80] Completed 31000 requests. RPS: 80038.4 +I0304 23:07:32.028279 667691 client.cc:80] Completed 32000 requests. RPS: 80447.9 +I0304 23:07:32.039044 667691 client.cc:80] Completed 33000 requests. RPS: 80775.6 +I0304 23:07:32.049690 667691 client.cc:80] Completed 34000 requests. RPS: 81109.8 +I0304 23:07:32.060586 667691 client.cc:80] Completed 35000 requests. RPS: 81380 +I0304 23:07:32.072105 667691 client.cc:80] Completed 36000 requests. RPS: 81521.7 +I0304 23:07:32.083564 667691 client.cc:80] Completed 37000 requests. RPS: 81667.1 +I0304 23:07:32.093292 667691 client.cc:80] Completed 38000 requests. RPS: 82111.2 +I0304 23:07:32.103533 667691 client.cc:80] Completed 39000 requests. RPS: 82447.4 +I0304 23:07:32.114522 667691 client.cc:80] Completed 40000 requests. RPS: 82641.7 +I0304 23:07:32.125329 667691 client.cc:80] Completed 41000 requests. RPS: 82857.7 +I0304 23:07:32.137327 667691 client.cc:80] Completed 42000 requests. RPS: 82869.3 +I0304 23:07:32.147627 667691 client.cc:80] Completed 43000 requests. RPS: 83152.5 +I0304 23:07:32.158657 667691 client.cc:80] Completed 44000 requests. RPS: 83309.5 +I0304 23:07:32.169122 667691 client.cc:80] Completed 45000 requests. RPS: 83547.3 +I0304 23:07:32.180805 667691 client.cc:80] Completed 46000 requests. RPS: 83590.8 +I0304 23:07:32.196706 667691 client.cc:80] Completed 47000 requests. RPS: 83009.2 +I0304 23:07:32.212370 667691 client.cc:80] Completed 48000 requests. RPS: 82493.4 +I0304 23:07:32.231072 667691 client.cc:80] Completed 49000 requests. RPS: 81589.7 +I0304 23:07:32.249891 667691 client.cc:80] Completed 50000 requests. RPS: 80725.2 +I0304 23:07:32.265070 667691 client.cc:80] Completed 51000 requests. RPS: 80370.1 +I0304 23:07:32.281121 667691 client.cc:80] Completed 52000 requests. RPS: 79924.3 +I0304 23:07:32.296718 667691 client.cc:80] Completed 53000 requests. RPS: 79554.1 +I0304 23:07:32.313345 667691 client.cc:80] Completed 54000 requests. RPS: 79081.5 +I0304 23:07:32.328728 667691 client.cc:80] Completed 55000 requests. RPS: 78771.4 +I0304 23:07:32.343118 667691 client.cc:80] Completed 56000 requests. RPS: 78584 +I0304 23:07:32.357046 667691 client.cc:80] Completed 57000 requests. RPS: 78453.9 +I0304 23:07:32.375396 667691 client.cc:80] Completed 58000 requests. RPS: 77863.7 +I0304 23:07:32.391062 667691 client.cc:80] Completed 59000 requests. RPS: 77574.7 +I0304 23:07:32.402106 667691 client.cc:80] Completed 60000 requests. RPS: 77760.4 +I0304 23:07:32.415283 667691 client.cc:80] Completed 61000 requests. RPS: 77728.9 +I0304 23:07:32.430409 667691 client.cc:80] Completed 62000 requests. RPS: 77509.3 +I0304 23:07:32.446591 667691 client.cc:80] Completed 63000 requests. RPS: 77197.7 +I0304 23:07:32.464049 667691 client.cc:80] Completed 64000 requests. RPS: 76780.6 +I0304 23:07:32.481754 667691 client.cc:80] Completed 65000 requests. RPS: 76358.4 +I0304 23:07:32.502107 667691 client.cc:80] Completed 66000 requests. RPS: 75722.6 +I0304 23:07:32.518280 667691 client.cc:80] Completed 67000 requests. RPS: 75469.6 +I0304 23:07:32.531422 667691 client.cc:80] Completed 68000 requests. RPS: 75478.7 +I0304 23:07:32.542076 667691 client.cc:80] Completed 69000 requests. RPS: 75693.5 +I0304 23:07:32.552728 667691 client.cc:80] Completed 70000 requests. RPS: 75903.6 +I0304 23:07:32.563335 667691 client.cc:80] Completed 71000 requests. RPS: 76112.5 +I0304 23:07:32.573918 667691 client.cc:80] Completed 72000 requests. RPS: 76318.7 +I0304 23:07:32.584070 667691 client.cc:80] Completed 73000 requests. RPS: 76554.8 +I0304 23:07:32.594665 667691 client.cc:80] Completed 74000 requests. RPS: 76750.7 +I0304 23:07:32.604918 667691 client.cc:80] Completed 75000 requests. RPS: 76969.4 +I0304 23:07:32.618271 667691 client.cc:80] Completed 76000 requests. RPS: 76941.3 +I0304 23:07:32.630072 667691 client.cc:80] Completed 77000 requests. RPS: 77033.4 +I0304 23:07:32.640643 667691 client.cc:80] Completed 78000 requests. RPS: 77217.1 +I0304 23:07:32.651414 667691 client.cc:80] Completed 79000 requests. RPS: 77382 +I0304 23:07:32.662529 667691 client.cc:80] Completed 80000 requests. RPS: 77517.6 +I0304 23:07:32.672832 667691 client.cc:80] Completed 81000 requests. RPS: 77710.7 +I0304 23:07:32.683629 667691 client.cc:80] Completed 82000 requests. RPS: 77863.6 +I0304 23:07:32.694551 667691 client.cc:80] Completed 83000 requests. RPS: 78004.1 +I0304 23:07:32.705737 667691 client.cc:80] Completed 84000 requests. RPS: 78122.7 +I0304 23:07:32.715848 667691 client.cc:80] Completed 85000 requests. RPS: 78316.3 +I0304 23:07:32.727226 667691 client.cc:80] Completed 86000 requests. RPS: 78415.6 +I0304 23:07:32.737672 667691 client.cc:80] Completed 87000 requests. RPS: 78578.9 +I0304 23:07:32.752378 667691 client.cc:80] Completed 88000 requests. RPS: 78440.3 +I0304 23:07:32.766345 667691 client.cc:80] Completed 89000 requests. RPS: 78356.1 +I0304 23:07:32.781565 667691 client.cc:80] Completed 90000 requests. RPS: 78188.9 +I0304 23:07:32.794316 667691 client.cc:80] Completed 91000 requests. RPS: 78191.4 +I0304 23:07:32.804837 667691 client.cc:80] Completed 92000 requests. RPS: 78342.4 +I0304 23:07:32.815776 667691 client.cc:80] Completed 93000 requests. RPS: 78463.1 +I0304 23:07:32.826522 667691 client.cc:80] Completed 94000 requests. RPS: 78594.2 +I0304 23:07:32.837720 667691 client.cc:80] Completed 95000 requests. RPS: 78693.5 +I0304 23:07:32.848456 667691 client.cc:80] Completed 96000 requests. RPS: 78820.9 +I0304 23:07:32.859484 667691 client.cc:80] Completed 97000 requests. RPS: 78927.3 +I0304 23:07:32.870378 667691 client.cc:80] Completed 98000 requests. RPS: 79040.4 +I0304 23:07:32.881089 667691 client.cc:80] Completed 99000 requests. RPS: 79163 +I0304 23:07:32.891588 667691 client.cc:80] Completed 100000 requests. RPS: 79296.9 +I0304 23:07:32.901980 667691 client.cc:80] Completed 101000 requests. RPS: 79435.3 +I0304 23:07:32.912543 667691 client.cc:80] Completed 102000 requests. RPS: 79560.8 +I0304 23:07:32.923144 667691 client.cc:80] Completed 103000 requests. RPS: 79682 +I0304 23:07:32.933672 667691 client.cc:80] Completed 104000 requests. RPS: 79805.6 +I0304 23:07:32.944107 667691 client.cc:80] Completed 105000 requests. RPS: 79932.9 +I0304 23:07:32.954852 667691 client.cc:80] Completed 106000 requests. RPS: 80039.4 +I0304 23:07:32.965278 667691 client.cc:80] Completed 107000 requests. RPS: 80163.5 +I0304 23:07:32.975228 667691 client.cc:80] Completed 108000 requests. RPS: 80313.9 +I0304 23:07:32.985895 667691 client.cc:80] Completed 109000 requests. RPS: 80419.7 +I0304 23:07:32.995696 667691 client.cc:80] Completed 110000 requests. RPS: 80574.8 +I0304 23:07:33.006598 667691 client.cc:80] Completed 111000 requests. RPS: 80663.2 +I0304 23:07:33.016797 667691 client.cc:80] Completed 112000 requests. RPS: 80791.1 +I0304 23:07:33.027461 667691 client.cc:80] Completed 113000 requests. RPS: 80890.2 +I0304 23:07:33.037453 667691 client.cc:80] Completed 114000 requests. RPS: 81026.4 +I0304 23:07:33.047933 667691 client.cc:80] Completed 115000 requests. RPS: 81132.9 +I0304 23:07:33.058532 667691 client.cc:80] Completed 116000 requests. RPS: 81231 +I0304 23:07:33.069538 667691 client.cc:80] Completed 117000 requests. RPS: 81304.6 +I0304 23:07:33.080295 667691 client.cc:80] Completed 118000 requests. RPS: 81391.2 +I0304 23:07:33.094522 667691 client.cc:80] Completed 119000 requests. RPS: 81283.2 +I0304 23:07:33.108479 667691 client.cc:80] Completed 120000 requests. RPS: 81192.3 +I0304 23:07:33.119314 667691 client.cc:80] Completed 121000 requests. RPS: 81273.1 +I0304 23:07:33.131857 667691 client.cc:80] Completed 122000 requests. RPS: 81260.1 +I0304 23:07:33.142385 667691 client.cc:80] Completed 123000 requests. RPS: 81355.7 +I0304 23:07:33.152501 667691 client.cc:80] Completed 124000 requests. RPS: 81472 +I0304 23:07:33.167888 667691 client.cc:80] Completed 125000 requests. RPS: 81307 +I0304 23:07:33.179734 667691 client.cc:80] Completed 126000 requests. RPS: 81330.8 +I0304 23:07:33.190778 667691 client.cc:80] Completed 127000 requests. RPS: 81396 +I0304 23:07:33.201050 667691 client.cc:80] Completed 128000 requests. RPS: 81500.4 +I0304 23:07:33.211751 667691 client.cc:80] Completed 129000 requests. RPS: 81581.2 +I0304 23:07:33.222787 667691 client.cc:80] Completed 130000 requests. RPS: 81643.9 +I0304 23:07:33.233321 667691 client.cc:80] Completed 131000 requests. RPS: 81731.2 +I0304 23:07:33.235277 667691 client.cc:270] Finished benchmark. +I0304 23:07:33.235303 667691 client.cc:271] Total RPS: 81738.1 +I0304 23:07:33.237597 667691 client.cc:280] Latency Stats (ms): +I0304 23:07:33.237616 667691 client.cc:281] Average: 1.22245 +I0304 23:07:33.237629 667691 client.cc:282] StdDev: 1.24862 +I0304 23:07:33.237642 667691 client.cc:283] Min: 0.39262 +I0304 23:07:33.239020 667691 client.cc:284] Max: 44.3385 +I0304 23:07:33.240416 667691 client.cc:285] Samples: 131171 + +--- gRPC --- +I0304 23:07:34.250352 667737 grpc_client.cc:138] Starting gRPC benchmark client connecting to 127.0.0.1:50051 +I0304 23:07:35.202939 667737 grpc_client.cc:79] Completed 1000 requests. RPS: 1049.84 +I0304 23:07:35.876758 667737 grpc_client.cc:79] Completed 2000 requests. RPS: 1229.75 +I0304 23:07:36.526937 667737 grpc_client.cc:79] Completed 3000 requests. RPS: 1317.8 +I0304 23:07:37.328684 667737 grpc_client.cc:79] Completed 4000 requests. RPS: 1299.43 +I0304 23:07:38.046229 667737 grpc_client.cc:79] Completed 5000 requests. RPS: 1317.24 +I0304 23:07:38.710680 667737 grpc_client.cc:79] Completed 6000 requests. RPS: 1345.21 +I0304 23:07:39.452755 667737 grpc_client.cc:79] Completed 7000 requests. RPS: 1345.55 +I0304 23:07:40.097255 667737 grpc_client.cc:79] Completed 8000 requests. RPS: 1368.26 +I0304 23:07:40.719035 667737 grpc_client.cc:79] Completed 9000 requests. RPS: 1391.33 +I0304 23:07:41.513083 667737 grpc_client.cc:79] Completed 10000 requests. RPS: 1376.9 +I0304 23:07:42.175608 667737 grpc_client.cc:79] Completed 11000 requests. RPS: 1387.98 +I0304 23:07:42.812219 667737 grpc_client.cc:79] Completed 12000 requests. RPS: 1401.57 +I0304 23:07:43.459427 667737 grpc_client.cc:79] Completed 13000 requests. RPS: 1411.66 +I0304 23:07:44.328171 667737 grpc_client.cc:79] Completed 14000 requests. RPS: 1389.2 +I0304 23:07:44.973639 667737 grpc_client.cc:79] Completed 15000 requests. RPS: 1398.83 +I0304 23:07:45.647511 667737 grpc_client.cc:79] Completed 16000 requests. RPS: 1403.87 +I0304 23:07:46.446071 667737 grpc_client.cc:79] Completed 17000 requests. RPS: 1393.94 +I0304 23:07:47.093907 667737 grpc_client.cc:79] Completed 18000 requests. RPS: 1401.49 +I0304 23:07:47.752782 667737 grpc_client.cc:79] Completed 19000 requests. RPS: 1407.16 +I0304 23:07:48.540169 667737 grpc_client.cc:79] Completed 20000 requests. RPS: 1399.6 +I0304 23:07:49.193279 667737 grpc_client.cc:79] Completed 21000 requests. RPS: 1405.35 +I0304 23:07:49.839413 667737 grpc_client.cc:79] Completed 22000 requests. RPS: 1411.25 +I0304 23:07:50.616201 667737 grpc_client.cc:79] Completed 23000 requests. RPS: 1405.37 +I0304 23:07:51.252940 667737 grpc_client.cc:79] Completed 24000 requests. RPS: 1411.55 +I0304 23:07:51.954539 667737 grpc_client.cc:79] Completed 25000 requests. RPS: 1412.1 +I0304 23:07:52.854834 667737 grpc_client.cc:79] Completed 26000 requests. RPS: 1397.52 +I0304 23:07:53.504959 667737 grpc_client.cc:79] Completed 27000 requests. RPS: 1402.27 +I0304 23:07:54.120568 667737 grpc_client.cc:79] Completed 28000 requests. RPS: 1409.15 +I0304 23:07:54.825343 667737 grpc_client.cc:79] Completed 29000 requests. RPS: 1409.48 +I0304 23:07:55.662921 667737 grpc_client.cc:79] Completed 30000 requests. RPS: 1401.05 +I0304 23:07:56.304239 667737 grpc_client.cc:79] Completed 31000 requests. RPS: 1405.65 +I0304 23:07:57.005467 667737 grpc_client.cc:79] Completed 32000 requests. RPS: 1406.28 +I0304 23:07:57.720517 667737 grpc_client.cc:79] Completed 33000 requests. RPS: 1406.04 +I0304 23:07:58.367471 667737 grpc_client.cc:79] Completed 34000 requests. RPS: 1409.79 +I0304 23:07:59.068381 667737 grpc_client.cc:79] Completed 35000 requests. RPS: 1410.27 +I0304 23:07:59.768737 667737 grpc_client.cc:79] Completed 36000 requests. RPS: 1410.75 +I0304 23:08:00.389417 667737 grpc_client.cc:79] Completed 37000 requests. RPS: 1415.51 +I0304 23:08:01.104789 667737 grpc_client.cc:79] Completed 38000 requests. RPS: 1415.04 +I0304 23:08:01.803486 667737 grpc_client.cc:79] Completed 39000 requests. RPS: 1415.45 +I0304 23:08:02.435291 667737 grpc_client.cc:79] Completed 40000 requests. RPS: 1419.2 +I0304 23:08:03.125524 667737 grpc_client.cc:79] Completed 41000 requests. RPS: 1419.91 +I0304 23:08:03.879788 667737 grpc_client.cc:79] Completed 42000 requests. RPS: 1417.51 +I0304 23:08:04.636322 667737 grpc_client.cc:79] Completed 43000 requests. RPS: 1415.13 +I0304 23:08:05.272142 667737 grpc_client.cc:79] Completed 44000 requests. RPS: 1418.36 +I0304 23:08:06.051901 667737 grpc_client.cc:79] Completed 45000 requests. RPS: 1415.03 +I0304 23:08:06.663394 667737 grpc_client.cc:79] Completed 46000 requests. RPS: 1419.18 +I0304 23:08:07.304379 667737 grpc_client.cc:79] Completed 47000 requests. RPS: 1421.92 +I0304 23:08:08.011028 667737 grpc_client.cc:79] Completed 48000 requests. RPS: 1421.77 +I0304 23:08:08.697559 667737 grpc_client.cc:79] Completed 49000 requests. RPS: 1422.47 +I0304 23:08:09.333567 667737 grpc_client.cc:79] Completed 50000 requests. RPS: 1425.19 +I0304 23:08:10.013917 667737 grpc_client.cc:79] Completed 51000 requests. RPS: 1426.03 +I0304 23:08:10.677106 667737 grpc_client.cc:79] Completed 52000 requests. RPS: 1427.52 +I0304 23:08:11.316212 667737 grpc_client.cc:79] Completed 53000 requests. RPS: 1429.89 +I0304 23:08:12.100242 667737 grpc_client.cc:79] Completed 54000 requests. RPS: 1426.69 +I0304 23:08:12.778315 667737 grpc_client.cc:79] Completed 55000 requests. RPS: 1427.54 +I0304 23:08:13.433796 667737 grpc_client.cc:79] Completed 56000 requests. RPS: 1429.18 +I0304 23:08:14.135368 667737 grpc_client.cc:79] Completed 57000 requests. RPS: 1429.11 +I0304 23:08:15.026987 667737 grpc_client.cc:79] Completed 58000 requests. RPS: 1422.39 +I0304 23:08:15.722337 667737 grpc_client.cc:79] Completed 59000 requests. RPS: 1422.65 +I0304 23:08:16.358392 667737 grpc_client.cc:79] Completed 60000 requests. RPS: 1424.91 +I0304 23:08:17.090471 667737 grpc_client.cc:79] Completed 61000 requests. RPS: 1423.9 +I0304 23:08:17.767442 667737 grpc_client.cc:79] Completed 62000 requests. RPS: 1424.73 +I0304 23:08:18.392541 667737 grpc_client.cc:79] Completed 63000 requests. RPS: 1427.21 +I0304 23:08:19.149457 667737 grpc_client.cc:79] Completed 64000 requests. RPS: 1425.42 +I0304 23:08:19.803117 667737 grpc_client.cc:79] Completed 65000 requests. RPS: 1426.92 +I0304 23:08:20.454220 667737 grpc_client.cc:79] Completed 66000 requests. RPS: 1428.45 +I0304 23:08:21.148702 667737 grpc_client.cc:79] Completed 67000 requests. RPS: 1428.62 +I0304 23:08:21.793122 667737 grpc_client.cc:79] Completed 68000 requests. RPS: 1430.29 +I0304 23:08:22.434554 667737 grpc_client.cc:79] Completed 69000 requests. RPS: 1432.01 +I0304 23:08:23.107526 667737 grpc_client.cc:79] Completed 70000 requests. RPS: 1432.75 +I0304 23:08:23.797159 667737 grpc_client.cc:79] Completed 71000 requests. RPS: 1432.99 +I0304 23:08:24.452724 667737 grpc_client.cc:79] Completed 72000 requests. RPS: 1434.2 +I0304 23:08:25.128332 667737 grpc_client.cc:79] Completed 73000 requests. RPS: 1434.81 +I0304 23:08:26.100596 667737 grpc_client.cc:79] Completed 74000 requests. RPS: 1427.19 +I0304 23:08:26.722591 667737 grpc_client.cc:79] Completed 75000 requests. RPS: 1429.33 +I0304 23:08:27.360895 667737 grpc_client.cc:79] Completed 76000 requests. RPS: 1430.98 +I0304 23:08:28.134244 667737 grpc_client.cc:79] Completed 77000 requests. RPS: 1429 +I0304 23:08:28.790277 667737 grpc_client.cc:79] Completed 78000 requests. RPS: 1430.15 +I0304 23:08:29.428883 667737 grpc_client.cc:79] Completed 79000 requests. RPS: 1431.72 +I0304 23:08:30.177049 667737 grpc_client.cc:79] Completed 80000 requests. RPS: 1430.45 +I0304 23:08:30.804466 667737 grpc_client.cc:79] Completed 81000 requests. RPS: 1432.26 +I0304 23:08:31.467579 667737 grpc_client.cc:79] Completed 82000 requests. RPS: 1433.14 +I0304 23:08:32.192100 667737 grpc_client.cc:79] Completed 83000 requests. RPS: 1432.47 +I0304 23:08:32.871613 667737 grpc_client.cc:79] Completed 84000 requests. RPS: 1432.93 +I0304 23:08:33.519821 667737 grpc_client.cc:79] Completed 85000 requests. RPS: 1434.13 +I0304 23:08:34.197341 667737 grpc_client.cc:79] Completed 86000 requests. RPS: 1434.6 +I0304 23:08:34.900917 667737 grpc_client.cc:79] Completed 87000 requests. RPS: 1434.45 +I0304 23:08:35.541115 667737 grpc_client.cc:79] Completed 88000 requests. RPS: 1435.78 +I0304 23:08:36.380994 667737 grpc_client.cc:79] Completed 89000 requests. RPS: 1432.47 +I0304 23:08:37.233217 667737 grpc_client.cc:79] Completed 90000 requests. RPS: 1428.96 +I0304 23:08:37.901217 667737 grpc_client.cc:79] Completed 91000 requests. RPS: 1429.68 +I0304 23:08:38.541196 667737 grpc_client.cc:79] Completed 92000 requests. RPS: 1431 +I0304 23:08:39.397644 667737 grpc_client.cc:79] Completed 93000 requests. RPS: 1427.54 +I0304 23:08:40.224556 667737 grpc_client.cc:79] Completed 94000 requests. RPS: 1424.8 +I0304 23:08:40.929085 667737 grpc_client.cc:79] Completed 95000 requests. RPS: 1424.74 +I0304 23:08:41.631023 667737 grpc_client.cc:79] Completed 96000 requests. RPS: 1424.74 +I0304 23:08:42.239745 667737 grpc_client.cc:79] Completed 97000 requests. RPS: 1426.69 +I0304 23:08:42.897142 667737 grpc_client.cc:79] Completed 98000 requests. RPS: 1427.6 +I0304 23:08:43.655720 667737 grpc_client.cc:79] Completed 99000 requests. RPS: 1426.4 +I0304 23:08:44.266496 667737 grpc_client.cc:79] Completed 100000 requests. RPS: 1428.24 +I0304 23:08:44.902970 667737 grpc_client.cc:79] Completed 101000 requests. RPS: 1429.53 +I0304 23:08:45.638381 667737 grpc_client.cc:79] Completed 102000 requests. RPS: 1428.81 +I0304 23:08:46.518213 667737 grpc_client.cc:79] Completed 103000 requests. RPS: 1425.25 +I0304 23:08:47.591785 667737 grpc_client.cc:79] Completed 104000 requests. RPS: 1418.03 +I0304 23:08:48.673178 667737 grpc_client.cc:79] Completed 105000 requests. RPS: 1410.86 +I0304 23:08:49.377706 667737 grpc_client.cc:79] Completed 106000 requests. RPS: 1410.94 +I0304 23:08:50.151447 667737 grpc_client.cc:79] Completed 107000 requests. RPS: 1409.73 +I0304 23:08:50.800095 667737 grpc_client.cc:79] Completed 108000 requests. RPS: 1410.85 +I0304 23:08:51.422334 667737 grpc_client.cc:79] Completed 109000 requests. RPS: 1412.43 +I0304 23:08:52.132030 667737 grpc_client.cc:79] Completed 110000 requests. RPS: 1412.4 +I0304 23:08:52.798607 667737 grpc_client.cc:79] Completed 111000 requests. RPS: 1413.15 +I0304 23:08:53.462203 667737 grpc_client.cc:79] Completed 112000 requests. RPS: 1413.93 +I0304 23:08:54.143149 667737 grpc_client.cc:79] Completed 113000 requests. RPS: 1414.4 +I0304 23:08:54.829747 667737 grpc_client.cc:79] Completed 114000 requests. RPS: 1414.75 +I0304 23:08:55.478785 667737 grpc_client.cc:79] Completed 115000 requests. RPS: 1415.76 +I0304 23:08:56.205015 667737 grpc_client.cc:79] Completed 116000 requests. RPS: 1415.42 +I0304 23:08:56.903509 667737 grpc_client.cc:79] Completed 117000 requests. RPS: 1415.55 +I0304 23:08:57.531544 667737 grpc_client.cc:79] Completed 118000 requests. RPS: 1416.89 +I0304 23:08:58.357008 667737 grpc_client.cc:79] Completed 119000 requests. RPS: 1414.87 +I0304 23:08:59.077845 667737 grpc_client.cc:79] Completed 120000 requests. RPS: 1414.64 +I0304 23:08:59.890843 667737 grpc_client.cc:79] Completed 121000 requests. RPS: 1412.88 +I0304 23:09:00.764171 667737 grpc_client.cc:79] Completed 122000 requests. RPS: 1410.18 +I0304 23:09:01.824526 667737 grpc_client.cc:79] Completed 123000 requests. RPS: 1404.52 +I0304 23:09:03.181870 667737 grpc_client.cc:79] Completed 124000 requests. RPS: 1394.33 +I0304 23:09:04.004467 667737 grpc_client.cc:79] Completed 125000 requests. RPS: 1392.69 +I0304 23:09:04.896066 667737 grpc_client.cc:79] Completed 126000 requests. RPS: 1390.03 +I0304 23:09:05.589202 667737 grpc_client.cc:79] Completed 127000 requests. RPS: 1390.43 +I0304 23:09:06.256667 667737 grpc_client.cc:79] Completed 128000 requests. RPS: 1391.21 +I0304 23:09:06.905709 667737 grpc_client.cc:79] Completed 129000 requests. RPS: 1392.26 +I0304 23:09:07.794396 667737 grpc_client.cc:79] Completed 130000 requests. RPS: 1389.72 +I0304 23:09:08.452801 667737 grpc_client.cc:79] Completed 131000 requests. RPS: 1390.62 +I0304 23:09:08.478474 667737 grpc_client.cc:94] Finished benchmark. +I0304 23:09:08.478523 667737 grpc_client.cc:95] Total RPS: 1391.01 +I0304 23:09:08.480908 667737 grpc_client.cc:103] Latency Stats (ms): +I0304 23:09:08.480923 667737 grpc_client.cc:104] Average: 71.7912 +I0304 23:09:08.480937 667737 grpc_client.cc:105] StdDev: 22.6731 +I0304 23:09:08.480947 667737 grpc_client.cc:106] Min: 1.76114 +I0304 23:09:08.482389 667737 grpc_client.cc:107] Max: 252.318 +I0304 23:09:08.483842 667737 grpc_client.cc:108] Samples: 131072 + + +=== Benchmark for 128KiB payload (131072 bytes), 1024 requests === + +--- Raw HTTP/2 --- +I0304 23:09:09.494452 743731 client.cc:232] Starting HTTP/2 benchmark client... +I0304 23:09:09.494718 743731 client.cc:193] Connected to server. +I0304 23:09:09.954262 743731 client.cc:80] Completed 1000 requests. RPS: 2177.05 +I0304 23:09:09.980207 743731 client.cc:270] Finished benchmark. +I0304 23:09:09.980259 743731 client.cc:271] Total RPS: 2314.11 +I0304 23:09:09.980319 743731 client.cc:280] Latency Stats (ms): +I0304 23:09:09.980330 743731 client.cc:281] Average: 42.5598 +I0304 23:09:09.980348 743731 client.cc:282] StdDev: 13.0792 +I0304 23:09:09.980361 743731 client.cc:283] Min: 17.7423 +I0304 23:09:09.980394 743731 client.cc:284] Max: 70.7927 +I0304 23:09:09.980426 743731 client.cc:285] Samples: 1123 + +--- gRPC --- +I0304 23:09:10.990232 743774 grpc_client.cc:138] Starting gRPC benchmark client connecting to 127.0.0.1:50051 +I0304 23:09:12.037748 743774 grpc_client.cc:79] Completed 1000 requests. RPS: 954.708 +I0304 23:09:12.059107 743774 grpc_client.cc:94] Finished benchmark. +I0304 23:09:12.059150 743774 grpc_client.cc:95] Total RPS: 958.084 +I0304 23:09:12.059210 743774 grpc_client.cc:103] Latency Stats (ms): +I0304 23:09:12.059222 743774 grpc_client.cc:104] Average: 99.1384 +I0304 23:09:12.059234 743774 grpc_client.cc:105] StdDev: 38.9064 +I0304 23:09:12.059245 743774 grpc_client.cc:106] Min: 23.9131 +I0304 23:09:12.059277 743774 grpc_client.cc:107] Max: 252.077 +I0304 23:09:12.059309 743774 grpc_client.cc:108] Samples: 1024 + + +=== Benchmark for 1MiB payload (1048576 bytes), 128 requests === + +--- Raw HTTP/2 --- +I0304 23:09:13.073443 744427 client.cc:232] Starting HTTP/2 benchmark client... +I0304 23:09:13.073683 744427 client.cc:193] Connected to server. +I0304 23:09:13.882539 744427 client.cc:270] Finished benchmark. +I0304 23:09:13.882602 744427 client.cc:271] Total RPS: 280.664 +I0304 23:09:13.882681 744427 client.cc:280] Latency Stats (ms): +I0304 23:09:13.882692 744427 client.cc:281] Average: 335.413 +I0304 23:09:13.882705 744427 client.cc:282] StdDev: 135.811 +I0304 23:09:13.882715 744427 client.cc:283] Min: 175.332 +I0304 23:09:13.882733 744427 client.cc:284] Max: 599.52 +I0304 23:09:13.882748 744427 client.cc:285] Samples: 227 + +--- gRPC --- +I0304 23:09:14.907154 744462 grpc_client.cc:138] Starting gRPC benchmark client connecting to 127.0.0.1:50051 +I0304 23:09:15.462439 744462 grpc_client.cc:94] Finished benchmark. +I0304 23:09:15.462512 744462 grpc_client.cc:95] Total RPS: 230.681 +I0304 23:09:15.462667 744462 grpc_client.cc:103] Latency Stats (ms): +I0304 23:09:15.462685 744462 grpc_client.cc:104] Average: 265.167 +I0304 23:09:15.462704 744462 grpc_client.cc:105] StdDev: 78.8764 +I0304 23:09:15.462755 744462 grpc_client.cc:106] Min: 32.9336 +I0304 23:09:15.462776 744462 grpc_client.cc:107] Max: 510.218 +I0304 23:09:15.462794 744462 grpc_client.cc:108] Samples: 128 + + diff --git a/http2/server.cc b/http2/server.cc index d2ac44f..753b8a8 100644 --- a/http2/server.cc +++ b/http2/server.cc @@ -53,7 +53,7 @@ static ssize_t echo_data_provider_callback(nghttp2_session* session, int32_t str static int on_frame_recv_callback(nghttp2_session* session, const nghttp2_frame* frame, void* user_data) { struct ClientSession* client = (struct ClientSession*)user_data; - LOG(INFO) << "Server received frame type " << static_cast(frame->hd.type); +// LOG(INFO) << "Server received frame type " << static_cast(frame->hd.type); switch (frame->hd.type) { case NGHTTP2_HEADERS: if (frame->headers.cat == NGHTTP2_HCAT_REQUEST) { @@ -64,9 +64,9 @@ static int on_frame_recv_callback(nghttp2_session* session, const nghttp2_frame* } break; case NGHTTP2_DATA: - LOG(INFO) << "Server logic: DATA frame on stream " << frame->hd.stream_id << ", flags " << static_cast(frame->hd.flags); + // LOG(INFO) << "Server logic: DATA frame on stream " << frame->hd.stream_id << ", flags " << static_cast(frame->hd.flags); if (frame->hd.flags & NGHTTP2_FLAG_END_STREAM) { - LOG(INFO) << "Server logic: END_STREAM seen"; + // LOG(INFO) << "Server logic: END_STREAM seen"; const nghttp2_nv hdrs[] = { MAKE_NV(":status", "200")}; struct stream_data* sd = (struct stream_data*)nghttp2_session_get_stream_user_data(session, frame->hd.stream_id); @@ -75,7 +75,7 @@ static int on_frame_recv_callback(nghttp2_session* session, const nghttp2_frame* data_prd.source.ptr = sd; data_prd.read_callback = echo_data_provider_callback; int rv = nghttp2_submit_response(session, frame->hd.stream_id, hdrs, 1, &data_prd); - LOG(INFO) << "nghttp2_submit_response returned " << rv; + // LOG(INFO) << "nghttp2_submit_response returned " << rv; nghttp2_session_send(session); // flush to output } else { LOG(ERROR) << "Server logic: No stream data found!"; @@ -150,7 +150,7 @@ static void readcb(struct bufferevent* bev, void* ptr) { struct evbuffer* input = bufferevent_get_input(bev); size_t datalen = evbuffer_get_length(input); - LOG(INFO) << "Server readcb: got " << datalen << " bytes"; +// LOG(INFO) << "Server readcb: got " << datalen << " bytes"; if (datalen == 0) return; unsigned char* data = evbuffer_pullup(input, -1); @@ -161,7 +161,7 @@ static void readcb(struct bufferevent* bev, void* ptr) { bufferevent_free(bev); return; } - LOG(INFO) << "Server readcb: consumed " << readlen << " bytes"; +// LOG(INFO) << "Server readcb: consumed " << readlen << " bytes"; evbuffer_drain(input, readlen); nghttp2_session_send(client->session); } @@ -194,9 +194,11 @@ static void acceptcb(struct evconnlistener* listener, evutil_socket_t fd, struct nghttp2_session_server_new(&client->session, callbacks, client); nghttp2_session_callbacks_del(callbacks); - nghttp2_settings_entry iv[1] = { - {NGHTTP2_SETTINGS_MAX_CONCURRENT_STREAMS, 100}}; - nghttp2_submit_settings(client->session, NGHTTP2_FLAG_NONE, iv, 1); + nghttp2_settings_entry iv[2] = { + {NGHTTP2_SETTINGS_MAX_CONCURRENT_STREAMS, 100}, + {NGHTTP2_SETTINGS_INITIAL_WINDOW_SIZE, 128 * 1024 * 1024}}; + nghttp2_submit_settings(client->session, NGHTTP2_FLAG_NONE, iv, 2); + nghttp2_submit_window_update(client->session, NGHTTP2_FLAG_NONE, 0, 128 * 1024 * 1024); nghttp2_session_send(client->session); bufferevent_setcb(bev, readcb, NULL, eventcb, client); From f524a0c55646e279cf00e2f7b652a58abe99bc10 Mon Sep 17 00:00:00 2001 From: Takeshi Yoshino <4511440+tyoshino@users.noreply.github.com> Date: Mon, 9 Mar 2026 01:47:22 +0000 Subject: [PATCH 4/5] fix --- http2/.gitignore | 1 - http2/CMakeLists.txt | 60 +--- http2/benchmark.py | 24 +- http2/grpc_client.cc | 142 ---------- http2/grpc_server.cc | 50 ---- http2/proto/echo.proto | 15 - http2/results.txt | 489 +++++++++++--------------------- wish/cpp/src/cpp.code-workspace | 8 + 8 files changed, 176 insertions(+), 613 deletions(-) delete mode 100644 http2/grpc_client.cc delete mode 100644 http2/grpc_server.cc delete mode 100644 http2/proto/echo.proto create mode 100644 wish/cpp/src/cpp.code-workspace diff --git a/http2/.gitignore b/http2/.gitignore index ee37f9a..62199d9 100644 --- a/http2/.gitignore +++ b/http2/.gitignore @@ -6,6 +6,5 @@ CMakeCache.txt Makefile build -_deps *.log \ No newline at end of file diff --git a/http2/CMakeLists.txt b/http2/CMakeLists.txt index 034590b..27cb713 100644 --- a/http2/CMakeLists.txt +++ b/http2/CMakeLists.txt @@ -1,5 +1,5 @@ cmake_minimum_required(VERSION 3.15) -project(http2_echo_server) +project(http2_benchmark) set(CMAKE_CXX_STANDARD 17) set(CMAKE_CXX_STANDARD_REQUIRED ON) @@ -12,32 +12,13 @@ set(FETCHCONTENT_QUIET OFF) set(ABSL_ENABLE_INSTALL OFF CACHE BOOL "" FORCE) set(ABSL_PROPAGATE_CXX_STD ON) -# Protobuf -set(protobuf_INSTALL OFF CACHE BOOL "" FORCE) -set(protobuf_BUILD_TESTS OFF CACHE BOOL "Disable protobuf tests" FORCE) -set(protobuf_WITH_ZLIB OFF CACHE BOOL "Disable protobuf zlib" FORCE) - -# gRPC -set(gRPC_ABSL_PROVIDER "module" CACHE STRING "" FORCE) -set(gRPC_CARES_PROVIDER "module" CACHE STRING "" FORCE) -set(gRPC_PROTOBUF_PROVIDER "module" CACHE STRING "" FORCE) -set(gRPC_RE2_PROVIDER "module" CACHE STRING "" FORCE) -set(gRPC_SSL_PROVIDER "module" CACHE STRING "" FORCE) -set(gRPC_ZLIB_PROVIDER "module" CACHE STRING "" FORCE) -set(gRPC_BUILD_HAS_SYSTEMD OFF) - -# To avoid issues with conflicts, we will use Abseil and protobuf from gRPC. FetchContent_Declare( - grpc - GIT_REPOSITORY https://github.com/grpc/grpc.git - GIT_TAG v1.78.1 - GIT_SHALLOW TRUE + abseil + GIT_REPOSITORY https://github.com/abseil/abseil-cpp.git + GIT_TAG 20260107.1 ) -FetchContent_MakeAvailable(grpc) - -# To use the `protobuf_generate` function. -include(${protobuf_SOURCE_DIR}/cmake/protobuf-generate.cmake) +FetchContent_MakeAvailable(abseil) find_package(PkgConfig REQUIRED) pkg_check_modules(LIBEVENT REQUIRED libevent) @@ -54,39 +35,8 @@ link_directories( ${LIBNGHTTP2_LIBRARY_DIRS} ) -# Protobuf/gRPC generation - -add_library(echo_proto_lib OBJECT "${CMAKE_CURRENT_LIST_DIR}/proto/echo.proto") - -set(PROTO_BINARY_DIR "${CMAKE_CURRENT_BINARY_DIR}/generated") -set(PROTO_IMPORT_DIRS "${CMAKE_CURRENT_LIST_DIR}/proto") - -protobuf_generate( - TARGET echo_proto_lib - IMPORT_DIRS ${PROTO_IMPORT_DIRS} - PROTOC_OUT_DIR ${PROTO_BINARY_DIR}) - -protobuf_generate( - TARGET echo_proto_lib - LANGUAGE grpc - GENERATE_EXTENSIONS .grpc.pb.h .grpc.pb.cc - PLUGIN "protoc-gen-grpc=\$" - IMPORT_DIRS ${PROTO_IMPORT_DIRS} - PROTOC_OUT_DIR ${PROTO_BINARY_DIR}) - -target_include_directories(echo_proto_lib PUBLIC "$") -target_link_libraries(echo_proto_lib PUBLIC grpc++ libprotobuf) - -# HTTP/2 Benchmarks add_executable(h2_echo_server server.cc) target_link_libraries(h2_echo_server ${LIBEVENT_LIBRARIES} ${LIBNGHTTP2_LIBRARIES} absl::log absl::log_initialize absl::flags absl::flags_parse "$") add_executable(h2_bench_client client.cc) target_link_libraries(h2_bench_client ${LIBEVENT_LIBRARIES} ${LIBNGHTTP2_LIBRARIES} absl::log absl::log_initialize absl::flags absl::flags_parse "$") - -# gRPC Benchmarks -add_executable(grpc_echo_server grpc_server.cc) -target_link_libraries(grpc_echo_server echo_proto_lib absl::log absl::log_initialize absl::flags absl::flags_parse "$") - -add_executable(grpc_bench_client grpc_client.cc) -target_link_libraries(grpc_bench_client echo_proto_lib absl::log absl::log_initialize absl::flags absl::flags_parse "$") diff --git a/http2/benchmark.py b/http2/benchmark.py index 52bdc12..cc2a3de 100644 --- a/http2/benchmark.py +++ b/http2/benchmark.py @@ -15,7 +15,7 @@ def run_benchmark(): for name, size in PAYLOAD_SIZES.items(): num_requests = TOTAL_DATA_BYTES // size f.write(f"=== Benchmark for {name} payload ({size} bytes), {num_requests} requests ===\n\n") - + f.write("--- Raw HTTP/2 ---\n") print(f"Running Raw HTTP/2 bench for {name}...") server_process = subprocess.Popen(["./build/h2_echo_server"]) @@ -36,28 +36,6 @@ def run_benchmark(): server_process.terminate() server_process.wait() - f.write("\n") - - f.write("--- gRPC ---\n") - print(f"Running gRPC bench for {name}...") - grpc_server_process = subprocess.Popen(["./build/grpc_echo_server"]) - time.sleep(1) # wait for server to start - try: - grpc_client_output = subprocess.check_output([ - "./build/grpc_bench_client", - f"--payload_size={size}", - f"--num_requests={num_requests}", - "--stderrthreshold=0", - ], stderr=subprocess.STDOUT, text=True) - f.write(grpc_client_output) - except subprocess.CalledProcessError as e: - f.write(f"Error running gRPC client:\n{e.output}\n") - except Exception as e: - f.write(f"Failed to start/run gRPC client: {e}\n") - finally: - grpc_server_process.terminate() - grpc_server_process.wait() - f.write("\n\n") if __name__ == "__main__": diff --git a/http2/grpc_client.cc b/http2/grpc_client.cc deleted file mode 100644 index 0f4ca43..0000000 --- a/http2/grpc_client.cc +++ /dev/null @@ -1,142 +0,0 @@ -#include - -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include "absl/flags/flag.h" -#include "absl/flags/parse.h" -#include "absl/log/initialize.h" -#include "absl/log/log.h" -#include "echo.grpc.pb.h" - -ABSL_FLAG(std::string, host, "127.0.0.1", "Server host"); -ABSL_FLAG(int, port, 50051, "Server port"); -ABSL_FLAG(int, num_requests, 5000, "Total number of requests to complete"); -ABSL_FLAG(int, payload_size, 1024 * 1024, "Size of the request payload in bytes"); -ABSL_FLAG(int, report_interval, 1000, "Frequency of progress reports"); -ABSL_FLAG(int, concurrent_requests, 100, "Number of concurrent requests"); - -using echo::EchoRequest; -using echo::EchoResponse; -using echo::EchoServer; -using grpc::Channel; -using grpc::ClientAsyncResponseReader; -using grpc::ClientContext; -using grpc::CompletionQueue; -using grpc::Status; - -std::string request_payload_data; - -struct AsyncClientCall { - EchoResponse reply; - ClientContext context; - Status status; - std::unique_ptr> response_reader; - std::chrono::steady_clock::time_point start_time; -}; - -class GrpcBenchClient { - public: - explicit GrpcBenchClient(std::shared_ptr channel) - : stub_(EchoServer::NewStub(channel)) {} - - void Run(int concurrency, int total_requests) { - int requests_submitted = 0; - int requests_completed = 0; - std::vector latencies; - auto start_bench = std::chrono::steady_clock::now(); - - // Warm up/Seed concurrency - for (int i = 0; i < concurrency && requests_submitted < total_requests; i++) { - AsyncEcho(requests_submitted++); - } - - void* got_tag; - bool ok = false; - while (cq_.Next(&got_tag, &ok)) { - AsyncClientCall* call = static_cast(got_tag); - requests_completed++; - - if (ok && call->status.ok()) { - auto end_time = std::chrono::steady_clock::now(); - double duration = std::chrono::duration(end_time - call->start_time).count(); - latencies.push_back(duration); - } else { - LOG(ERROR) << "RPC failed"; - } - - int report_interval = absl::GetFlag(FLAGS_report_interval); - if (report_interval > 0 && requests_completed % report_interval == 0) { - auto now = std::chrono::steady_clock::now(); - double elapsed = std::chrono::duration(now - start_bench).count(); - LOG(INFO) << "Completed " << requests_completed << " requests. RPS: " << requests_completed / elapsed; - } - - delete call; - - if (requests_submitted < total_requests) { - AsyncEcho(requests_submitted++); - } else if (requests_completed == total_requests) { - break; - } - } - - auto end_bench = std::chrono::steady_clock::now(); - double total_elapsed = std::chrono::duration(end_bench - start_bench).count(); - - LOG(INFO) << "Finished benchmark."; - LOG(INFO) << "Total RPS: " << requests_completed / total_elapsed; - - if (!latencies.empty()) { - double sum = std::accumulate(latencies.begin(), latencies.end(), 0.0); - double avg = sum / latencies.size(); - double sq_sum = std::inner_product(latencies.begin(), latencies.end(), latencies.begin(), 0.0); - double stdev = std::sqrt(sq_sum / latencies.size() - avg * avg); - - LOG(INFO) << "Latency Stats (ms):"; - LOG(INFO) << " Average: " << avg; - LOG(INFO) << " StdDev: " << stdev; - LOG(INFO) << " Min: " << *std::min_element(latencies.begin(), latencies.end()); - LOG(INFO) << " Max: " << *std::max_element(latencies.begin(), latencies.end()); - LOG(INFO) << " Samples: " << latencies.size(); - } - } - - private: - void AsyncEcho(int id) { - AsyncClientCall* call = new AsyncClientCall; - call->start_time = std::chrono::steady_clock::now(); - - EchoRequest request; - request.set_data(request_payload_data); - - call->response_reader = stub_->PrepareAsyncEcho(&call->context, request, &cq_); - call->response_reader->StartCall(); - call->response_reader->Finish(&call->reply, &call->status, (void*)call); - } - - std::unique_ptr stub_; - CompletionQueue cq_; -}; - -int main(int argc, char** argv) { - absl::ParseCommandLine(argc, argv); - absl::InitializeLog(); - - std::string target = absl::GetFlag(FLAGS_host) + ":" + std::to_string(absl::GetFlag(FLAGS_port)); - GrpcBenchClient client(grpc::CreateChannel(target, grpc::InsecureChannelCredentials())); - - request_payload_data = std::string(absl::GetFlag(FLAGS_payload_size), 'A'); - - LOG(INFO) << "Starting gRPC benchmark client connecting to " << target; - client.Run(absl::GetFlag(FLAGS_concurrent_requests), absl::GetFlag(FLAGS_num_requests)); - - return 0; -} diff --git a/http2/grpc_server.cc b/http2/grpc_server.cc deleted file mode 100644 index feaccd3..0000000 --- a/http2/grpc_server.cc +++ /dev/null @@ -1,50 +0,0 @@ -#include -#include -#include - -#include -#include "echo.grpc.pb.h" - -#include "absl/flags/flag.h" -#include "absl/flags/parse.h" -#include "absl/log/initialize.h" -#include "absl/log/log.h" - -ABSL_FLAG(int, port, 50051, "Port to listen on"); - -using grpc::Server; -using grpc::ServerBuilder; -using grpc::ServerContext; -using grpc::Status; -using echo::EchoRequest; -using echo::EchoResponse; -using echo::EchoServer; - -class EchoServiceImpl final : public EchoServer::Service { - Status Echo(ServerContext* context, const EchoRequest* request, - EchoResponse* response) override { - response->set_data(request->data()); - return Status::OK; - } -}; - -void RunServer(int port) { - std::string server_address("0.0.0.0:" + std::to_string(port)); - EchoServiceImpl service; - - ServerBuilder builder; - builder.AddListeningPort(server_address, grpc::InsecureServerCredentials()); - builder.RegisterService(&service); - std::unique_ptr server(builder.BuildAndStart()); - LOG(INFO) << "gRPC Echo Server listening on " << server_address; - server->Wait(); -} - -int main(int argc, char** argv) { - absl::ParseCommandLine(argc, argv); - absl::InitializeLog(); - - RunServer(absl::GetFlag(FLAGS_port)); - - return 0; -} diff --git a/http2/proto/echo.proto b/http2/proto/echo.proto deleted file mode 100644 index e452376..0000000 --- a/http2/proto/echo.proto +++ /dev/null @@ -1,15 +0,0 @@ -syntax = "proto3"; - -package echo; - -service EchoServer { - rpc Echo(EchoRequest) returns (EchoResponse); -} - -message EchoRequest { - bytes data = 1; -} - -message EchoResponse { - bytes data = 1; -} diff --git a/http2/results.txt b/http2/results.txt index f593901..56d6d11 100644 --- a/http2/results.txt +++ b/http2/results.txt @@ -1,342 +1,177 @@ === Benchmark for 1KiB payload (1024 bytes), 131072 requests === --- Raw HTTP/2 --- -I0304 23:07:31.630222 667691 client.cc:232] Starting HTTP/2 benchmark client... -I0304 23:07:31.630441 667691 client.cc:193] Connected to server. -I0304 23:07:31.641636 667691 client.cc:80] Completed 1000 requests. RPS: 89839.2 -I0304 23:07:31.652396 667691 client.cc:80] Completed 2000 requests. RPS: 91361.7 -I0304 23:07:31.663099 667691 client.cc:80] Completed 3000 requests. RPS: 92041.5 -I0304 23:07:31.673957 667691 client.cc:80] Completed 4000 requests. RPS: 92055.6 -I0304 23:07:31.684318 667691 client.cc:80] Completed 5000 requests. RPS: 92912.6 -I0304 23:07:31.742711 667691 client.cc:80] Completed 6000 requests. RPS: 53473.1 -I0304 23:07:31.757169 667691 client.cc:80] Completed 7000 requests. RPS: 55264.3 -I0304 23:07:31.770137 667691 client.cc:80] Completed 8000 requests. RPS: 57293.5 -I0304 23:07:31.781884 667691 client.cc:80] Completed 9000 requests. RPS: 59453.4 -I0304 23:07:31.792564 667691 client.cc:80] Completed 10000 requests. RPS: 61705.9 -I0304 23:07:31.803119 667691 client.cc:80] Completed 11000 requests. RPS: 63726 -I0304 23:07:31.813764 667691 client.cc:80] Completed 12000 requests. RPS: 65481.1 -I0304 23:07:31.824275 667691 client.cc:80] Completed 13000 requests. RPS: 67089.8 -I0304 23:07:31.835100 667691 client.cc:80] Completed 14000 requests. RPS: 68428.2 -I0304 23:07:31.846390 667691 client.cc:80] Completed 15000 requests. RPS: 69481.4 -I0304 23:07:31.860161 667691 client.cc:80] Completed 16000 requests. RPS: 69669.4 -I0304 23:07:31.871403 667691 client.cc:80] Completed 17000 requests. RPS: 70569.6 -I0304 23:07:31.882367 667691 client.cc:80] Completed 18000 requests. RPS: 71467.7 -I0304 23:07:31.892463 667691 client.cc:80] Completed 19000 requests. RPS: 72530.7 -I0304 23:07:31.902932 667691 client.cc:80] Completed 20000 requests. RPS: 73414.2 -I0304 23:07:31.913294 667691 client.cc:80] Completed 21000 requests. RPS: 74260.3 -I0304 23:07:31.923325 667691 client.cc:80] Completed 22000 requests. RPS: 75131.5 -I0304 23:07:31.933994 667691 client.cc:80] Completed 23000 requests. RPS: 75785.3 -I0304 23:07:31.944703 667691 client.cc:80] Completed 24000 requests. RPS: 76385 -I0304 23:07:31.955531 667691 client.cc:80] Completed 25000 requests. RPS: 76916.9 -I0304 23:07:31.966201 667691 client.cc:80] Completed 26000 requests. RPS: 77451 -I0304 23:07:31.975323 667691 client.cc:80] Completed 27000 requests. RPS: 78302.2 -I0304 23:07:31.986282 667691 client.cc:80] Completed 28000 requests. RPS: 78701 -I0304 23:07:31.996856 667691 client.cc:80] Completed 29000 requests. RPS: 79159.1 -I0304 23:07:32.007565 667691 client.cc:80] Completed 30000 requests. RPS: 79563.1 -I0304 23:07:32.017819 667691 client.cc:80] Completed 31000 requests. RPS: 80038.4 -I0304 23:07:32.028279 667691 client.cc:80] Completed 32000 requests. RPS: 80447.9 -I0304 23:07:32.039044 667691 client.cc:80] Completed 33000 requests. RPS: 80775.6 -I0304 23:07:32.049690 667691 client.cc:80] Completed 34000 requests. RPS: 81109.8 -I0304 23:07:32.060586 667691 client.cc:80] Completed 35000 requests. RPS: 81380 -I0304 23:07:32.072105 667691 client.cc:80] Completed 36000 requests. RPS: 81521.7 -I0304 23:07:32.083564 667691 client.cc:80] Completed 37000 requests. RPS: 81667.1 -I0304 23:07:32.093292 667691 client.cc:80] Completed 38000 requests. RPS: 82111.2 -I0304 23:07:32.103533 667691 client.cc:80] Completed 39000 requests. RPS: 82447.4 -I0304 23:07:32.114522 667691 client.cc:80] Completed 40000 requests. RPS: 82641.7 -I0304 23:07:32.125329 667691 client.cc:80] Completed 41000 requests. RPS: 82857.7 -I0304 23:07:32.137327 667691 client.cc:80] Completed 42000 requests. RPS: 82869.3 -I0304 23:07:32.147627 667691 client.cc:80] Completed 43000 requests. RPS: 83152.5 -I0304 23:07:32.158657 667691 client.cc:80] Completed 44000 requests. RPS: 83309.5 -I0304 23:07:32.169122 667691 client.cc:80] Completed 45000 requests. RPS: 83547.3 -I0304 23:07:32.180805 667691 client.cc:80] Completed 46000 requests. RPS: 83590.8 -I0304 23:07:32.196706 667691 client.cc:80] Completed 47000 requests. RPS: 83009.2 -I0304 23:07:32.212370 667691 client.cc:80] Completed 48000 requests. RPS: 82493.4 -I0304 23:07:32.231072 667691 client.cc:80] Completed 49000 requests. RPS: 81589.7 -I0304 23:07:32.249891 667691 client.cc:80] Completed 50000 requests. RPS: 80725.2 -I0304 23:07:32.265070 667691 client.cc:80] Completed 51000 requests. RPS: 80370.1 -I0304 23:07:32.281121 667691 client.cc:80] Completed 52000 requests. RPS: 79924.3 -I0304 23:07:32.296718 667691 client.cc:80] Completed 53000 requests. RPS: 79554.1 -I0304 23:07:32.313345 667691 client.cc:80] Completed 54000 requests. RPS: 79081.5 -I0304 23:07:32.328728 667691 client.cc:80] Completed 55000 requests. RPS: 78771.4 -I0304 23:07:32.343118 667691 client.cc:80] Completed 56000 requests. RPS: 78584 -I0304 23:07:32.357046 667691 client.cc:80] Completed 57000 requests. RPS: 78453.9 -I0304 23:07:32.375396 667691 client.cc:80] Completed 58000 requests. RPS: 77863.7 -I0304 23:07:32.391062 667691 client.cc:80] Completed 59000 requests. RPS: 77574.7 -I0304 23:07:32.402106 667691 client.cc:80] Completed 60000 requests. RPS: 77760.4 -I0304 23:07:32.415283 667691 client.cc:80] Completed 61000 requests. RPS: 77728.9 -I0304 23:07:32.430409 667691 client.cc:80] Completed 62000 requests. RPS: 77509.3 -I0304 23:07:32.446591 667691 client.cc:80] Completed 63000 requests. RPS: 77197.7 -I0304 23:07:32.464049 667691 client.cc:80] Completed 64000 requests. RPS: 76780.6 -I0304 23:07:32.481754 667691 client.cc:80] Completed 65000 requests. RPS: 76358.4 -I0304 23:07:32.502107 667691 client.cc:80] Completed 66000 requests. RPS: 75722.6 -I0304 23:07:32.518280 667691 client.cc:80] Completed 67000 requests. RPS: 75469.6 -I0304 23:07:32.531422 667691 client.cc:80] Completed 68000 requests. RPS: 75478.7 -I0304 23:07:32.542076 667691 client.cc:80] Completed 69000 requests. RPS: 75693.5 -I0304 23:07:32.552728 667691 client.cc:80] Completed 70000 requests. RPS: 75903.6 -I0304 23:07:32.563335 667691 client.cc:80] Completed 71000 requests. RPS: 76112.5 -I0304 23:07:32.573918 667691 client.cc:80] Completed 72000 requests. RPS: 76318.7 -I0304 23:07:32.584070 667691 client.cc:80] Completed 73000 requests. RPS: 76554.8 -I0304 23:07:32.594665 667691 client.cc:80] Completed 74000 requests. RPS: 76750.7 -I0304 23:07:32.604918 667691 client.cc:80] Completed 75000 requests. RPS: 76969.4 -I0304 23:07:32.618271 667691 client.cc:80] Completed 76000 requests. RPS: 76941.3 -I0304 23:07:32.630072 667691 client.cc:80] Completed 77000 requests. RPS: 77033.4 -I0304 23:07:32.640643 667691 client.cc:80] Completed 78000 requests. RPS: 77217.1 -I0304 23:07:32.651414 667691 client.cc:80] Completed 79000 requests. RPS: 77382 -I0304 23:07:32.662529 667691 client.cc:80] Completed 80000 requests. RPS: 77517.6 -I0304 23:07:32.672832 667691 client.cc:80] Completed 81000 requests. RPS: 77710.7 -I0304 23:07:32.683629 667691 client.cc:80] Completed 82000 requests. RPS: 77863.6 -I0304 23:07:32.694551 667691 client.cc:80] Completed 83000 requests. RPS: 78004.1 -I0304 23:07:32.705737 667691 client.cc:80] Completed 84000 requests. RPS: 78122.7 -I0304 23:07:32.715848 667691 client.cc:80] Completed 85000 requests. RPS: 78316.3 -I0304 23:07:32.727226 667691 client.cc:80] Completed 86000 requests. RPS: 78415.6 -I0304 23:07:32.737672 667691 client.cc:80] Completed 87000 requests. RPS: 78578.9 -I0304 23:07:32.752378 667691 client.cc:80] Completed 88000 requests. RPS: 78440.3 -I0304 23:07:32.766345 667691 client.cc:80] Completed 89000 requests. RPS: 78356.1 -I0304 23:07:32.781565 667691 client.cc:80] Completed 90000 requests. RPS: 78188.9 -I0304 23:07:32.794316 667691 client.cc:80] Completed 91000 requests. RPS: 78191.4 -I0304 23:07:32.804837 667691 client.cc:80] Completed 92000 requests. RPS: 78342.4 -I0304 23:07:32.815776 667691 client.cc:80] Completed 93000 requests. RPS: 78463.1 -I0304 23:07:32.826522 667691 client.cc:80] Completed 94000 requests. RPS: 78594.2 -I0304 23:07:32.837720 667691 client.cc:80] Completed 95000 requests. RPS: 78693.5 -I0304 23:07:32.848456 667691 client.cc:80] Completed 96000 requests. RPS: 78820.9 -I0304 23:07:32.859484 667691 client.cc:80] Completed 97000 requests. RPS: 78927.3 -I0304 23:07:32.870378 667691 client.cc:80] Completed 98000 requests. RPS: 79040.4 -I0304 23:07:32.881089 667691 client.cc:80] Completed 99000 requests. RPS: 79163 -I0304 23:07:32.891588 667691 client.cc:80] Completed 100000 requests. RPS: 79296.9 -I0304 23:07:32.901980 667691 client.cc:80] Completed 101000 requests. RPS: 79435.3 -I0304 23:07:32.912543 667691 client.cc:80] Completed 102000 requests. RPS: 79560.8 -I0304 23:07:32.923144 667691 client.cc:80] Completed 103000 requests. RPS: 79682 -I0304 23:07:32.933672 667691 client.cc:80] Completed 104000 requests. RPS: 79805.6 -I0304 23:07:32.944107 667691 client.cc:80] Completed 105000 requests. RPS: 79932.9 -I0304 23:07:32.954852 667691 client.cc:80] Completed 106000 requests. RPS: 80039.4 -I0304 23:07:32.965278 667691 client.cc:80] Completed 107000 requests. RPS: 80163.5 -I0304 23:07:32.975228 667691 client.cc:80] Completed 108000 requests. RPS: 80313.9 -I0304 23:07:32.985895 667691 client.cc:80] Completed 109000 requests. RPS: 80419.7 -I0304 23:07:32.995696 667691 client.cc:80] Completed 110000 requests. RPS: 80574.8 -I0304 23:07:33.006598 667691 client.cc:80] Completed 111000 requests. RPS: 80663.2 -I0304 23:07:33.016797 667691 client.cc:80] Completed 112000 requests. RPS: 80791.1 -I0304 23:07:33.027461 667691 client.cc:80] Completed 113000 requests. RPS: 80890.2 -I0304 23:07:33.037453 667691 client.cc:80] Completed 114000 requests. RPS: 81026.4 -I0304 23:07:33.047933 667691 client.cc:80] Completed 115000 requests. RPS: 81132.9 -I0304 23:07:33.058532 667691 client.cc:80] Completed 116000 requests. RPS: 81231 -I0304 23:07:33.069538 667691 client.cc:80] Completed 117000 requests. RPS: 81304.6 -I0304 23:07:33.080295 667691 client.cc:80] Completed 118000 requests. RPS: 81391.2 -I0304 23:07:33.094522 667691 client.cc:80] Completed 119000 requests. RPS: 81283.2 -I0304 23:07:33.108479 667691 client.cc:80] Completed 120000 requests. RPS: 81192.3 -I0304 23:07:33.119314 667691 client.cc:80] Completed 121000 requests. RPS: 81273.1 -I0304 23:07:33.131857 667691 client.cc:80] Completed 122000 requests. RPS: 81260.1 -I0304 23:07:33.142385 667691 client.cc:80] Completed 123000 requests. RPS: 81355.7 -I0304 23:07:33.152501 667691 client.cc:80] Completed 124000 requests. RPS: 81472 -I0304 23:07:33.167888 667691 client.cc:80] Completed 125000 requests. RPS: 81307 -I0304 23:07:33.179734 667691 client.cc:80] Completed 126000 requests. RPS: 81330.8 -I0304 23:07:33.190778 667691 client.cc:80] Completed 127000 requests. RPS: 81396 -I0304 23:07:33.201050 667691 client.cc:80] Completed 128000 requests. RPS: 81500.4 -I0304 23:07:33.211751 667691 client.cc:80] Completed 129000 requests. RPS: 81581.2 -I0304 23:07:33.222787 667691 client.cc:80] Completed 130000 requests. RPS: 81643.9 -I0304 23:07:33.233321 667691 client.cc:80] Completed 131000 requests. RPS: 81731.2 -I0304 23:07:33.235277 667691 client.cc:270] Finished benchmark. -I0304 23:07:33.235303 667691 client.cc:271] Total RPS: 81738.1 -I0304 23:07:33.237597 667691 client.cc:280] Latency Stats (ms): -I0304 23:07:33.237616 667691 client.cc:281] Average: 1.22245 -I0304 23:07:33.237629 667691 client.cc:282] StdDev: 1.24862 -I0304 23:07:33.237642 667691 client.cc:283] Min: 0.39262 -I0304 23:07:33.239020 667691 client.cc:284] Max: 44.3385 -I0304 23:07:33.240416 667691 client.cc:285] Samples: 131171 - ---- gRPC --- -I0304 23:07:34.250352 667737 grpc_client.cc:138] Starting gRPC benchmark client connecting to 127.0.0.1:50051 -I0304 23:07:35.202939 667737 grpc_client.cc:79] Completed 1000 requests. RPS: 1049.84 -I0304 23:07:35.876758 667737 grpc_client.cc:79] Completed 2000 requests. RPS: 1229.75 -I0304 23:07:36.526937 667737 grpc_client.cc:79] Completed 3000 requests. RPS: 1317.8 -I0304 23:07:37.328684 667737 grpc_client.cc:79] Completed 4000 requests. RPS: 1299.43 -I0304 23:07:38.046229 667737 grpc_client.cc:79] Completed 5000 requests. RPS: 1317.24 -I0304 23:07:38.710680 667737 grpc_client.cc:79] Completed 6000 requests. RPS: 1345.21 -I0304 23:07:39.452755 667737 grpc_client.cc:79] Completed 7000 requests. RPS: 1345.55 -I0304 23:07:40.097255 667737 grpc_client.cc:79] Completed 8000 requests. RPS: 1368.26 -I0304 23:07:40.719035 667737 grpc_client.cc:79] Completed 9000 requests. RPS: 1391.33 -I0304 23:07:41.513083 667737 grpc_client.cc:79] Completed 10000 requests. RPS: 1376.9 -I0304 23:07:42.175608 667737 grpc_client.cc:79] Completed 11000 requests. RPS: 1387.98 -I0304 23:07:42.812219 667737 grpc_client.cc:79] Completed 12000 requests. RPS: 1401.57 -I0304 23:07:43.459427 667737 grpc_client.cc:79] Completed 13000 requests. RPS: 1411.66 -I0304 23:07:44.328171 667737 grpc_client.cc:79] Completed 14000 requests. RPS: 1389.2 -I0304 23:07:44.973639 667737 grpc_client.cc:79] Completed 15000 requests. RPS: 1398.83 -I0304 23:07:45.647511 667737 grpc_client.cc:79] Completed 16000 requests. RPS: 1403.87 -I0304 23:07:46.446071 667737 grpc_client.cc:79] Completed 17000 requests. RPS: 1393.94 -I0304 23:07:47.093907 667737 grpc_client.cc:79] Completed 18000 requests. RPS: 1401.49 -I0304 23:07:47.752782 667737 grpc_client.cc:79] Completed 19000 requests. RPS: 1407.16 -I0304 23:07:48.540169 667737 grpc_client.cc:79] Completed 20000 requests. RPS: 1399.6 -I0304 23:07:49.193279 667737 grpc_client.cc:79] Completed 21000 requests. RPS: 1405.35 -I0304 23:07:49.839413 667737 grpc_client.cc:79] Completed 22000 requests. RPS: 1411.25 -I0304 23:07:50.616201 667737 grpc_client.cc:79] Completed 23000 requests. RPS: 1405.37 -I0304 23:07:51.252940 667737 grpc_client.cc:79] Completed 24000 requests. RPS: 1411.55 -I0304 23:07:51.954539 667737 grpc_client.cc:79] Completed 25000 requests. RPS: 1412.1 -I0304 23:07:52.854834 667737 grpc_client.cc:79] Completed 26000 requests. RPS: 1397.52 -I0304 23:07:53.504959 667737 grpc_client.cc:79] Completed 27000 requests. RPS: 1402.27 -I0304 23:07:54.120568 667737 grpc_client.cc:79] Completed 28000 requests. RPS: 1409.15 -I0304 23:07:54.825343 667737 grpc_client.cc:79] Completed 29000 requests. RPS: 1409.48 -I0304 23:07:55.662921 667737 grpc_client.cc:79] Completed 30000 requests. RPS: 1401.05 -I0304 23:07:56.304239 667737 grpc_client.cc:79] Completed 31000 requests. RPS: 1405.65 -I0304 23:07:57.005467 667737 grpc_client.cc:79] Completed 32000 requests. RPS: 1406.28 -I0304 23:07:57.720517 667737 grpc_client.cc:79] Completed 33000 requests. RPS: 1406.04 -I0304 23:07:58.367471 667737 grpc_client.cc:79] Completed 34000 requests. RPS: 1409.79 -I0304 23:07:59.068381 667737 grpc_client.cc:79] Completed 35000 requests. RPS: 1410.27 -I0304 23:07:59.768737 667737 grpc_client.cc:79] Completed 36000 requests. RPS: 1410.75 -I0304 23:08:00.389417 667737 grpc_client.cc:79] Completed 37000 requests. RPS: 1415.51 -I0304 23:08:01.104789 667737 grpc_client.cc:79] Completed 38000 requests. RPS: 1415.04 -I0304 23:08:01.803486 667737 grpc_client.cc:79] Completed 39000 requests. RPS: 1415.45 -I0304 23:08:02.435291 667737 grpc_client.cc:79] Completed 40000 requests. RPS: 1419.2 -I0304 23:08:03.125524 667737 grpc_client.cc:79] Completed 41000 requests. RPS: 1419.91 -I0304 23:08:03.879788 667737 grpc_client.cc:79] Completed 42000 requests. RPS: 1417.51 -I0304 23:08:04.636322 667737 grpc_client.cc:79] Completed 43000 requests. RPS: 1415.13 -I0304 23:08:05.272142 667737 grpc_client.cc:79] Completed 44000 requests. RPS: 1418.36 -I0304 23:08:06.051901 667737 grpc_client.cc:79] Completed 45000 requests. RPS: 1415.03 -I0304 23:08:06.663394 667737 grpc_client.cc:79] Completed 46000 requests. RPS: 1419.18 -I0304 23:08:07.304379 667737 grpc_client.cc:79] Completed 47000 requests. RPS: 1421.92 -I0304 23:08:08.011028 667737 grpc_client.cc:79] Completed 48000 requests. RPS: 1421.77 -I0304 23:08:08.697559 667737 grpc_client.cc:79] Completed 49000 requests. RPS: 1422.47 -I0304 23:08:09.333567 667737 grpc_client.cc:79] Completed 50000 requests. RPS: 1425.19 -I0304 23:08:10.013917 667737 grpc_client.cc:79] Completed 51000 requests. RPS: 1426.03 -I0304 23:08:10.677106 667737 grpc_client.cc:79] Completed 52000 requests. RPS: 1427.52 -I0304 23:08:11.316212 667737 grpc_client.cc:79] Completed 53000 requests. RPS: 1429.89 -I0304 23:08:12.100242 667737 grpc_client.cc:79] Completed 54000 requests. RPS: 1426.69 -I0304 23:08:12.778315 667737 grpc_client.cc:79] Completed 55000 requests. RPS: 1427.54 -I0304 23:08:13.433796 667737 grpc_client.cc:79] Completed 56000 requests. RPS: 1429.18 -I0304 23:08:14.135368 667737 grpc_client.cc:79] Completed 57000 requests. RPS: 1429.11 -I0304 23:08:15.026987 667737 grpc_client.cc:79] Completed 58000 requests. RPS: 1422.39 -I0304 23:08:15.722337 667737 grpc_client.cc:79] Completed 59000 requests. RPS: 1422.65 -I0304 23:08:16.358392 667737 grpc_client.cc:79] Completed 60000 requests. RPS: 1424.91 -I0304 23:08:17.090471 667737 grpc_client.cc:79] Completed 61000 requests. RPS: 1423.9 -I0304 23:08:17.767442 667737 grpc_client.cc:79] Completed 62000 requests. RPS: 1424.73 -I0304 23:08:18.392541 667737 grpc_client.cc:79] Completed 63000 requests. RPS: 1427.21 -I0304 23:08:19.149457 667737 grpc_client.cc:79] Completed 64000 requests. RPS: 1425.42 -I0304 23:08:19.803117 667737 grpc_client.cc:79] Completed 65000 requests. RPS: 1426.92 -I0304 23:08:20.454220 667737 grpc_client.cc:79] Completed 66000 requests. RPS: 1428.45 -I0304 23:08:21.148702 667737 grpc_client.cc:79] Completed 67000 requests. RPS: 1428.62 -I0304 23:08:21.793122 667737 grpc_client.cc:79] Completed 68000 requests. RPS: 1430.29 -I0304 23:08:22.434554 667737 grpc_client.cc:79] Completed 69000 requests. RPS: 1432.01 -I0304 23:08:23.107526 667737 grpc_client.cc:79] Completed 70000 requests. RPS: 1432.75 -I0304 23:08:23.797159 667737 grpc_client.cc:79] Completed 71000 requests. RPS: 1432.99 -I0304 23:08:24.452724 667737 grpc_client.cc:79] Completed 72000 requests. RPS: 1434.2 -I0304 23:08:25.128332 667737 grpc_client.cc:79] Completed 73000 requests. RPS: 1434.81 -I0304 23:08:26.100596 667737 grpc_client.cc:79] Completed 74000 requests. RPS: 1427.19 -I0304 23:08:26.722591 667737 grpc_client.cc:79] Completed 75000 requests. RPS: 1429.33 -I0304 23:08:27.360895 667737 grpc_client.cc:79] Completed 76000 requests. RPS: 1430.98 -I0304 23:08:28.134244 667737 grpc_client.cc:79] Completed 77000 requests. RPS: 1429 -I0304 23:08:28.790277 667737 grpc_client.cc:79] Completed 78000 requests. RPS: 1430.15 -I0304 23:08:29.428883 667737 grpc_client.cc:79] Completed 79000 requests. RPS: 1431.72 -I0304 23:08:30.177049 667737 grpc_client.cc:79] Completed 80000 requests. RPS: 1430.45 -I0304 23:08:30.804466 667737 grpc_client.cc:79] Completed 81000 requests. RPS: 1432.26 -I0304 23:08:31.467579 667737 grpc_client.cc:79] Completed 82000 requests. RPS: 1433.14 -I0304 23:08:32.192100 667737 grpc_client.cc:79] Completed 83000 requests. RPS: 1432.47 -I0304 23:08:32.871613 667737 grpc_client.cc:79] Completed 84000 requests. RPS: 1432.93 -I0304 23:08:33.519821 667737 grpc_client.cc:79] Completed 85000 requests. RPS: 1434.13 -I0304 23:08:34.197341 667737 grpc_client.cc:79] Completed 86000 requests. RPS: 1434.6 -I0304 23:08:34.900917 667737 grpc_client.cc:79] Completed 87000 requests. RPS: 1434.45 -I0304 23:08:35.541115 667737 grpc_client.cc:79] Completed 88000 requests. RPS: 1435.78 -I0304 23:08:36.380994 667737 grpc_client.cc:79] Completed 89000 requests. RPS: 1432.47 -I0304 23:08:37.233217 667737 grpc_client.cc:79] Completed 90000 requests. RPS: 1428.96 -I0304 23:08:37.901217 667737 grpc_client.cc:79] Completed 91000 requests. RPS: 1429.68 -I0304 23:08:38.541196 667737 grpc_client.cc:79] Completed 92000 requests. RPS: 1431 -I0304 23:08:39.397644 667737 grpc_client.cc:79] Completed 93000 requests. RPS: 1427.54 -I0304 23:08:40.224556 667737 grpc_client.cc:79] Completed 94000 requests. RPS: 1424.8 -I0304 23:08:40.929085 667737 grpc_client.cc:79] Completed 95000 requests. RPS: 1424.74 -I0304 23:08:41.631023 667737 grpc_client.cc:79] Completed 96000 requests. RPS: 1424.74 -I0304 23:08:42.239745 667737 grpc_client.cc:79] Completed 97000 requests. RPS: 1426.69 -I0304 23:08:42.897142 667737 grpc_client.cc:79] Completed 98000 requests. RPS: 1427.6 -I0304 23:08:43.655720 667737 grpc_client.cc:79] Completed 99000 requests. RPS: 1426.4 -I0304 23:08:44.266496 667737 grpc_client.cc:79] Completed 100000 requests. RPS: 1428.24 -I0304 23:08:44.902970 667737 grpc_client.cc:79] Completed 101000 requests. RPS: 1429.53 -I0304 23:08:45.638381 667737 grpc_client.cc:79] Completed 102000 requests. RPS: 1428.81 -I0304 23:08:46.518213 667737 grpc_client.cc:79] Completed 103000 requests. RPS: 1425.25 -I0304 23:08:47.591785 667737 grpc_client.cc:79] Completed 104000 requests. RPS: 1418.03 -I0304 23:08:48.673178 667737 grpc_client.cc:79] Completed 105000 requests. RPS: 1410.86 -I0304 23:08:49.377706 667737 grpc_client.cc:79] Completed 106000 requests. RPS: 1410.94 -I0304 23:08:50.151447 667737 grpc_client.cc:79] Completed 107000 requests. RPS: 1409.73 -I0304 23:08:50.800095 667737 grpc_client.cc:79] Completed 108000 requests. RPS: 1410.85 -I0304 23:08:51.422334 667737 grpc_client.cc:79] Completed 109000 requests. RPS: 1412.43 -I0304 23:08:52.132030 667737 grpc_client.cc:79] Completed 110000 requests. RPS: 1412.4 -I0304 23:08:52.798607 667737 grpc_client.cc:79] Completed 111000 requests. RPS: 1413.15 -I0304 23:08:53.462203 667737 grpc_client.cc:79] Completed 112000 requests. RPS: 1413.93 -I0304 23:08:54.143149 667737 grpc_client.cc:79] Completed 113000 requests. RPS: 1414.4 -I0304 23:08:54.829747 667737 grpc_client.cc:79] Completed 114000 requests. RPS: 1414.75 -I0304 23:08:55.478785 667737 grpc_client.cc:79] Completed 115000 requests. RPS: 1415.76 -I0304 23:08:56.205015 667737 grpc_client.cc:79] Completed 116000 requests. RPS: 1415.42 -I0304 23:08:56.903509 667737 grpc_client.cc:79] Completed 117000 requests. RPS: 1415.55 -I0304 23:08:57.531544 667737 grpc_client.cc:79] Completed 118000 requests. RPS: 1416.89 -I0304 23:08:58.357008 667737 grpc_client.cc:79] Completed 119000 requests. RPS: 1414.87 -I0304 23:08:59.077845 667737 grpc_client.cc:79] Completed 120000 requests. RPS: 1414.64 -I0304 23:08:59.890843 667737 grpc_client.cc:79] Completed 121000 requests. RPS: 1412.88 -I0304 23:09:00.764171 667737 grpc_client.cc:79] Completed 122000 requests. RPS: 1410.18 -I0304 23:09:01.824526 667737 grpc_client.cc:79] Completed 123000 requests. RPS: 1404.52 -I0304 23:09:03.181870 667737 grpc_client.cc:79] Completed 124000 requests. RPS: 1394.33 -I0304 23:09:04.004467 667737 grpc_client.cc:79] Completed 125000 requests. RPS: 1392.69 -I0304 23:09:04.896066 667737 grpc_client.cc:79] Completed 126000 requests. RPS: 1390.03 -I0304 23:09:05.589202 667737 grpc_client.cc:79] Completed 127000 requests. RPS: 1390.43 -I0304 23:09:06.256667 667737 grpc_client.cc:79] Completed 128000 requests. RPS: 1391.21 -I0304 23:09:06.905709 667737 grpc_client.cc:79] Completed 129000 requests. RPS: 1392.26 -I0304 23:09:07.794396 667737 grpc_client.cc:79] Completed 130000 requests. RPS: 1389.72 -I0304 23:09:08.452801 667737 grpc_client.cc:79] Completed 131000 requests. RPS: 1390.62 -I0304 23:09:08.478474 667737 grpc_client.cc:94] Finished benchmark. -I0304 23:09:08.478523 667737 grpc_client.cc:95] Total RPS: 1391.01 -I0304 23:09:08.480908 667737 grpc_client.cc:103] Latency Stats (ms): -I0304 23:09:08.480923 667737 grpc_client.cc:104] Average: 71.7912 -I0304 23:09:08.480937 667737 grpc_client.cc:105] StdDev: 22.6731 -I0304 23:09:08.480947 667737 grpc_client.cc:106] Min: 1.76114 -I0304 23:09:08.482389 667737 grpc_client.cc:107] Max: 252.318 -I0304 23:09:08.483842 667737 grpc_client.cc:108] Samples: 131072 +I0309 01:38:11.316409 1084347 client.cc:232] Starting HTTP/2 benchmark client... +I0309 01:38:11.316674 1084347 client.cc:193] Connected to server. +I0309 01:38:11.344276 1084347 client.cc:80] Completed 1000 requests. RPS: 36306.9 +I0309 01:38:11.368931 1084347 client.cc:80] Completed 2000 requests. RPS: 38315.6 +I0309 01:38:11.399415 1084347 client.cc:80] Completed 3000 requests. RPS: 36284 +I0309 01:38:11.447078 1084347 client.cc:80] Completed 4000 requests. RPS: 30688 +I0309 01:38:11.481294 1084347 client.cc:80] Completed 5000 requests. RPS: 30383.9 +I0309 01:38:11.526778 1084347 client.cc:80] Completed 6000 requests. RPS: 28565.3 +I0309 01:38:11.580935 1084347 client.cc:80] Completed 7000 requests. RPS: 26495 +I0309 01:38:11.617604 1084347 client.cc:80] Completed 8000 requests. RPS: 26589.5 +I0309 01:38:11.641957 1084347 client.cc:80] Completed 9000 requests. RPS: 27673.3 +I0309 01:38:11.670096 1084347 client.cc:80] Completed 10000 requests. RPS: 28299.6 +I0309 01:38:11.711401 1084347 client.cc:80] Completed 11000 requests. RPS: 27871.6 +I0309 01:38:11.745560 1084347 client.cc:80] Completed 12000 requests. RPS: 27983.3 +I0309 01:38:11.773481 1084347 client.cc:80] Completed 13000 requests. RPS: 28462.1 +I0309 01:38:11.802961 1084347 client.cc:80] Completed 14000 requests. RPS: 28793.1 +I0309 01:38:11.829263 1084347 client.cc:80] Completed 15000 requests. RPS: 29266.6 +I0309 01:38:11.861379 1084347 client.cc:80] Completed 16000 requests. RPS: 29376.9 +I0309 01:38:11.888942 1084347 client.cc:80] Completed 17000 requests. RPS: 29709.4 +I0309 01:38:11.913996 1084347 client.cc:80] Completed 18000 requests. RPS: 30137.5 +I0309 01:38:11.931903 1084347 client.cc:80] Completed 19000 requests. RPS: 30885.8 +I0309 01:38:11.948686 1084347 client.cc:80] Completed 20000 requests. RPS: 31648 +I0309 01:38:11.966771 1084347 client.cc:80] Completed 21000 requests. RPS: 32305.8 +I0309 01:38:11.984211 1084347 client.cc:80] Completed 22000 requests. RPS: 32959.9 +I0309 01:38:12.000964 1084347 client.cc:80] Completed 23000 requests. RPS: 33614.4 +I0309 01:38:12.017795 1084347 client.cc:80] Completed 24000 requests. RPS: 34233.8 +I0309 01:38:12.033360 1084347 client.cc:80] Completed 25000 requests. RPS: 34885.7 +I0309 01:38:12.050673 1084347 client.cc:80] Completed 26000 requests. RPS: 35425.3 +I0309 01:38:12.069318 1084347 client.cc:80] Completed 27000 requests. RPS: 35876.4 +I0309 01:38:12.089540 1084347 client.cc:80] Completed 28000 requests. RPS: 36231.6 +I0309 01:38:12.108889 1084347 client.cc:80] Completed 29000 requests. RPS: 36609 +I0309 01:38:12.126869 1084347 client.cc:80] Completed 30000 requests. RPS: 37030.8 +I0309 01:38:12.143628 1084347 client.cc:80] Completed 31000 requests. RPS: 37489.7 +I0309 01:38:12.164345 1084347 client.cc:80] Completed 32000 requests. RPS: 37753.2 +I0309 01:38:12.186789 1084347 client.cc:80] Completed 33000 requests. RPS: 37928.6 +I0309 01:38:12.204939 1084347 client.cc:80] Completed 34000 requests. RPS: 38279.5 +I0309 01:38:12.221726 1084347 client.cc:80] Completed 35000 requests. RPS: 38674.3 +I0309 01:38:12.238410 1084347 client.cc:80] Completed 36000 requests. RPS: 39059.3 +I0309 01:38:12.255635 1084347 client.cc:80] Completed 37000 requests. RPS: 39407.7 +I0309 01:38:12.272982 1084347 client.cc:80] Completed 38000 requests. RPS: 39738.6 +I0309 01:38:12.290762 1084347 client.cc:80] Completed 39000 requests. RPS: 40039.9 +I0309 01:38:12.308500 1084347 client.cc:80] Completed 40000 requests. RPS: 40332.1 +I0309 01:38:12.325485 1084347 client.cc:80] Completed 41000 requests. RPS: 40644.3 +I0309 01:38:12.342309 1084347 client.cc:80] Completed 42000 requests. RPS: 40952.6 +I0309 01:38:12.367638 1084347 client.cc:80] Completed 43000 requests. RPS: 40917.1 +I0309 01:38:12.383718 1084347 client.cc:80] Completed 44000 requests. RPS: 41237.7 +I0309 01:38:12.408543 1084347 client.cc:80] Completed 45000 requests. RPS: 41216 +I0309 01:38:12.425364 1084347 client.cc:80] Completed 46000 requests. RPS: 41492.7 +I0309 01:38:12.445683 1084347 client.cc:80] Completed 47000 requests. RPS: 41631.6 +I0309 01:38:12.468352 1084347 client.cc:80] Completed 48000 requests. RPS: 41680.5 +I0309 01:38:12.484380 1084347 client.cc:80] Completed 49000 requests. RPS: 41964.8 +I0309 01:38:12.507327 1084347 client.cc:80] Completed 50000 requests. RPS: 41995.8 +I0309 01:38:12.526601 1084347 client.cc:80] Completed 51000 requests. RPS: 42153.4 +I0309 01:38:12.543781 1084347 client.cc:80] Completed 52000 requests. RPS: 42378.1 +I0309 01:38:12.563729 1084347 client.cc:80] Completed 53000 requests. RPS: 42502.1 +I0309 01:38:12.580247 1084347 client.cc:80] Completed 54000 requests. RPS: 42738.2 +I0309 01:38:12.597458 1084347 client.cc:80] Completed 55000 requests. RPS: 42944.4 +I0309 01:38:12.615114 1084347 client.cc:80] Completed 56000 requests. RPS: 43130.7 +I0309 01:38:12.631972 1084347 client.cc:80] Completed 57000 requests. RPS: 43338.1 +I0309 01:38:12.648757 1084347 client.cc:80] Completed 58000 requests. RPS: 43542.8 +I0309 01:38:12.666518 1084347 client.cc:80] Completed 59000 requests. RPS: 43710.7 +I0309 01:38:12.683978 1084347 client.cc:80] Completed 60000 requests. RPS: 43883.9 +I0309 01:38:12.700365 1084347 client.cc:80] Completed 61000 requests. RPS: 44086.9 +I0309 01:38:12.717972 1084347 client.cc:80] Completed 62000 requests. RPS: 44246.6 +I0309 01:38:12.734537 1084347 client.cc:80] Completed 63000 requests. RPS: 44434.9 +I0309 01:38:12.750835 1084347 client.cc:80] Completed 64000 requests. RPS: 44627.2 +I0309 01:38:12.768283 1084347 client.cc:80] Completed 65000 requests. RPS: 44779.7 +I0309 01:38:12.785473 1084347 client.cc:80] Completed 66000 requests. RPS: 44936.5 +I0309 01:38:12.803571 1084347 client.cc:80] Completed 67000 requests. RPS: 45062.1 +I0309 01:38:12.819944 1084347 client.cc:80] Completed 68000 requests. RPS: 45236.5 +I0309 01:38:12.838765 1084347 client.cc:80] Completed 69000 requests. RPS: 45334.2 +I0309 01:38:12.862160 1084347 client.cc:80] Completed 70000 requests. RPS: 45294.9 +I0309 01:38:12.885057 1084347 client.cc:80] Completed 71000 requests. RPS: 45271.3 +I0309 01:38:12.902658 1084347 client.cc:80] Completed 72000 requests. RPS: 45399.4 +I0309 01:38:12.932614 1084347 client.cc:80] Completed 73000 requests. RPS: 45176.6 +I0309 01:38:12.971535 1084347 client.cc:80] Completed 74000 requests. RPS: 44718.3 +I0309 01:38:13.027554 1084347 client.cc:80] Completed 75000 requests. RPS: 43838.6 +I0309 01:38:13.064090 1084347 client.cc:80] Completed 76000 requests. RPS: 43494.3 +I0309 01:38:13.098461 1084347 client.cc:80] Completed 77000 requests. RPS: 43216.5 +I0309 01:38:13.125763 1084347 client.cc:80] Completed 78000 requests. RPS: 43117 +I0309 01:38:13.146262 1084347 client.cc:80] Completed 79000 requests. RPS: 43180.5 +I0309 01:38:13.171788 1084347 client.cc:80] Completed 80000 requests. RPS: 43125.4 +I0309 01:38:13.197563 1084347 client.cc:80] Completed 81000 requests. RPS: 43066.1 +I0309 01:38:13.221295 1084347 client.cc:80] Completed 82000 requests. RPS: 43054.5 +I0309 01:38:13.242748 1084347 client.cc:80] Completed 83000 requests. RPS: 43094.2 +I0309 01:38:13.263156 1084347 client.cc:80] Completed 84000 requests. RPS: 43156.1 +I0309 01:38:13.286358 1084347 client.cc:80] Completed 85000 requests. RPS: 43155.4 +I0309 01:38:13.314562 1084347 client.cc:80] Completed 86000 requests. RPS: 43046.7 +I0309 01:38:13.339529 1084347 client.cc:80] Completed 87000 requests. RPS: 43009.8 +I0309 01:38:13.359740 1084347 client.cc:80] Completed 88000 requests. RPS: 43073.8 +I0309 01:38:13.387961 1084347 client.cc:80] Completed 89000 requests. RPS: 42969.7 +I0309 01:38:13.411426 1084347 client.cc:80] Completed 90000 requests. RPS: 42965.7 +I0309 01:38:13.438110 1084347 client.cc:80] Completed 91000 requests. RPS: 42896.7 +I0309 01:38:13.462065 1084347 client.cc:80] Completed 92000 requests. RPS: 42883.8 +I0309 01:38:13.481994 1084347 client.cc:80] Completed 93000 requests. RPS: 42950.9 +I0309 01:38:13.508650 1084347 client.cc:80] Completed 94000 requests. RPS: 42884.9 +I0309 01:38:13.530142 1084347 client.cc:80] Completed 95000 requests. RPS: 42920.2 +I0309 01:38:13.558636 1084347 client.cc:80] Completed 96000 requests. RPS: 42820.8 +I0309 01:38:13.578881 1084347 client.cc:80] Completed 97000 requests. RPS: 42879.6 +I0309 01:38:13.601910 1084347 client.cc:80] Completed 98000 requests. RPS: 42885.1 +I0309 01:38:13.626068 1084347 client.cc:80] Completed 99000 requests. RPS: 42869.5 +I0309 01:38:13.649168 1084347 client.cc:80] Completed 100000 requests. RPS: 42873.6 +I0309 01:38:13.674367 1084347 client.cc:80] Completed 101000 requests. RPS: 42839.6 +I0309 01:38:13.701760 1084347 client.cc:80] Completed 102000 requests. RPS: 42766.8 +I0309 01:38:13.720911 1084347 client.cc:80] Completed 103000 requests. RPS: 42842.1 +I0309 01:38:13.741318 1084347 client.cc:80] Completed 104000 requests. RPS: 42894 +I0309 01:38:13.770517 1084347 client.cc:80] Completed 105000 requests. RPS: 42791.1 +I0309 01:38:13.794428 1084347 client.cc:80] Completed 106000 requests. RPS: 42781.7 +I0309 01:38:13.812194 1084347 client.cc:80] Completed 107000 requests. RPS: 42877.8 +I0309 01:38:13.828350 1084347 client.cc:80] Completed 108000 requests. RPS: 43000.2 +I0309 01:38:13.844116 1084347 client.cc:80] Completed 109000 requests. RPS: 43127.6 +I0309 01:38:13.866128 1084347 client.cc:80] Completed 110000 requests. RPS: 43147.5 +I0309 01:38:13.892945 1084347 client.cc:80] Completed 111000 requests. RPS: 43086.5 +I0309 01:38:13.914110 1084347 client.cc:80] Completed 112000 requests. RPS: 43120.4 +I0309 01:38:13.931606 1084347 client.cc:80] Completed 113000 requests. RPS: 43214.3 +I0309 01:38:13.948516 1084347 client.cc:80] Completed 114000 requests. RPS: 43316.6 +I0309 01:38:13.967486 1084347 client.cc:80] Completed 115000 requests. RPS: 43383.9 +I0309 01:38:13.984928 1084347 client.cc:80] Completed 116000 requests. RPS: 43475.1 +I0309 01:38:14.001044 1084347 client.cc:80] Completed 117000 requests. RPS: 43586.6 +I0309 01:38:14.018342 1084347 client.cc:80] Completed 118000 requests. RPS: 43677.7 +I0309 01:38:14.036181 1084347 client.cc:80] Completed 119000 requests. RPS: 43758.9 +I0309 01:38:14.051993 1084347 client.cc:80] Completed 120000 requests. RPS: 43871.5 +I0309 01:38:14.067472 1084347 client.cc:80] Completed 121000 requests. RPS: 43988.2 +I0309 01:38:14.083918 1084347 client.cc:80] Completed 122000 requests. RPS: 44088.1 +I0309 01:38:14.103264 1084347 client.cc:80] Completed 123000 requests. RPS: 44140.9 +I0309 01:38:14.118195 1084347 client.cc:80] Completed 124000 requests. RPS: 44262.6 +I0309 01:38:14.135454 1084347 client.cc:80] Completed 125000 requests. RPS: 44346.4 +I0309 01:38:14.153009 1084347 client.cc:80] Completed 126000 requests. RPS: 44424.5 +I0309 01:38:14.168640 1084347 client.cc:80] Completed 127000 requests. RPS: 44531.6 +I0309 01:38:14.183018 1084347 client.cc:80] Completed 128000 requests. RPS: 44657.1 +I0309 01:38:14.198552 1084347 client.cc:80] Completed 129000 requests. RPS: 44763.4 +I0309 01:38:14.214050 1084347 client.cc:80] Completed 130000 requests. RPS: 44869.1 +I0309 01:38:14.228382 1084347 client.cc:80] Completed 131000 requests. RPS: 44991.7 +I0309 01:38:14.233653 1084347 client.cc:270] Finished benchmark. +I0309 01:38:14.233726 1084347 client.cc:271] Total RPS: 44969 +I0309 01:38:14.239788 1084347 client.cc:280] Latency Stats (ms): +I0309 01:38:14.239865 1084347 client.cc:281] Average: 2.22203 +I0309 01:38:14.239897 1084347 client.cc:282] StdDev: 1.57251 +I0309 01:38:14.239915 1084347 client.cc:283] Min: 0.64824 +I0309 01:38:14.242263 1084347 client.cc:284] Max: 17.2912 +I0309 01:38:14.244520 1084347 client.cc:285] Samples: 131171 === Benchmark for 128KiB payload (131072 bytes), 1024 requests === --- Raw HTTP/2 --- -I0304 23:09:09.494452 743731 client.cc:232] Starting HTTP/2 benchmark client... -I0304 23:09:09.494718 743731 client.cc:193] Connected to server. -I0304 23:09:09.954262 743731 client.cc:80] Completed 1000 requests. RPS: 2177.05 -I0304 23:09:09.980207 743731 client.cc:270] Finished benchmark. -I0304 23:09:09.980259 743731 client.cc:271] Total RPS: 2314.11 -I0304 23:09:09.980319 743731 client.cc:280] Latency Stats (ms): -I0304 23:09:09.980330 743731 client.cc:281] Average: 42.5598 -I0304 23:09:09.980348 743731 client.cc:282] StdDev: 13.0792 -I0304 23:09:09.980361 743731 client.cc:283] Min: 17.7423 -I0304 23:09:09.980394 743731 client.cc:284] Max: 70.7927 -I0304 23:09:09.980426 743731 client.cc:285] Samples: 1123 - ---- gRPC --- -I0304 23:09:10.990232 743774 grpc_client.cc:138] Starting gRPC benchmark client connecting to 127.0.0.1:50051 -I0304 23:09:12.037748 743774 grpc_client.cc:79] Completed 1000 requests. RPS: 954.708 -I0304 23:09:12.059107 743774 grpc_client.cc:94] Finished benchmark. -I0304 23:09:12.059150 743774 grpc_client.cc:95] Total RPS: 958.084 -I0304 23:09:12.059210 743774 grpc_client.cc:103] Latency Stats (ms): -I0304 23:09:12.059222 743774 grpc_client.cc:104] Average: 99.1384 -I0304 23:09:12.059234 743774 grpc_client.cc:105] StdDev: 38.9064 -I0304 23:09:12.059245 743774 grpc_client.cc:106] Min: 23.9131 -I0304 23:09:12.059277 743774 grpc_client.cc:107] Max: 252.077 -I0304 23:09:12.059309 743774 grpc_client.cc:108] Samples: 1024 +I0309 01:38:15.261922 1084463 client.cc:232] Starting HTTP/2 benchmark client... +I0309 01:38:15.262270 1084463 client.cc:193] Connected to server. +I0309 01:38:16.058908 1084463 client.cc:80] Completed 1000 requests. RPS: 1255.4 +I0309 01:38:16.125849 1084463 client.cc:270] Finished benchmark. +I0309 01:38:16.125925 1084463 client.cc:271] Total RPS: 1300.52 +I0309 01:38:16.126006 1084463 client.cc:280] Latency Stats (ms): +I0309 01:38:16.126027 1084463 client.cc:281] Average: 74.4612 +I0309 01:38:16.126046 1084463 client.cc:282] StdDev: 23.7478 +I0309 01:38:16.126062 1084463 client.cc:283] Min: 49.5049 +I0309 01:38:16.126099 1084463 client.cc:284] Max: 153.833 +I0309 01:38:16.126136 1084463 client.cc:285] Samples: 1123 === Benchmark for 1MiB payload (1048576 bytes), 128 requests === --- Raw HTTP/2 --- -I0304 23:09:13.073443 744427 client.cc:232] Starting HTTP/2 benchmark client... -I0304 23:09:13.073683 744427 client.cc:193] Connected to server. -I0304 23:09:13.882539 744427 client.cc:270] Finished benchmark. -I0304 23:09:13.882602 744427 client.cc:271] Total RPS: 280.664 -I0304 23:09:13.882681 744427 client.cc:280] Latency Stats (ms): -I0304 23:09:13.882692 744427 client.cc:281] Average: 335.413 -I0304 23:09:13.882705 744427 client.cc:282] StdDev: 135.811 -I0304 23:09:13.882715 744427 client.cc:283] Min: 175.332 -I0304 23:09:13.882733 744427 client.cc:284] Max: 599.52 -I0304 23:09:13.882748 744427 client.cc:285] Samples: 227 - ---- gRPC --- -I0304 23:09:14.907154 744462 grpc_client.cc:138] Starting gRPC benchmark client connecting to 127.0.0.1:50051 -I0304 23:09:15.462439 744462 grpc_client.cc:94] Finished benchmark. -I0304 23:09:15.462512 744462 grpc_client.cc:95] Total RPS: 230.681 -I0304 23:09:15.462667 744462 grpc_client.cc:103] Latency Stats (ms): -I0304 23:09:15.462685 744462 grpc_client.cc:104] Average: 265.167 -I0304 23:09:15.462704 744462 grpc_client.cc:105] StdDev: 78.8764 -I0304 23:09:15.462755 744462 grpc_client.cc:106] Min: 32.9336 -I0304 23:09:15.462776 744462 grpc_client.cc:107] Max: 510.218 -I0304 23:09:15.462794 744462 grpc_client.cc:108] Samples: 128 +I0309 01:38:17.134278 1084518 client.cc:232] Starting HTTP/2 benchmark client... +I0309 01:38:17.134553 1084518 client.cc:193] Connected to server. +I0309 01:38:18.988779 1084518 client.cc:270] Finished benchmark. +I0309 01:38:18.988857 1084518 client.cc:271] Total RPS: 122.883 +I0309 01:38:18.988948 1084518 client.cc:280] Latency Stats (ms): +I0309 01:38:18.988965 1084518 client.cc:281] Average: 754.383 +I0309 01:38:18.988985 1084518 client.cc:282] StdDev: 289.523 +I0309 01:38:18.989000 1084518 client.cc:283] Min: 427.25 +I0309 01:38:18.989021 1084518 client.cc:284] Max: 1328.87 +I0309 01:38:18.989042 1084518 client.cc:285] Samples: 227 diff --git a/wish/cpp/src/cpp.code-workspace b/wish/cpp/src/cpp.code-workspace new file mode 100644 index 0000000..bab1b7f --- /dev/null +++ b/wish/cpp/src/cpp.code-workspace @@ -0,0 +1,8 @@ +{ + "folders": [ + { + "path": ".." + } + ], + "settings": {} +} \ No newline at end of file From 87a9feff0f0fdf6e9893a40526a256f1cbf00772 Mon Sep 17 00:00:00 2001 From: Takeshi Yoshino <4511440+tyoshino@users.noreply.github.com> Date: Mon, 9 Mar 2026 01:50:46 +0000 Subject: [PATCH 5/5] fix --- wish/cpp/src/cpp.code-workspace | 8 -------- 1 file changed, 8 deletions(-) delete mode 100644 wish/cpp/src/cpp.code-workspace diff --git a/wish/cpp/src/cpp.code-workspace b/wish/cpp/src/cpp.code-workspace deleted file mode 100644 index bab1b7f..0000000 --- a/wish/cpp/src/cpp.code-workspace +++ /dev/null @@ -1,8 +0,0 @@ -{ - "folders": [ - { - "path": ".." - } - ], - "settings": {} -} \ No newline at end of file