İletileri oldukça yüksek bir hızla aktaran bir hizmetim var.
Şu anda akka-tcp tarafından servis ediliyor ve dakikada 3,5 milyon mesaj yapıyor. Ben grpc denemeye karar verdim. Ne yazık ki çok daha küçük bir verim ile sonuçlandı: dakikada 500k mesaj daha da az.
Nasıl optimize edeceğinizi tavsiye eder misiniz?
Kurulumum
Donanım : 32 çekirdek, 24 Gb yığın.
grpc sürümü : 1.25.0
Mesaj biçimi ve bitiş noktası
Mesaj temelde ikili bir damladır. İstemci 100K - 1M ve daha fazla iletiyi aynı istekte (eşzamansız olarak) akışa gönderir, sunucu hiçbir şeye yanıt vermez, istemci bir op-olmayan gözlemci kullanır
service MyService {
rpc send (stream MyMessage) returns (stream DummyResponse);
}
message MyMessage {
int64 someField = 1;
bytes payload = 2; //not huge
}
message DummyResponse {
}
Sorunlar: Mesaj oranı akka uygulamasına göre düşük. Düşük CPU kullanımını gözlemliyorum, bu yüzden grpc çağrısının aslında aksi belirtilmese de dahili olarak engellendiğinden şüpheleniyorum. onNext()
Gerçekten arama hemen geri dönmez, ancak masada GC de vardır.
Bu sorunu hafifletmek için daha fazla gönderici üretmeye çalıştım, ancak çok fazla gelişme elde etmedim.
Bulgularım Grpc, dizileştirirken her iletiye 8KB baytlık bir arabellek ayırıyor. Yığın izine bakın:
java.lang.Thread.State: com.google.common.io.ByteStreams.createBuffer (ByteStreams.java:58) adresinde com.google.common.io.ByteStreams.copy (ByteStreams.java: adresinde BLOCKED (nesne monitöründe): 105) io.grpc.internal.MessageFramer.writeKnownLengthUncompressed'de (MessageFramer.java:274) io.grpc.internal.MessageFramer.writeKnownLengthUncompressed (MessageFramer.java:230) 'da : 168) io.grpc.internal.ForwardingClientStream.writeMessage (ForwardClientStream.writeMessage (ForwardingClientStream.writeMessage) 'da java: 37) io.grpc.internal.DelayedStream.writeMessage'da (DelayedStream.java:252) io.grpc.internal adresinde.İo.grpc.internal.ClientCallImpl.sendMessage (ClientCallImpl.java:457) adresindeki io.grpc.ForwardingClientCall.sendMessage (ClientCallImpl.java:457) adresinde ClientCallImpl.sendMessageInternal (ClientCallImpl.java:473) (ForwardingClientCall.java:37), io.grpc.stub.ClientCalls $ CallToStreamObserverAdapter.onNext (ClientCalls.java:346)
Yüksek verimli grpc istemcileri oluşturma konusunda en iyi uygulamalarla ilgili herhangi bir yardım takdir edildi.
scalapb
. Muhtemelen bu yığın izlemesi gerçekten de skatb-oluşturulan koddan kaynaklanıyordu. Ben scalapb ile ilgili her şeyi kaldırdım ama çok wrt performansına yardımcı olmadı.