- Netflix ने CPU-heavy Java Microservice को m5.4xl(16 vCPU) से m5.12xl(48 vCPU) पर माइग्रेट किया
- vCPU 3 गुना होने के कारण लगभग 3 गुना performance improvement की उम्मीद थी, लेकिन throughput सिर्फ 25% बढ़ा
- यहाँ तक कि latency 50% घट गई, और CPU व latency patterns दोनों ही बहुत ज़्यादा 'टूटी-फूटी' (Choppy) हो गईं
- इसे हल करने के लिए किए गए सफ़र को low-level तक व्यवस्थित करने वाला लेख
समाधान प्रक्रिया
- तेज़ node और धीमे node की तुलना करने का फ़ैसला किया
- Flame Graph और JVM profiling (JFR-Java Flight Recorder का उपयोग) से कोई अंतर पता नहीं चला
- app/OS/JVM स्तर पर कुछ असामान्य नहीं मिला, इसलिए m5.12xl instance द्वारा दिए गए PMC(Performance Monitoring Counters, PMU Counter) को देखा गया
- समस्याओं में से एक थी "False Sharing" - जब 2 core एक ही L1 cache line को साझा करने वाले असंबंधित variables को पढ़ते या लिखते हैं, तब बनने वाला pattern
- JDK code में functionality बदले बिना, data layout में padding bytes डालकर इस समस्या को हल किया गया
- एक दूसरी समस्या थी "True Sharing" - एक ही variable को कई thread/core द्वारा पढ़ना और लिखना
- इसे हल करने के लिए shared variable पर लिखने से बचा गया और JVM के secondary super class cache को bypass किया गया
- दोनों patches लागू करने पर शुरुआती स्थिति की तुलना में speed 3.5 गुना बढ़ गई
- इस समस्या को हल करते समय 5 साल से निष्क्रिय पड़े bug JDK-8180450 के बारे में भी पता चला
निष्कर्ष
- अक्सर JVM को C++ जैसी performance-oriented language से प्रतिस्पर्धा करने वाला अत्यधिक optimized runtime environment माना जाता है
- ज़्यादातर workloads के लिए यह सही है, लेकिन कुछ खास workloads में असर सिर्फ application implementation से नहीं, बल्कि JVM की अपनी implementation से भी पड़ सकता है
- इस मामले में JVM के native code में bottleneck ढूँढकर उसे patch किया गया, और उस workload का throughput 3 गुना से अधिक बढ़ाने के लिए PMC का उपयोग किया गया
- इस तरह की performance problems में CPU microarchitecture स्तर पर execution की जाँच करने की क्षमता ही एकमात्र समाधान हो सकती है
- Intel vTune, m5.12xl जैसे instance पर उपलब्ध मुख्य PMC के आधार पर भी काफ़ी मूल्यवान insights देता है
- अगर cloud के सभी instance, PEBS(Processor Event-Based Sampling) के साथ व्यापक PMC set उपलब्ध कराएँ, तो और गहन analysis के ज़रिए इससे भी बड़ा performance improvement हासिल किया जा सकता है
2 टिप्पणियां
वाह, आखिर...
जब परिकल्पना सही साबित होकर उसे ठीक कर लिया गया होगा, तब काफ़ी रोमांचक लगा होगा।