簡體   English   中英

JAVA 中的 GRPC 服務器以支持巨大的請求負載

[英]GRPC server in JAVA to support huge load of requests

我在 java 上有一個 grpc (1.13.x) 服務器,它不執行任何計算或 I/O 密集型任務。 目的是檢查該服務器在 80 核機器上每秒可以支持的請求數。

服務器:

  ExecutorService executor = new ThreadPoolExecutor(160, Integer.MAX_VALUE,
                60L, TimeUnit.SECONDS,
                new SynchronousQueue<Runnable>(),
                new ThreadFactoryBuilder()
                        .setDaemon(true)
                        .setNameFormat("Glowroot-IT-Harness-GRPC-Executor-%d")
                        .build());
     Server server =  NettyServerBuilder.forPort(50051)
                .addService(new MyService())
                .executor(executor)
                .build()
                .start();

服務:

@Override
    public void verify(Request request, StreamObserver<Result> responseObserver) {
        Result result = Result.newBuilder()
                    .setMessage("hello")
                    .build();
        responseObserver.onNext(result);
        responseObserver.onCompleted();
    }

我正在使用ghz客戶端執行負載測試。 服務器每秒能夠處理 40k 請求,但 RPS 計數不能超過 40k,即使傳入請求速率為 100k 的並發客戶端數量增加。 GRPC 服務器每秒只能處理 40K 請求,並將所有其他請求排隊。 CPU 未充分利用 (7%)。 盡管沒有 I/O 操作,但大約 90% 的 grpc 線程(前綴為 grpc-default-executor)正在等待 state。 超過 25k 線程在等待 state。

等待中線程的堆棧跟蹤:

grpc-default-executor-4605
PRIORITY :5

THREAD ID :0X00007F15A4440D80

NATIVE ID :
stackTrace:
java.lang.Thread.State: TIMED_WAITING (parking)
at jdk.internal.misc.Unsafe.park(java.base@15.0.1/Native Method)
- parking to wait for <0x00007f1df161ae20> (a java.util.concurrent.SynchronousQueue$TransferStack)
at java.util.concurrent.locks.LockSupport.parkNanos(java.base@15.0.1/LockSupport.java:252)
at java.util.concurrent.SynchronousQueue$TransferStack.awaitFulfill(java.base@15.0.1/SynchronousQueue.java:462)
at java.util.concurrent.SynchronousQueue$TransferStack.transfer(java.base@15.0.1/SynchronousQueue.java:361)
at java.util.concurrent.SynchronousQueue.poll(java.base@15.0.1/SynchronousQueue.java:937)
at java.util.concurrent.ThreadPoolExecutor.getTask(java.base@15.0.1/ThreadPoolExecutor.java:1055)
at java.util.concurrent.ThreadPoolExecutor.runWorker(java.base@15.0.1/ThreadPoolExecutor.java:1116)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(java.base@15.0.1/ThreadPoolExecutor.java:630)
at java.lang.Thread.run(java.base@15.0.1/Thread.java:832)
Locked ownable synchronizers:
- None

如何配置服務器以支持 100K+ 請求?

gRPC 堆棧中的任何內容似乎都不會導致此限制。 服務器端的平均響應時間是多少? 看起來您受到臨時端口或 TCP 連接限制的限制,您可能想要調整您的 kernel,如下所述Z5E056C500A1C4B6A7110B50D807BADE-a-com//www.metabrew-application-with-a-a-com//www.metabrew-application- mochiweb-part-1或此處https://blog.box.com/ephemeral-port-exhaustion-and-web-services-at-scale

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM