मैं संख्यात्मक अनुकूलन समस्याओं के एक वर्ग को हल करने के लिए जावा एप्लिकेशन पर काम कर रहा हूं - बड़े पैमाने पर रैखिक प्रोग्रामिंग समस्याएं अधिक सटीक होने के लिए। एक एकल समस्या को छोटे उपप्रकारों में विभाजित किया जा सकता है जो समानांतर में हल कर सकते हैं। चूंकि सीपीयू कोर की तुलना में अधिक उपप्रोग्राम हैं, इसलिए मैं एक एक्सेलसॉर सेवा का उपयोग करता हूं और प्रत्येक उपप्रकार को एक कॉल करने योग्य के रूप में परिभाषित करता हूं जो एक्सेलसॉर सर्विस को प्रस्तुत किया जाता है। एक उपप्रोब्लेम को हल करने के लिए इस मामले में एक मूल पुस्तकालय - एक रैखिक प्रोग्रामिंग सॉल्वर को कॉल करने की आवश्यकता होती है।
मुसीबत
मैं यूनिक्स पर और विंडोज सिस्टम पर 44 भौतिक कोर तक और 256g तक मेमोरी के साथ एप्लिकेशन चला सकता हूं, लेकिन विंडोज पर गणना समय बड़ी समस्याओं के लिए लिनक्स पर अधिक से अधिक परिमाण का एक क्रम है। विंडोज को न केवल बहुत अधिक मेमोरी की आवश्यकता होती है, लेकिन समय के साथ सीपीयू का उपयोग कुछ घंटों के बाद शुरुआत में 25% से गिरकर 5% हो जाता है। यहाँ विंडोज में टास्क मैनेजर का स्क्रीनशॉट दिया गया है:
टिप्पणियों
- समग्र समस्या के बड़े उदाहरणों के लिए समाधान समय घंटों से लेकर दिनों तक और 32g तक मेमोरी (यूनिक्स पर) तक खपत होती है। एक subproblem के लिए समाधान समय एमएस रेंज में हैं।
- मैं इस समस्या का सामना छोटी समस्याओं पर नहीं करता हूं जिन्हें हल करने में केवल कुछ मिनट लगते हैं।
- लिनक्स दोनों सॉकेट्स को आउट-ऑफ-द-बॉक्स का उपयोग करता है, जबकि विंडोज को मुझे BIOS में स्पष्ट रूप से मेमोरी इंटरलेक्टिंग को सक्रिय करने की आवश्यकता होती है ताकि एप्लिकेशन दोनों कोर का उपयोग करे। चाहे मैं ऐसा न करूं लेकिन समय के साथ समग्र सीपीयू उपयोग के बिगड़ने पर कोई प्रभाव नहीं पड़ता है।
- जब मैं VisualVM में थ्रेड्स को देखता हूं तो सभी पूल थ्रेड चल रहे हैं, कोई भी प्रतीक्षा या अन्य पर नहीं है।
- VisualVM के अनुसार, 90% CPU समय एक मूल फ़ंक्शन कॉल पर खर्च होता है (एक छोटे रैखिक कार्यक्रम को हल करना)
- कचरा संग्रहण कोई समस्या नहीं है क्योंकि एप्लिकेशन बहुत सारी वस्तुओं का निर्माण और संदर्भ नहीं देता है। इसके अलावा, अधिकांश मेमोरी को ऑफ-हीप आवंटित किया गया लगता है। 4 जी के ढेर लिनक्स पर पर्याप्त हैं और सबसे बड़े उदाहरण के लिए विंडोज पर 8 जी हैं।
मैंने क्या कोशिश की है
- सभी प्रकार के जेवीएम आर्ग्स, उच्च एक्सएमएस, उच्च मेटास्टेस, यूएनएनयूएमएए फ्लैग, अन्य जीसी।
- विभिन्न जेवीएम (हॉटस्पॉट 8, 9, 10, 11)।
- विभिन्न रैखिक प्रोग्रामिंग सॉल्वर (CLP, Xpress, Cplex, Gurobi) के विभिन्न देशी पुस्तकालय।
प्रशन
- एक बड़े बहु-थ्रेडेड जावा एप्लिकेशन के लिनक्स और विंडोज के बीच प्रदर्शन अंतर को बढ़ाता है जो देशी कॉल का भारी उपयोग करता है?
- क्या ऐसा कुछ भी है जिसे मैं कार्यान्वयन में बदल सकता हूं जो कि विंडोज की मदद करेगा, उदाहरण के लिए, क्या मुझे एक एक्सेलसॉर सेवा का उपयोग करने से बचना चाहिए जो हजारों कॉलबल्स प्राप्त करता है और इसके बजाय क्या करता है?
ForkJoinPool
लिए मैनुअल शेड्यूलिंग से अधिक कुशल है।
ForkJoinPool
इसके बजाय कोशिश की हैExecutorService
? यदि आपकी समस्या CPU बाध्य है तो 25% CPU उपयोग वास्तव में कम है।