|
|
@ -55,6 +55,7 @@ |
|
|
|
#include <grpc/support/log.h> |
|
|
|
#include <grpc/support/log.h> |
|
|
|
#include <grpc/support/thd.h> |
|
|
|
#include <grpc/support/thd.h> |
|
|
|
#include <grpc/support/time.h> |
|
|
|
#include <grpc/support/time.h> |
|
|
|
|
|
|
|
#include <grpc/support/useful.h> |
|
|
|
|
|
|
|
|
|
|
|
typedef struct fd_pair { |
|
|
|
typedef struct fd_pair { |
|
|
|
int read_fd; |
|
|
|
int read_fd; |
|
|
@ -68,6 +69,7 @@ typedef struct thread_args { |
|
|
|
int (*write_bytes)(struct thread_args *args, char *buf); |
|
|
|
int (*write_bytes)(struct thread_args *args, char *buf); |
|
|
|
int (*setup)(struct thread_args *args); |
|
|
|
int (*setup)(struct thread_args *args); |
|
|
|
int epoll_fd; |
|
|
|
int epoll_fd; |
|
|
|
|
|
|
|
char *strategy_name; |
|
|
|
} thread_args; |
|
|
|
} thread_args; |
|
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
/*
|
|
|
@ -548,8 +550,71 @@ static test_strategy test_strategies[] = { |
|
|
|
{"spin_read", spin_read_bytes, set_socket_nonblocking}, |
|
|
|
{"spin_read", spin_read_bytes, set_socket_nonblocking}, |
|
|
|
{"spin_poll", poll_read_bytes_spin, set_socket_nonblocking}}; |
|
|
|
{"spin_poll", poll_read_bytes_spin, set_socket_nonblocking}}; |
|
|
|
|
|
|
|
|
|
|
|
int main(int argc, char **argv) { |
|
|
|
static char *socket_types[] = {"tcp", "socketpair", "pipe"}; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
int create_socket(char *socket_type, fd_pair *client_fds, fd_pair *server_fds) { |
|
|
|
|
|
|
|
if (strcmp(socket_type, "tcp") == 0) { |
|
|
|
|
|
|
|
create_sockets_tcp(client_fds, server_fds); |
|
|
|
|
|
|
|
} else if (strcmp(socket_type, "socketpair") == 0) { |
|
|
|
|
|
|
|
create_sockets_socketpair(client_fds, server_fds); |
|
|
|
|
|
|
|
} else if (strcmp(socket_type, "pipe") == 0) { |
|
|
|
|
|
|
|
create_sockets_pipe(client_fds, server_fds); |
|
|
|
|
|
|
|
} else { |
|
|
|
|
|
|
|
fprintf(stderr, "Invalid socket type %s\n", socket_type); |
|
|
|
|
|
|
|
return -1; |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
return 0; |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
static int run_benchmark(char *socket_type, thread_args *client_args, |
|
|
|
|
|
|
|
thread_args *server_args) { |
|
|
|
gpr_thd_id tid; |
|
|
|
gpr_thd_id tid; |
|
|
|
|
|
|
|
int rv = 0; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
rv = create_socket(socket_type, &client_args->fds, &server_args->fds); |
|
|
|
|
|
|
|
if (rv < 0) { |
|
|
|
|
|
|
|
return rv; |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
gpr_log(GPR_INFO, "Starting test %s %s %d", client_args->strategy_name, |
|
|
|
|
|
|
|
socket_type, client_args->msg_size); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
gpr_thd_new(&tid, server_thread_wrap, server_args, NULL); |
|
|
|
|
|
|
|
client_thread(client_args); |
|
|
|
|
|
|
|
return 0; |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
static int run_all_benchmarks(int msg_size) { |
|
|
|
|
|
|
|
int error = 0; |
|
|
|
|
|
|
|
int i; |
|
|
|
|
|
|
|
for (i = 0; i < GPR_ARRAY_SIZE(test_strategies); ++i) { |
|
|
|
|
|
|
|
test_strategy *test_strategy = &test_strategies[i]; |
|
|
|
|
|
|
|
int j; |
|
|
|
|
|
|
|
for (j = 0; j < GPR_ARRAY_SIZE(socket_types); ++j) { |
|
|
|
|
|
|
|
thread_args *client_args = malloc(sizeof(thread_args)); |
|
|
|
|
|
|
|
thread_args *server_args = malloc(sizeof(thread_args)); |
|
|
|
|
|
|
|
char *socket_type = socket_types[j]; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
client_args->read_bytes = test_strategy->read_strategy; |
|
|
|
|
|
|
|
client_args->write_bytes = blocking_write_bytes; |
|
|
|
|
|
|
|
client_args->setup = test_strategy->setup; |
|
|
|
|
|
|
|
client_args->msg_size = msg_size; |
|
|
|
|
|
|
|
client_args->strategy_name = test_strategy->name; |
|
|
|
|
|
|
|
server_args->read_bytes = test_strategy->read_strategy; |
|
|
|
|
|
|
|
server_args->write_bytes = blocking_write_bytes; |
|
|
|
|
|
|
|
server_args->setup = test_strategy->setup; |
|
|
|
|
|
|
|
server_args->msg_size = msg_size; |
|
|
|
|
|
|
|
server_args->strategy_name = test_strategy->name; |
|
|
|
|
|
|
|
error = run_benchmark(socket_type, client_args, server_args); |
|
|
|
|
|
|
|
if (error < 0) { |
|
|
|
|
|
|
|
return error; |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
return error; |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
int main(int argc, char **argv) { |
|
|
|
thread_args *client_args = malloc(sizeof(thread_args)); |
|
|
|
thread_args *client_args = malloc(sizeof(thread_args)); |
|
|
|
thread_args *server_args = malloc(sizeof(thread_args)); |
|
|
|
thread_args *server_args = malloc(sizeof(thread_args)); |
|
|
|
int msg_size = -1; |
|
|
|
int msg_size = -1; |
|
|
@ -557,6 +622,7 @@ int main(int argc, char **argv) { |
|
|
|
char *socket_type = NULL; |
|
|
|
char *socket_type = NULL; |
|
|
|
int i; |
|
|
|
int i; |
|
|
|
const test_strategy *test_strategy = NULL; |
|
|
|
const test_strategy *test_strategy = NULL; |
|
|
|
|
|
|
|
int error = 0; |
|
|
|
|
|
|
|
|
|
|
|
gpr_cmdline *cmdline = |
|
|
|
gpr_cmdline *cmdline = |
|
|
|
gpr_cmdline_create("low_level_ping_pong network benchmarking tool"); |
|
|
|
gpr_cmdline_create("low_level_ping_pong network benchmarking tool"); |
|
|
@ -569,17 +635,25 @@ int main(int argc, char **argv) { |
|
|
|
|
|
|
|
|
|
|
|
gpr_cmdline_parse(cmdline, argc, argv); |
|
|
|
gpr_cmdline_parse(cmdline, argc, argv); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if (msg_size == -1) { |
|
|
|
|
|
|
|
msg_size = 50; |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
if (read_strategy == NULL) { |
|
|
|
if (read_strategy == NULL) { |
|
|
|
read_strategy = "blocking"; |
|
|
|
gpr_log(GPR_INFO, "No strategy specified, running all benchmarks"); |
|
|
|
|
|
|
|
return run_all_benchmarks(msg_size); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
if (socket_type == NULL) { |
|
|
|
if (socket_type == NULL) { |
|
|
|
socket_type = "tcp"; |
|
|
|
socket_type = "tcp"; |
|
|
|
} |
|
|
|
} |
|
|
|
if (msg_size == -1) { |
|
|
|
if (msg_size <= 0) { |
|
|
|
msg_size = 50; |
|
|
|
fprintf(stderr, "msg_size must be > 0\n"); |
|
|
|
|
|
|
|
print_usage(argv[0]); |
|
|
|
|
|
|
|
return -1; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
for (i = 0; i < sizeof(test_strategies) / sizeof(struct test_strategy); ++i) { |
|
|
|
for (i = 0; i < GPR_ARRAY_SIZE(test_strategies); ++i) { |
|
|
|
if (!strcmp(test_strategies[i].name, read_strategy)) { |
|
|
|
if (!strcmp(test_strategies[i].name, read_strategy)) { |
|
|
|
test_strategy = &test_strategies[i]; |
|
|
|
test_strategy = &test_strategies[i]; |
|
|
|
} |
|
|
|
} |
|
|
@ -592,35 +666,16 @@ int main(int argc, char **argv) { |
|
|
|
client_args->read_bytes = test_strategy->read_strategy; |
|
|
|
client_args->read_bytes = test_strategy->read_strategy; |
|
|
|
client_args->write_bytes = blocking_write_bytes; |
|
|
|
client_args->write_bytes = blocking_write_bytes; |
|
|
|
client_args->setup = test_strategy->setup; |
|
|
|
client_args->setup = test_strategy->setup; |
|
|
|
|
|
|
|
client_args->msg_size = msg_size; |
|
|
|
|
|
|
|
client_args->strategy_name = read_strategy; |
|
|
|
server_args->read_bytes = test_strategy->read_strategy; |
|
|
|
server_args->read_bytes = test_strategy->read_strategy; |
|
|
|
server_args->write_bytes = blocking_write_bytes; |
|
|
|
server_args->write_bytes = blocking_write_bytes; |
|
|
|
server_args->setup = test_strategy->setup; |
|
|
|
server_args->setup = test_strategy->setup; |
|
|
|
|
|
|
|
|
|
|
|
if (strcmp(socket_type, "tcp") == 0) { |
|
|
|
|
|
|
|
create_sockets_tcp(&client_args->fds, &server_args->fds); |
|
|
|
|
|
|
|
} else if (strcmp(socket_type, "socketpair") == 0) { |
|
|
|
|
|
|
|
create_sockets_socketpair(&client_args->fds, &server_args->fds); |
|
|
|
|
|
|
|
} else if (strcmp(socket_type, "pipe") == 0) { |
|
|
|
|
|
|
|
create_sockets_pipe(&client_args->fds, &server_args->fds); |
|
|
|
|
|
|
|
} else { |
|
|
|
|
|
|
|
fprintf(stderr, "Invalid socket type %s\n", socket_type); |
|
|
|
|
|
|
|
return -1; |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if (msg_size <= 0) { |
|
|
|
|
|
|
|
fprintf(stderr, "msg_size must be > 0\n"); |
|
|
|
|
|
|
|
print_usage(argv[0]); |
|
|
|
|
|
|
|
return -1; |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
server_args->msg_size = msg_size; |
|
|
|
server_args->msg_size = msg_size; |
|
|
|
client_args->msg_size = msg_size; |
|
|
|
server_args->strategy_name = read_strategy; |
|
|
|
|
|
|
|
|
|
|
|
gpr_log(GPR_INFO, "Starting test %s %s %d", read_strategy, socket_type, |
|
|
|
error = run_benchmark(socket_type, client_args, server_args); |
|
|
|
msg_size); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
gpr_thd_new(&tid, server_thread_wrap, server_args, NULL); |
|
|
|
|
|
|
|
client_thread(client_args); |
|
|
|
|
|
|
|
gpr_cmdline_destroy(cmdline); |
|
|
|
gpr_cmdline_destroy(cmdline); |
|
|
|
return 0; |
|
|
|
return error; |
|
|
|
} |
|
|
|
} |
|
|
|