vmsplice बहुत तेज़ है
- कुछ प्रोग्राम पाइप के ज़रिए डेटा को अधिक तेज़ी से भेजने के लिए
vmsplice नाम की system call का उपयोग करते हैं
vmsplice का उपयोग न करने पर पता चला कि Linux पाइप उम्मीद से ज़्यादा धीमे हैं
- Morse code को तेज़ी से encode/decode करने वाला एक प्रोग्राम लिखा जा रहा है, और इसके लिए पाइप का उपयोग हो रहा है
आदर्श वातावरण में डेटा लिखना
- नीचे दिया गया प्रोग्राम बिना system call के डेटा कॉपी करता है
- AVX-512 का उपयोग करते हुए यह 167 GB/s की गति से चलता है
- AVX-512 को अक्षम करके AVX2 और SSE2 के साथ टेस्ट करने पर भी वही गति (167 GB/s) मिली
- जब तक vectorization का उपयोग होता है, 167 GB/s की गति हासिल की जा सकती है
वास्तव में पाइप में डेटा लिखना
- पाइप में डेटा लिखने वाला प्रोग्राम बनाकर मापने पर 17 GB/s की गति मिली
- यह buffer में लिखने की तुलना में 10 गुना धीमा है
- profiling के नतीजों से पता चला कि ज़्यादातर समय
write call में खर्च होता है
pipe_write फ़ंक्शन में memory page allocate करने में काफ़ी समय लगता है
- डेटा कॉपी करना खुद CPU समय का सिर्फ़ 20% लेता है, लेकिन फिर भी
__memset_avx512_unaligned_erms से दोगुना धीमा है
vmsplice की मदद
vmsplice user space से kernel में buffer को कॉपी किए बिना आगे बढ़ाता है
vmsplice का उपयोग करने पर 210 GB/s की गति हासिल की जा सकती है
vmsplice, write system call के महंगे हिस्से को bypass करता है
निष्कर्ष
- पाइप में लिखना raw memory में लिखने की तुलना में 10 गुना धीमा है
- इसकी वजह buffer को lock करने की लागत और SIMD context को save/restore करने की लागत है
splice और vmsplice इन लागतों से बचते हैं और डेटा को अधिक कुशलता से स्थानांतरित करते हैं
GN⁺ का सार
- यह लेख
vmsplice का उपयोग करके Linux पाइप की performance को अधिकतम करने का तरीका समझाता है
vmsplice डेटा को kernel space में कॉपी किए बिना सीधे आगे बढ़ाता है, जिससे performance काफ़ी बेहतर होती है
- Morse code encoding/decoding जैसे high-speed data processing प्रोग्रामों में यह उपयोगी है
- समान क्षमता वाले दूसरे प्रोजेक्ट्स में
splice और sendfile आदि शामिल हैं
1 टिप्पणियां
Hacker News टिप्पणियाँ
JMPकोRETसे प्रतिस्थापित नहीं किया जाता, इसका कारण CONFIG_RETHUNK विकल्प हैRETकोJMP __x86_return_thunkसे प्रतिस्थापित किया गया हैफ़ंक्शन की शुरुआत और अंत में मौजूद NOP निर्देश ftrace को tracing निर्देश डालने की अनुमति देते हैं
एक उपयोगकर्ता का side project file descriptor के लिए ring buffer प्रदान करने वाला system call प्रस्तावित करता है
Linux pipe को "धीमा" कहना वैसा ही है जैसे Toyota Corolla को "धीमा" कहना
आधुनिक CPU पर
rep movsbसबसे तेज़ vectorized version जितना तेज़ हैAVX512 बिजली की खपत ज़्यादा करता है और CPU frequency scaling को ट्रिगर करता है
फिर से Hacker News का "hug of death" झेल रहा हूँ
io_uring का उपयोग करने वाला version देखना दिलचस्प होगा
ब्लॉग के load होने में लगभग 20 सेकंड लगना अपने-आप में एक साहसी दावा है
IPC के लगभग सभी रूप "धीमे" हैं
शुरू में समझ नहीं आया कि splice इतना धीमा क्यों है