1 पॉइंट द्वारा GN⁺ 2025-03-19 | 1 टिप्पणियां | WhatsApp पर शेयर करें
  • Ubuntu में उपलब्ध jq के source code पैकेज को खुद बिल्ड करने पर प्रदर्शन में अधिकतम 90% सुधार हो सकता है
  • compiler, optimization flags और memory allocator को बेहतर बनाकर प्रदर्शन को अधिकतम किया गया

सेटअप

  • jq का उपयोग JSON फ़ॉर्मैट की GeoJSON फ़ाइलों को प्रोसेस करने में होता है
    • 500MB आकार के Alameda County Assessor's parcel map पर एक query चलाई गई, जो एक निश्चित मान से अधिक वाले सभी parcel की city name को आउटपुट करती है
  • Ryzen 9 9950X सिस्टम पर cached file के आधार पर इसमें लगभग 5 सेकंड लगते थे, इसलिए इसे बेहतर बनाने की कोशिश की गई

चरण 1: पैकेज रीबिल्ड

  • Launchpad से jq source code डाउनलोड करने के बाद बिना किसी flag के रीबिल्ड किया गया
  • परिणाम: 2~4% प्रदर्शन सुधार
  • बेंचमार्क परिणाम
    • बिल्ड किया गया jq: औसत 4.517 सेकंड
    • Ubuntu डिफ़ॉल्ट पैकेज: औसत 4.641 सेकंड
    • प्रदर्शन सुधार: 1.03x तेज़

चरण 2: Clang और उन्नत optimization flags का उपयोग

  • Clang-18 से compile किया गया और optimization level तथा LTO का उपयोग किया गया
  • इस्तेमाल किए गए मुख्य flags:
    • -O3 → optimization level बढ़ाया
    • -flto → Link-Time Optimization लागू
    • -DNDEBUG → debug code हटाया
  • बेंचमार्क परिणाम
    • बिल्ड किया गया jq: औसत 3.853 सेकंड
    • Ubuntu डिफ़ॉल्ट पैकेज: औसत 4.631 सेकंड
    • प्रदर्शन सुधार: 1.20x तेज़

चरण 3: TCMalloc जोड़ना

  • GNU libc के डिफ़ॉल्ट malloc की जगह TCMalloc का उपयोग
  • -L/usr/lib/x86_64-linux-gnu -ltcmalloc_minimal जोड़कर बिल्ड किया गया
  • बेंचमार्क परिणाम
    • बिल्ड किया गया jq: औसत 3.253 सेकंड
    • Ubuntu डिफ़ॉल्ट पैकेज: औसत 4.611 सेकंड
    • प्रदर्शन सुधार: 1.42x तेज़

चरण 4: TCMalloc dynamic preload लागू

  • Ubuntu के डिफ़ॉल्ट पैकेज में dynamic preload के जरिए TCMalloc का उपयोग
  • बेंचमार्क परिणाम
    • डिफ़ॉल्ट jq: औसत 4.601 सेकंड
    • TCMalloc लागू jq: औसत 4.082 सेकंड
    • प्रदर्शन सुधार: 1.13x तेज़

चरण 5: दूसरे allocator के dynamic preload का परीक्षण

  • Ubuntu में उपलब्ध अन्य memory allocator jemalloc और mimalloc का परीक्षण किया गया
  • mimalloc ने सबसे अच्छा प्रदर्शन दिया
  • बेंचमार्क परिणाम
    • डिफ़ॉल्ट jq: औसत 4.123 सेकंड
    • TCMalloc लागू jq: औसत 4.130 सेकंड
    • Jemalloc लागू jq: औसत 3.510 सेकंड
    • Mimalloc लागू jq: औसत 3.154 सेकंड → प्रदर्शन 1.31x सुधार

चरण 6: mimalloc के साथ सीधे बिल्ड

  • mimalloc को dynamic preload के बजाय statically link किया गया
  • प्रदर्शन को अधिकतम किया गया
  • बेंचमार्क परिणाम
    • बिल्ड किया गया jq: औसत 2.428 सेकंड
    • Ubuntu डिफ़ॉल्ट पैकेज: औसत 4.606 सेकंड
    • प्रदर्शन सुधार: 1.90x तेज़

🚀 अंतिम परिणाम

  • Ubuntu पैकेज की तुलना में खुद बिल्ड किया गया jq 90% अधिक तेज़ था
  • 2.2GB JSON फ़ाइल के 13,000 प्रोसेसिंग प्रदर्शन:
    • बिल्ड किया गया jq: 0.755 सेकंड
    • डिफ़ॉल्ट jq: 1.424 सेकंड
    • प्रदर्शन सुधार: लगभग 2x

1 टिप्पणियां

 
GN⁺ 2025-03-19
Hacker News राय
  • "Ubuntu पैकेज को फिर से कॉन्फ़िगर करके और memory allocator बदलकर 90% तेज़ बनाना" जैसा शीर्षक क्लिकबेट लगता है

    • यह सिर्फ़ एक पैकेज की बात है, और कुछ performance सुधार recompilation से हासिल नहीं हुए थे
    • jemalloc को preload करके malloc implementation बदलने का अनुभव रहा है, और memory usage को स्थिर करने में सकारात्मक नतीजे मिले थे
    • इससे memory leak समस्या हल हुई, और ज़्यादा संभावना है कि यह application की समस्या नहीं बल्कि memory fragmentation की समस्या थी
  • engineering समझौतों की कला है

    • लेख में बताया गया है कि memory allocator को specialize करके ज़्यादातर performance improvement मिला
    • multithreaded project में allocator का चुनाव महत्वपूर्ण होता है, और एक project में मिली speedup किसी दूसरे project में crash का कारण बन सकती है
    • reallocation strategy पर भी विचार करना चाहिए, और long-term stability तथा short-term speed के बीच चुनाव करना पड़ता है
    • video editor विकसित करते समय अलग-अलग allocators आज़माए थे, और पाया कि glibc allocator long-term stability देता है
  • Gentoo Linux एक ऐसा operating system है जिसे उपयोगकर्ता के खास use case के अनुसार optimize करने के लिए डिज़ाइन किया गया है

    • शुरुआती setup के बाद इसका उपयोग आसान है, और Gentoo Linux चैनल में बहुत से दोस्त बनाने की याद है
    • शुरुआती ChromeOS मूल रूप से एक custom Gentoo Linux installation था
  • jq जैसे पैकेज को manually install करने पर security updates छूट सकते हैं

    • उदाहरण के लिए, onigurama के लिए security update आया था, और ऐसी स्थिति फिर होने पर सिस्टम vulnerable हो सकता है
    • CVE-2017-9224 सहित कई security vulnerabilities को ठीक किए जाने के मामले रहे हैं
  • unofficial malloc का उपयोग करने पर अजीब bugs आ सकते हैं

    • अगर आप developers द्वारा इस्तेमाल किए जाने वाले flags से आगे बढ़ते हैं, तो समस्या होने की संभावना बढ़ जाती है
  • यह पढ़कर कि एक साधारण बदलाव से speed में बड़ा सुधार मिल सकता है, jq के developer को बताने का मन होता है

    • लगता है लेख में इस विकल्प पर विचार नहीं किया गया, और comments में भी इसका ज़िक्र नहीं है
  • पैकेज को source से compile करना या official binary डाउनलोड करना फ़ायदेमंद हो सकता है

    • manual installation और source-compiled packages के updates track करना मुश्किल था, लेकिन इसे हल करने के लिए एक tool विकसित किया गया था
  • Rust की cargo install सुविधा उपयोगी है क्योंकि यह किसी खास platform के लिए optimization संभव बनाती है

    • jq इस्तेमाल करते समय performance सुधार के लिए jaq और yq अक्सर इस्तेमाल किए जाने वाले विकल्प हैं
  • memory allocator बदलने के बाद Ubuntu पैकेज को फिर से कॉन्फ़िगर करके 90% तेज़ बनाया जा सकता है

    • यह Debian और RedHat पर भी काम कर सकता है
    • पहले लगा था कि यह Ubuntu को Linux From Scratch में बदलने वाला लेख है