में मजबूत रूप से समवर्ती HTTPS अनुरोधों की बड़ी संख्या कैसे बना सकता हूं मेरे पास इनपुट की एक धारा है और मैं प्रोग्राम के दूसरे भाग पर परिणाम पारित करने से पहले प्रत्येक के लिए 2 HTTPS
नेटवर्क अनुरोध करना चाहता हूं। ठेठ थ्रूपुट 50 प्रति सेकेंड है।मैं क्लोजर (/ जावा)
for each input:
HTTP request A
HTTP request B
pass event on with (A.body and B.body)
मैं http-kit
ग्राहक है, जो डिफ़ॉल्ट रूप से अतुल्यकालिक है उपयोग कर रहा हूँ। यह एक वादा देता है, और एक कॉलबैक भी ले सकता है। Http-किट, जावा NIO (here और here देखें)
में आ रहा है अनुरोध की गति, समय एक अनुरोध बनाने के लिए के साथ संयुक्त का उपयोग करता है इस अतुल्यकालिक रूप से किया जाना चाहिए काफी अधिक है।
- जब कोई ईवेंट में आता है, यह एक चैनल पर डाल दिया:
मैं 3 दृष्टिकोण की कोशिश की है। चैनल को खींचने की संख्या
go
दिनचर्या। प्रत्येक अनुरोध करता है कि HTTP अनुरोधों सेderef
आईएनजी द्वारा goblock को 'ब्लॉक' करें। यह काम नहीं करता है क्योंकि मुझे नहीं लगता कि वादा धागे के साथ अच्छी तरह से खेलता है। - जब कोई ईवेंट आता है, तो तुरंत
future
शुरू करें, जो एसिंक वादे पर 'ब्लॉक' है। इसके परिणामस्वरूप बहुत उच्च CPU उपयोग होता है। नेटवर्क संसाधनों के प्लस भुखमरी किसी भी तरह से। - जब कोई ईवेंट आता है, तो
http-kit
अनुरोध अनुरोध के लिए तुरंत अनुरोध करें, कॉलबैक में गुज़रने से अनुरोध बी बी करता है, जो ईवेंट को पास करने वाले कॉलबैक को पास करता है। यह कुछ घंटों के बाद स्मृति त्रुटि से बाहर निकलता है।
ये सभी काम करते हैं और थोड़ी देर के लिए क्षमता को संभालते हैं। वे सभी अंततः दुर्घटनाग्रस्त हो गए। सबसे हालिया दुर्घटना, लगभग 12 घंटे के बाद:
Mar 10, 2016 2:05:59 AM com.mchange.v2.async.ThreadPoolAsynchronousRunner$DeadlockDetector run
WARNING: com[email protected]1bc8a7f5 -- APPARENT DEADLOCK!!! Creating emergency threads for unassigned pending
tasks!
Mar 10, 2016 3:38:38 AM com.mchange.v2.async.ThreadPoolAsynchronousRunner$DeadlockDetector run
WARNING: com[email protected]1bc8a7f5 -- APPARENT DEADLOCK!!! Complete Status:
Managed Threads: 3
Active Threads: 1
Active Tasks:
com[email protected]65d8b232 (com.mchange.v2.async.ThreadPoolAsynchronousRunner$PoolThread-#0)
Pending Tasks:
[email protected]0d
Pool thread stack traces:
Thread[com.mchange.v2.async.ThreadPoolAsynchronousRunner$PoolThread-#0,5,main]
com.mchange.v2.async.ThreadPoolAsynchronousRunner$PoolThread.run(ThreadPoolAsynchronousRunner.java:560)
Thread[com.mchange.v2.async.ThreadPoolAsynchronousRunner$PoolThread-#1,5,main]
java.lang.Object.wait(Native Method)
com.mchange.v2.async.ThreadPoolAsynchronousRunner$PoolThread.run(ThreadPoolAsynchronousRunner.java:534)
Thread[com.mchange.v2.async.ThreadPoolAsynchronousRunner$PoolThread-#2,5,main]
java.lang.Object.wait(Native Method)
com.mchange.v2.async.ThreadPoolAsynchronousRunner$PoolThread.run(ThreadPoolAsynchronousRunner.java:534)
Thu Mar 10 04:38:34 UTC 2016 [client-loop] ERROR - select exception, should not happen
java.lang.OutOfMemoryError: Java heap space
at java.io.ByteArrayOutputStream.<init>(ByteArrayOutputStream.java:77)
at sun.security.ssl.OutputRecord.<init>(OutputRecord.java:76)
at sun.security.ssl.EngineOutputRecord.<init>(EngineOutputRecord.java:65)
at sun.security.ssl.HandshakeOutStream.<init>(HandshakeOutStream.java:63)
at sun.security.ssl.Handshaker.activate(Handshaker.java:514)
at sun.security.ssl.SSLEngineImpl.kickstartHandshake(SSLEngineImpl.java:717)
at sun.security.ssl.SSLEngineImpl.beginHandshake(SSLEngineImpl.java:743)
at org.httpkit.client.HttpClient.finishConnect(HttpClient.java:310)
at org.httpkit.client.HttpClient.run(HttpClient.java:375)
at java.lang.Thread.run(Thread.java:745)
Mar 10, 2016 4:56:34 AM baleen.events invoke
SEVERE: Thread error: Java heap space
java.lang.OutOfMemoryError: Java heap space
Mar 10, 2016 5:00:43 AM baleen.events invoke
SEVERE: Thread error: Java heap space
java.lang.OutOfMemoryError: Java heap space
Mar 10, 2016 4:58:25 AM baleen.events invoke
SEVERE: Thread error: Java heap space
java.lang.OutOfMemoryError: Java heap space
मुझे नहीं पता कि विफलता का कारण क्या है। ऐसा हो सकता है कि बहुत सारे बंद होने या धीरे-धीरे संसाधन रिसाव, या थ्रेड भुखमरी हो रही है।
प्रश्न
प्रति सेकंड 50 HTTP अनुरोध करने का यह, जिनमें से प्रत्येक 200 मि.से लग सकता है, एक अत्यधिक बोझ की तरह जिसका अर्थ है कि वहाँ किसी भी समय पर उड़ान में 100 अनुरोध हो सकता है, ध्वनि?
मैं ऐसा कैसे कर सकता हूं जो थ्रूपुट को नियंत्रित करता है और मजबूत है?
संपादित
YourKit प्रोफाइलर मुझसे कहता है मैं java.util.concurrent.FutureTask
रों जिससे पता चलता है कि पुराने हैंडलर (अर्थात अनुरोध) के लिए संदर्भ किसी भी तरह बनाए रखा जा रहा है के माध्यम से org.httpkit.client.Handler
रों के माध्यम से char[]
के 2GB के बारे में है। कॉलबैक का उपयोग करने का प्रयास करने का पूरा कारण इस से बचने के लिए था (हालांकि वे किसी भी तरह बंद होने में पकड़े जा सकते हैं)
OutOfMemoryError इंगित करता है कि स्मृति पर एक समस्या है ... लेकिन हम आपके कोड को देखे बिना या स्क्रैच से एक पूर्ण समाधान लिखने में मदद नहीं कर सकते हैं। मैं एक अनंत अनुक्रम के सिर पर पकड़ने, या कनेक्शन जैसे संसाधनों की सफाई नहीं करना चाहता हूं। –
मुझे आश्चर्य हुआ कि क्या यह बफर बनाए रखा जा सकता है, लेकिन जहां तक मैं कचरा संग्रह को बता सकता हूं उसे मुक्त करने वाली मेमोरी/बाहरी बफर को संभालना चाहिए। एनआईओ आवंटित किया गया था। डाउनस्ट्रीम क्या होता है बस एक डेटाबेस सम्मिलन और एक चैनल पर एक प्रविष्टि है। – Joe
मैंने कोड पोस्ट करने के बारे में सोचा लेकिन यह काफी शामिल है और मुझे यह जानने के लिए एक दिन लग जाएगा कि क्या मैं किसी सरलीकृत संस्करण में समस्या को दोहराता हूं। – Joe