मेरे पास एक सेवा है जो संदेशों को काफी उच्च दर पर स्थानांतरित करती है।
वर्तमान में यह akka-tcp द्वारा परोसा जाता है और यह प्रति मिनट 3.5M संदेश बनाता है। मैंने grpc को एक कोशिश देने का फैसला किया। दुर्भाग्य से यह बहुत छोटे थ्रूपुट के परिणामस्वरूप हुआ: ~ 500k संदेश प्रति मिनट एक भी कम।
क्या आप कृपया इसे अनुकूलित करने की अनुशंसा कर सकते हैं?
मेरा सेटअप
हार्डवेयर : 32 कोर, 24 जीबी हीप।
grpc संस्करण : 1.25.0
संदेश प्रारूप और समापन बिंदु
संदेश मूल रूप से एक द्विआधारी बूँद है। ग्राहक 100K - 1M और एक ही अनुरोध (अतुल्यकालिक) में अधिक संदेश प्रवाहित करता है, सर्वर किसी भी चीज़ का जवाब नहीं देता है, ग्राहक एक नो-ऑप ऑब्जर्वर का उपयोग करता है
service MyService {
rpc send (stream MyMessage) returns (stream DummyResponse);
}
message MyMessage {
int64 someField = 1;
bytes payload = 2; //not huge
}
message DummyResponse {
}
समस्या: अक्का कार्यान्वयन की तुलना में संदेश की दर कम है। मैं कम CPU उपयोग का निरीक्षण करता हूं, इसलिए मुझे संदेह है कि grpc कॉल वास्तव में आंतरिक रूप से अवरुद्ध है क्योंकि यह अन्यथा कहता है। कॉलिंग onNext()
वास्तव में तुरंत वापस नहीं आती है, लेकिन मेज पर जीसी भी है।
मैंने इस मुद्दे को कम करने के लिए अधिक प्रेषकों को स्पॉन करने की कोशिश की, लेकिन बहुत सुधार नहीं हुआ।
मेरे निष्कर्ष Grpc वास्तव में प्रत्येक संदेश पर एक 8KB बाइट बफर आवंटित करता है जब इसे क्रमबद्ध करता है। स्टैकट्रेस देखें:
java.lang.Thread.State: BLOCKED com (google पर ऑब्जेक्ट मॉनीटर पर) com.google.com। com। 105) io.grpc.internal.MessageFramer.writeToOutputStream (MessageFramer.java:274) पर io.grpc.internal.MessageFramer.writeKramownLengthUncompressed (MessageFramer.java:230) पर io.grpc.internet.in.in पर लॉग इन करें। :: 168) io.grpc.internal.MessageFramer.writePayload (MessageFramer.java:141) पर io.grpc.internal.AbstractStream.writeMessage (AbstractWream.java:53) पर io.grpc.internal.ForwardingClientStream.writeMessage फ़ॉरवर्ड करें। java: 37) io.grpc.internal.DelayedStream.writeMessage (DelayedStream.java:252) पर io.grpc.internal।Io.grpc.in.in. क्लाइंट पर ईमेल करें। (ForwardingClientCall.java:37) पर io.grpc.stub.ClientCalls $ CallToStreamObserverAdapter.onNext (ClientCalls.java:346)
सराहना के माध्यम से उच्च throughput grpc ग्राहकों के निर्माण पर सर्वोत्तम प्रथाओं के साथ कोई मदद।
scalapb
। संभवतः यह स्टैकट्रेस वास्तव में स्केलपब-जनरेटेड कोड से था। मैंने स्केलपब से जुड़ी हर चीज को हटा दिया, लेकिन इसने बहुत अधिक प्रदर्शन करने में मदद नहीं की।