Can you try setting the executor on both the channel and the server builder? I would recommend ForkJoinPool.commonPool().
On Monday, August 27, 2018 at 11:54:19 PM UTC-7, Kos wrote: > > Hi, > > I'm using gRPC in a new Scala service and I'm seeing unexpectedly high CPU > utilization. I see this high utilization in our production workload but > also am able to reproduce via performance tests which I'll describe below. > > My setup is using grpc-netty-shaded 1.10 (but i've also repro'd with > 1.14). My performance test uses mTLS to talk to the service. The service is > deployed on a container with 6 cores and 2 gb ram. I've reduced the > footprint of my service to immediately return with a response without doing > any other work to try and identify if it's the application or something to > do with my gRPC configuration. > > My performance test is issuing about 250 requests a second using one > Managed Channel to one instance of my service. The data in each request is > about 10 bytes. With this workload, my service is running at about 35% CPU, > which I feel is far too high for this small amount of rps. > > Here is how I've constructed my server: > > val serverInterceptor = > MonitoringServerInterceptor.create(Configuration.allMetrics()) > > > val realtimeServiceWithMonitoring = ServerInterceptors.intercept( > RealtimePublishGrpc.bindService(realtimeService, ExecutionContext.global), > serverInterceptor) > val rppServiceWithMonitoring = ServerInterceptors.intercept( > RealtimeProxyGrpc.bindService(realtimePublishProxyService, > ExecutionContext.global), > serverInterceptor > ) > > > val keyManagerFactory = GrpcSSLHelper.getKeyManagerFactory(sslConfig) > val trustManagerFactory = GrpcSSLHelper.getTrustManagerFactory > (sslConfig) > val serverGrpcSslContexts = GrpcSSLHelper.getServerSslContext > (keyManagerFactory, trustManagerFactory) > > NettyServerBuilder > .forPort(8086) > .sslContext(serverGrpcSslContexts) > .addService(realtimeServiceWithMonitoring) > .addService(rppServiceWithMonitoring) > .build() > } > > > The server interceptor is modeled after: > https://github.com/grpc-ecosystem/java-grpc-prometheus > > The managed channel is constructed as such: > > private val interceptor = > MonitoringClientInterceptor.create(Configuration.allMetrics()) > > > val trustManagerFactory = GrpcSSLHelper.getTrustManagerFactory(sslConfig) > > NettyChannelBuilder > .forAddress(address, *8086*) > .intercept(interceptor) > .negotiationType(NegotiationType.TLS) > .sslContext(GrpcSSLHelper.getClientSslContext(keyManagerFactory, > trustManagerFactory)) > .build() > > > Finally, I use non-blocking stubs to issue the gRPC request. > > Any help would be greatly appreciated. Thanks! > -K > -- You received this message because you are subscribed to the Google Groups "grpc.io" group. To unsubscribe from this group and stop receiving emails from it, send an email to [email protected]. To post to this group, send email to [email protected]. Visit this group at https://groups.google.com/group/grpc-io. To view this discussion on the web visit https://groups.google.com/d/msgid/grpc-io/8cc27fe1-e825-4b57-9f84-752e79e4c56c%40googlegroups.com. For more options, visit https://groups.google.com/d/optout.
