@ -69,6 +69,10 @@ DEEP=100
# wide is the number of client channels in multi-channel tests (1 otherwise)
# wide is the number of client channels in multi-channel tests (1 otherwise)
WIDE = 64
WIDE = 64
# For most synchronous clients, DEEP*WIDE threads will be created.
SYNC_DEEP = 10
SYNC_WIDE = 8
def _get_secargs ( is_secure ) :
def _get_secargs ( is_secure ) :
if is_secure :
if is_secure :
@ -81,6 +85,7 @@ def remove_nonproto_fields(scenario):
""" Remove special-purpose that contains some extra info about the scenario
""" Remove special-purpose that contains some extra info about the scenario
but don ' t belong to the ScenarioConfig protobuf message " " "
but don ' t belong to the ScenarioConfig protobuf message " " "
scenario . pop ( ' CATEGORIES ' , None )
scenario . pop ( ' CATEGORIES ' , None )
scenario . pop ( ' CLIENT_LANGUAGE ' , None )
scenario . pop ( ' SERVER_LANGUAGE ' , None )
scenario . pop ( ' SERVER_LANGUAGE ' , None )
return scenario
return scenario
@ -89,7 +94,8 @@ def _ping_pong_scenario(name, rpc_type,
client_type , server_type ,
client_type , server_type ,
secure = True ,
secure = True ,
use_generic_payload = False ,
use_generic_payload = False ,
use_unconstrained_client = False ,
unconstrained_client = None ,
client_language = None ,
server_language = None ,
server_language = None ,
server_core_limit = 0 ,
server_core_limit = 0 ,
async_server_threads = 0 ,
async_server_threads = 0 ,
@ -130,18 +136,28 @@ def _ping_pong_scenario(name, rpc_type,
# For proto payload, only the client should get the config.
# For proto payload, only the client should get the config.
scenario [ ' client_config ' ] [ ' payload_config ' ] = EMPTY_PROTO_PAYLOAD
scenario [ ' client_config ' ] [ ' payload_config ' ] = EMPTY_PROTO_PAYLOAD
if use_unconstrained_client :
if unconstrained_client :
if unconstrained_client == ' async ' :
deep = DEEP
wide = WIDE
elif unconstrained_client == ' sync ' :
deep = SYNC_DEEP
wide = SYNC_WIDE
else :
raise Exception ( ' Illegal value of unconstrained_client option. ' )
scenario [ ' num_clients ' ] = 0 # use as many client as available.
scenario [ ' num_clients ' ] = 0 # use as many client as available.
# TODO(jtattermusch): for SYNC_CLIENT, this will create 100*64 threads
scenario [ ' client_config ' ] [ ' outstanding_rpcs_per_channel ' ] = deep
# and that's probably too much (at least for wrapped languages).
scenario [ ' client_config ' ] [ ' client_channels ' ] = wide
scenario [ ' client_config ' ] [ ' outstanding_rpcs_per_channel ' ] = DEEP
scenario [ ' client_config ' ] [ ' client_channels ' ] = WIDE
scenario [ ' client_config ' ] [ ' async_client_threads ' ] = 0
scenario [ ' client_config ' ] [ ' async_client_threads ' ] = 0
else :
else :
scenario [ ' client_config ' ] [ ' outstanding_rpcs_per_channel ' ] = 1
scenario [ ' client_config ' ] [ ' outstanding_rpcs_per_channel ' ] = 1
scenario [ ' client_config ' ] [ ' client_channels ' ] = 1
scenario [ ' client_config ' ] [ ' client_channels ' ] = 1
scenario [ ' client_config ' ] [ ' async_client_threads ' ] = 1
scenario [ ' client_config ' ] [ ' async_client_threads ' ] = 1
if client_language :
# the CLIENT_LANGUAGE field is recognized by run_performance_tests.py
scenario [ ' CLIENT_LANGUAGE ' ] = client_language
if server_language :
if server_language :
# the SERVER_LANGUAGE field is recognized by run_performance_tests.py
# the SERVER_LANGUAGE field is recognized by run_performance_tests.py
scenario [ ' SERVER_LANGUAGE ' ] = server_language
scenario [ ' SERVER_LANGUAGE ' ] = server_language
@ -196,27 +212,27 @@ class CXXLanguage:
yield _ping_pong_scenario (
yield _ping_pong_scenario (
' cpp_protobuf_async_unary_qps_unconstrained_ %s ' % secstr , rpc_type = ' UNARY ' ,
' cpp_protobuf_async_unary_qps_unconstrained_ %s ' % secstr , rpc_type = ' UNARY ' ,
client_type = ' ASYNC_CLIENT ' , server_type = ' ASYNC_SERVER ' ,
client_type = ' ASYNC_CLIENT ' , server_type = ' ASYNC_SERVER ' ,
use_u nconstrained_client = True ,
unconstrained_client = ' async ' ,
secure = secure ,
secure = secure ,
categories = smoketest_categories )
categories = smoketest_categories )
yield _ping_pong_scenario (
yield _ping_pong_scenario (
' cpp_protobuf_async_streaming_qps_unconstrained_ %s ' % secstr , rpc_type = ' STREAMING ' ,
' cpp_protobuf_async_streaming_qps_unconstrained_ %s ' % secstr , rpc_type = ' STREAMING ' ,
client_type = ' ASYNC_CLIENT ' , server_type = ' ASYNC_SERVER ' ,
client_type = ' ASYNC_CLIENT ' , server_type = ' ASYNC_SERVER ' ,
use_u nconstrained_client = True ,
unconstrained_client = ' async ' ,
secure = secure )
secure = secure )
yield _ping_pong_scenario (
yield _ping_pong_scenario (
' cpp_generic_async_streaming_qps_unconstrained_ %s ' % secstr , rpc_type = ' STREAMING ' ,
' cpp_generic_async_streaming_qps_unconstrained_ %s ' % secstr , rpc_type = ' STREAMING ' ,
client_type = ' ASYNC_CLIENT ' , server_type = ' ASYNC_GENERIC_SERVER ' ,
client_type = ' ASYNC_CLIENT ' , server_type = ' ASYNC_GENERIC_SERVER ' ,
use_u nconstrained_client = True , use_generic_payload = True ,
unconstrained_client = ' async ' , use_generic_payload = True ,
secure = secure ,
secure = secure ,
categories = smoketest_categories )
categories = smoketest_categories )
yield _ping_pong_scenario (
yield _ping_pong_scenario (
' cpp_generic_async_streaming_qps_one_server_core_ %s ' % secstr , rpc_type = ' STREAMING ' ,
' cpp_generic_async_streaming_qps_one_server_core_ %s ' % secstr , rpc_type = ' STREAMING ' ,
client_type = ' ASYNC_CLIENT ' , server_type = ' ASYNC_GENERIC_SERVER ' ,
client_type = ' ASYNC_CLIENT ' , server_type = ' ASYNC_GENERIC_SERVER ' ,
use_u nconstrained_client = True , use_generic_payload = True ,
unconstrained_client = ' async ' , use_generic_payload = True ,
server_core_limit = 1 , async_server_threads = 1 ,
server_core_limit = 1 , async_server_threads = 1 ,
secure = secure )
secure = secure )
@ -258,13 +274,13 @@ class CSharpLanguage:
yield _ping_pong_scenario (
yield _ping_pong_scenario (
' csharp_protobuf_async_unary_qps_unconstrained ' , rpc_type = ' UNARY ' ,
' csharp_protobuf_async_unary_qps_unconstrained ' , rpc_type = ' UNARY ' ,
client_type = ' ASYNC_CLIENT ' , server_type = ' ASYNC_SERVER ' ,
client_type = ' ASYNC_CLIENT ' , server_type = ' ASYNC_SERVER ' ,
use_u nconstrained_client = True ,
unconstrained_client = ' async ' ,
categories = [ SMOKETEST ] )
categories = [ SMOKETEST ] )
yield _ping_pong_scenario (
yield _ping_pong_scenario (
' csharp_protobuf_async_streaming_qps_unconstrained ' , rpc_type = ' STREAMING ' ,
' csharp_protobuf_async_streaming_qps_unconstrained ' , rpc_type = ' STREAMING ' ,
client_type = ' ASYNC_CLIENT ' , server_type = ' ASYNC_SERVER ' ,
client_type = ' ASYNC_CLIENT ' , server_type = ' ASYNC_SERVER ' ,
use_u nconstrained_client = True )
unconstrained_client = ' async ' )
yield _ping_pong_scenario (
yield _ping_pong_scenario (
' csharp_to_cpp_protobuf_sync_unary_ping_pong ' , rpc_type = ' UNARY ' ,
' csharp_to_cpp_protobuf_sync_unary_ping_pong ' , rpc_type = ' UNARY ' ,
@ -277,6 +293,22 @@ class CSharpLanguage:
client_type = ' ASYNC_CLIENT ' , server_type = ' ASYNC_SERVER ' ,
client_type = ' ASYNC_CLIENT ' , server_type = ' ASYNC_SERVER ' ,
server_language = ' c++ ' , server_core_limit = 1 , async_server_threads = 1 )
server_language = ' c++ ' , server_core_limit = 1 , async_server_threads = 1 )
yield _ping_pong_scenario (
' csharp_to_cpp_protobuf_async_unary_qps_unconstrained ' , rpc_type = ' UNARY ' ,
client_type = ' ASYNC_CLIENT ' , server_type = ' ASYNC_SERVER ' ,
unconstrained_client = ' async ' , server_language = ' c++ ' )
yield _ping_pong_scenario (
' csharp_to_cpp_protobuf_sync_to_async_unary_qps_unconstrained ' , rpc_type = ' UNARY ' ,
client_type = ' SYNC_CLIENT ' , server_type = ' ASYNC_SERVER ' ,
unconstrained_client = ' sync ' , server_language = ' c++ ' )
yield _ping_pong_scenario (
' cpp_to_csharp_protobuf_async_unary_qps_unconstrained ' , rpc_type = ' UNARY ' ,
client_type = ' ASYNC_CLIENT ' , server_type = ' ASYNC_SERVER ' ,
unconstrained_client = ' async ' , client_language = ' c++ ' )
def __str__ ( self ) :
def __str__ ( self ) :
return ' csharp '
return ' csharp '
@ -313,14 +345,14 @@ class NodeLanguage:
yield _ping_pong_scenario (
yield _ping_pong_scenario (
' node_protobuf_async_unary_qps_unconstrained ' , rpc_type = ' UNARY ' ,
' node_protobuf_async_unary_qps_unconstrained ' , rpc_type = ' UNARY ' ,
client_type = ' ASYNC_CLIENT ' , server_type = ' ASYNC_SERVER ' ,
client_type = ' ASYNC_CLIENT ' , server_type = ' ASYNC_SERVER ' ,
use_u nconstrained_client = True ,
unconstrained_client = ' async ' ,
categories = [ SMOKETEST ] )
categories = [ SMOKETEST ] )
# TODO(jtattermusch): make this scenario work
# TODO(jtattermusch): make this scenario work
#yield _ping_pong_scenario(
#yield _ping_pong_scenario(
# 'node_protobuf_async_streaming_qps_unconstrained', rpc_type='STREAMING',
# 'node_protobuf_async_streaming_qps_unconstrained', rpc_type='STREAMING',
# client_type='ASYNC_CLIENT', server_type='ASYNC_SERVER',
# client_type='ASYNC_CLIENT', server_type='ASYNC_SERVER',
# use_unconstrained_client=True )
# unconstrained_client='async' )
# TODO(jtattermusch): make this scenario work
# TODO(jtattermusch): make this scenario work
#yield _ping_pong_scenario(
#yield _ping_pong_scenario(
@ -369,19 +401,15 @@ class PythonLanguage:
client_type = ' SYNC_CLIENT ' , server_type = ' SYNC_SERVER ' ,
client_type = ' SYNC_CLIENT ' , server_type = ' SYNC_SERVER ' ,
categories = [ SMOKETEST ] )
categories = [ SMOKETEST ] )
# TODO(jtattermusch):
yield _ping_pong_scenario (
# The qps_worker server gets thread starved with ~6400 threads, the GIL
' python_protobuf_sync_unary_qps_unconstrained ' , rpc_type = ' UNARY ' ,
# enforces that a single thread runs at a time, with no way to set thread
client_type = ' SYNC_CLIENT ' , server_type = ' SYNC_SERVER ' ,
# priority. Re-evaluate after changing DEEP and WIDE.
unconstrained_client = ' sync ' )
#yield _ping_pong_scenario(
# 'python_protobuf_sync_unary_qps_unconstrained', rpc_type='UNARY',
# client_type='SYNC_CLIENT', server_type='SYNC_SERVER',
# use_unconstrained_client=True)
yield _ping_pong_scenario (
yield _ping_pong_scenario (
' python_protobuf_async_streaming_qps_unconstrained ' , rpc_type = ' STREAMING ' ,
' python_protobuf_async_streaming_qps_unconstrained ' , rpc_type = ' STREAMING ' ,
client_type = ' ASYNC_CLIENT ' , server_type = ' SYNC_SERVER ' ,
client_type = ' ASYNC_CLIENT ' , server_type = ' SYNC_SERVER ' ,
use_u nconstrained_client = True )
unconstrained_client = ' async ' )
yield _ping_pong_scenario (
yield _ping_pong_scenario (
' python_to_cpp_protobuf_sync_unary_ping_pong ' , rpc_type = ' UNARY ' ,
' python_to_cpp_protobuf_sync_unary_ping_pong ' , rpc_type = ' UNARY ' ,
@ -420,17 +448,15 @@ class RubyLanguage:
client_type = ' SYNC_CLIENT ' , server_type = ' SYNC_SERVER ' ,
client_type = ' SYNC_CLIENT ' , server_type = ' SYNC_SERVER ' ,
categories = [ SMOKETEST ] )
categories = [ SMOKETEST ] )
# TODO: scenario reports QPS of 0.0
yield _ping_pong_scenario (
#yield _ping_pong_scenario(
' ruby_protobuf_sync_unary_qps_unconstrained ' , rpc_type = ' UNARY ' ,
# 'ruby_protobuf_sync_unary_qps_unconstrained', rpc_type='UNARY',
client_type = ' SYNC_CLIENT ' , server_type = ' SYNC_SERVER ' ,
# client_type='SYNC_CLIENT', server_type='SYNC_SERVER',
unconstrained_client = ' sync ' )
# use_unconstrained_client=True)
# TODO: scenario reports QPS of 0.0
yield _ping_pong_scenario (
#yield _ping_pong_scenario(
' ruby_protobuf_sync_streaming_qps_unconstrained ' , rpc_type = ' STREAMING ' ,
# 'ruby_protobuf_sync_streaming_qps_unconstrained', rpc_type='STREAMING',
client_type = ' SYNC_CLIENT ' , server_type = ' SYNC_SERVER ' ,
# client_type='SYNC_CLIENT', server_type='SYNC_SERVER',
unconstrained_client = ' sync ' )
# use_unconstrained_client=True)
yield _ping_pong_scenario (
yield _ping_pong_scenario (
' ruby_to_cpp_protobuf_sync_unary_ping_pong ' , rpc_type = ' UNARY ' ,
' ruby_to_cpp_protobuf_sync_unary_ping_pong ' , rpc_type = ' UNARY ' ,
@ -492,26 +518,26 @@ class JavaLanguage:
yield _ping_pong_scenario (
yield _ping_pong_scenario (
' java_protobuf_async_unary_qps_unconstrained_ %s ' % secstr , rpc_type = ' UNARY ' ,
' java_protobuf_async_unary_qps_unconstrained_ %s ' % secstr , rpc_type = ' UNARY ' ,
client_type = ' ASYNC_CLIENT ' , server_type = ' ASYNC_SERVER ' ,
client_type = ' ASYNC_CLIENT ' , server_type = ' ASYNC_SERVER ' ,
use_u nconstrained_client = True ,
unconstrained_client = ' async ' ,
secure = secure , warmup_seconds = JAVA_WARMUP_SECONDS ,
secure = secure , warmup_seconds = JAVA_WARMUP_SECONDS ,
categories = smoketest_categories )
categories = smoketest_categories )
yield _ping_pong_scenario (
yield _ping_pong_scenario (
' java_protobuf_async_streaming_qps_unconstrained_ %s ' % secstr , rpc_type = ' STREAMING ' ,
' java_protobuf_async_streaming_qps_unconstrained_ %s ' % secstr , rpc_type = ' STREAMING ' ,
client_type = ' ASYNC_CLIENT ' , server_type = ' ASYNC_SERVER ' ,
client_type = ' ASYNC_CLIENT ' , server_type = ' ASYNC_SERVER ' ,
use_u nconstrained_client = True ,
unconstrained_client = ' async ' ,
secure = secure , warmup_seconds = JAVA_WARMUP_SECONDS )
secure = secure , warmup_seconds = JAVA_WARMUP_SECONDS )
yield _ping_pong_scenario (
yield _ping_pong_scenario (
' java_generic_async_streaming_qps_unconstrained_ %s ' % secstr , rpc_type = ' STREAMING ' ,
' java_generic_async_streaming_qps_unconstrained_ %s ' % secstr , rpc_type = ' STREAMING ' ,
client_type = ' ASYNC_CLIENT ' , server_type = ' ASYNC_GENERIC_SERVER ' ,
client_type = ' ASYNC_CLIENT ' , server_type = ' ASYNC_GENERIC_SERVER ' ,
use_u nconstrained_client = True , use_generic_payload = True ,
unconstrained_client = ' async ' , use_generic_payload = True ,
secure = secure , warmup_seconds = JAVA_WARMUP_SECONDS )
secure = secure , warmup_seconds = JAVA_WARMUP_SECONDS )
yield _ping_pong_scenario (
yield _ping_pong_scenario (
' java_generic_async_streaming_qps_one_server_core_ %s ' % secstr , rpc_type = ' STREAMING ' ,
' java_generic_async_streaming_qps_one_server_core_ %s ' % secstr , rpc_type = ' STREAMING ' ,
client_type = ' ASYNC_CLIENT ' , server_type = ' ASYNC_GENERIC_SERVER ' ,
client_type = ' ASYNC_CLIENT ' , server_type = ' ASYNC_GENERIC_SERVER ' ,
use_u nconstrained_client = True , use_generic_payload = True ,
unconstrained_client = ' async ' , use_generic_payload = True ,
async_server_threads = 1 ,
async_server_threads = 1 ,
secure = secure , warmup_seconds = JAVA_WARMUP_SECONDS )
secure = secure , warmup_seconds = JAVA_WARMUP_SECONDS )
@ -560,25 +586,28 @@ class GoLanguage:
secure = secure ,
secure = secure ,
categories = smoketest_categories )
categories = smoketest_categories )
# unconstrained_client='async' is intended (client uses goroutines)
yield _ping_pong_scenario (
yield _ping_pong_scenario (
' go_protobuf_sync_unary_qps_unconstrained_ %s ' % secstr , rpc_type = ' UNARY ' ,
' go_protobuf_sync_unary_qps_unconstrained_ %s ' % secstr , rpc_type = ' UNARY ' ,
client_type = ' SYNC_CLIENT ' , server_type = ' SYNC_SERVER ' ,
client_type = ' SYNC_CLIENT ' , server_type = ' SYNC_SERVER ' ,
use_u nconstrained_client = True ,
unconstrained_client = ' async ' ,
secure = secure ,
secure = secure ,
categories = smoketest_categories )
categories = smoketest_categories )
# unconstrained_client='async' is intended (client uses goroutines)
yield _ping_pong_scenario (
yield _ping_pong_scenario (
' go_protobuf_sync_streaming_qps_unconstrained_ %s ' % secstr , rpc_type = ' STREAMING ' ,
' go_protobuf_sync_streaming_qps_unconstrained_ %s ' % secstr , rpc_type = ' STREAMING ' ,
client_type = ' SYNC_CLIENT ' , server_type = ' SYNC_SERVER ' ,
client_type = ' SYNC_CLIENT ' , server_type = ' SYNC_SERVER ' ,
use_u nconstrained_client = True ,
unconstrained_client = ' async ' ,
secure = secure )
secure = secure )
# unconstrained_client='async' is intended (client uses goroutines)
# ASYNC_GENERIC_SERVER for Go actually uses a sync streaming server,
# ASYNC_GENERIC_SERVER for Go actually uses a sync streaming server,
# but that's mostly because of lack of better name of the enum value.
# but that's mostly because of lack of better name of the enum value.
yield _ping_pong_scenario (
yield _ping_pong_scenario (
' go_generic_sync_streaming_qps_unconstrained_ %s ' % secstr , rpc_type = ' STREAMING ' ,
' go_generic_sync_streaming_qps_unconstrained_ %s ' % secstr , rpc_type = ' STREAMING ' ,
client_type = ' SYNC_CLIENT ' , server_type = ' ASYNC_GENERIC_SERVER ' ,
client_type = ' SYNC_CLIENT ' , server_type = ' ASYNC_GENERIC_SERVER ' ,
use_u nconstrained_client = True , use_generic_payload = True ,
unconstrained_client = ' async ' , use_generic_payload = True ,
secure = secure )
secure = secure )
# TODO(jtattermusch): add scenarios go vs C++
# TODO(jtattermusch): add scenarios go vs C++