ฉันมีบริการที่โอนข้อความในอัตราที่ค่อนข้างสูง
ขณะนี้มีให้บริการโดย akka-tcp และสร้างข้อความ 3.5M ต่อนาที ฉันตัดสินใจที่จะลอง grpc โชคไม่ดีที่มันส่งผลให้ปริมาณงานน้อยลง: ~ 500k ข้อความต่อนาทียิ่งน้อยลง
คุณช่วยแนะนำวิธีเพิ่มประสิทธิภาพได้ไหม
การตั้งค่าของฉัน
ฮาร์ดแวร์ : 32 แกน 24Gb กอง
รุ่น grpc: 1.25.0
รูปแบบข้อความและจุดสิ้นสุด
ข้อความนั้นเป็นฐานสองหยด สตรีม 100K - 1M และข้อความอื่น ๆ อีกมากมายในคำขอเดียวกัน (แบบอะซิงโครนัส) เซิร์ฟเวอร์ไม่ตอบสนองกับสิ่งใดลูกค้าใช้ผู้สังเกตการณ์แบบไม่มี op
service MyService {
rpc send (stream MyMessage) returns (stream DummyResponse);
}
message MyMessage {
int64 someField = 1;
bytes payload = 2; //not huge
}
message DummyResponse {
}
ปัญหา: อัตราข้อความต่ำเมื่อเทียบกับการนำ Akka ไปใช้ ฉันสังเกตการใช้งานซีพียูต่ำดังนั้นฉันสงสัยว่าการโทร grpc กำลังปิดกั้นอยู่ภายในแม้ว่าจะมีการระบุไว้เป็นอย่างอื่น การโทรonNext()
ไม่ได้กลับทันที แต่มี GC บนโต๊ะด้วย
ฉันพยายามวางไข่ผู้ส่งมากขึ้นเพื่อบรรเทาปัญหานี้ แต่ก็ไม่ได้รับการปรับปรุงมากนัก
การค้นพบของฉัน Grpc จริงจัดสรรบัฟเฟอร์ 8KB ไบต์ในแต่ละข้อความเมื่อซีเรียลไลซ์ ดูสแต็คเทรซ:
java.lang.Thread.State: บล็อก (บนการตรวจสอบวัตถุ) ที่ com.google.common.io.ByteStreams.createBuffer (ByteStreams.java:58) ที่ com.google.common.io.ByteStreams.copy (ByteStreams.java: 105) ที่ io.grpc.internal.MessageFramer.writeToOutputStream (MessageFramer.java:274) ที่ io.grpc.internal.MessageFramer.writeKnownLengthUncompressed (MessageFramer.java:230) ที่ io.grpc.internal.MessageFramer.writeToOutputStream (MessageFramer.java:274) : 168) ที่ io.grpc.internal.MessageFramer.writePayload (MessageFramer.java:141) ที่ io.grpc.internal.AbstractStream.writeMessage (AbstractStream.java:53) ที่ io.grpc.internal.ForwardingClientStream.writeMessage (ไปข้างหน้า) java: 37) ที่ io.grpc.internal.DelayedStream.writeMessage (DelayedStream.java:252) ที่ io.grpc.internalClientCallImpl.sendMessageInternal (ClientCallImpl.java:473) ที่ io.grpc.internal.ClientCallImpl.sendMessage.CallImpl.sendMessage (ClientCallImpl.java:457) ที่ io.grpc.ForwardingClientCall.sallMessageInterage (ForwardingClientCall.java:37) ที่ io.grpc.stub.ClientCalls $ CallToStreamObserverAdapter.onNext (ClientCalls.java:346)
ความช่วยเหลือใด ๆ กับแนวทางปฏิบัติที่ดีที่สุดในการสร้างลูกค้า grpc ทรูพุตความเร็วสูงชื่นชม
scalapb
ด้วย อาจสแต็คสแตร็คนี้มาจากรหัสที่สร้างโดย scalapb ฉันลบทุกอย่างที่เกี่ยวข้องกับ scalapb แต่มันไม่ได้ช่วยประสิทธิภาพการทำงานของ wrt มากนัก