- Ghostty terminal emulator में लंबे समय तक चलने पर दर्जनों GB memory घेर लेने वाली गंभीर leak समस्या पाई गई
- समस्या की जड़ PageList struct की non-standard memory page reuse logic में थी, जहाँ
munmap कॉल नहीं होने से मुक्त न हुई memory जमा होती रही
- Claude Code CLI बार-बार multi-codepoint grapheme output बनाता है, जिससे non-standard page का उपयोग बढ़ा और leak बड़े पैमाने पर सामने आया
- fix में non-standard pages को reuse न करके तुरंत मुक्त करने के लिए बदलाव किया गया, और macOS की VM tag feature का उपयोग leak को trace और verify करने में किया गया
- इस fix को Ghostty की सबसे बड़ी leak समस्या का समाधान माना जा रहा है, और इसे आने वाले release (1.3) में शामिल किया जाएगा
Ghostty की memory leak का overview
- कुछ users ने रिपोर्ट किया कि Ghostty लंबे समय तक चलने के बाद 37GB से अधिक memory उपयोग कर रहा था
- leak कम से कम version 1.0 से मौजूद थी, और हाल की CLI apps ने कुछ विशेष conditions पूरी करके इस समस्या को उजागर किया
- fix पहले ही GitHub में merge हो चुका है, और nightly builds तथा 1.3 stable release में शामिल होगा
PageList structure और memory management का तरीका
- Ghostty terminal content को स्टोर करने के लिए PageList नाम की doubly linked list structure का उपयोग करता है
- हर page में characters, styles, hyperlinks आदि का data होता है
- pages को
mmap से allocate किया जाता है, और standard-size page pool के ज़रिए reuse किया जाता है
- standard size या उससे छोटे pages pool में वापस कर दिए जाते हैं
- non-standard size pages को सीधे
munmap से मुक्त करना होता है
- यह structure अपने आप में सही है, लेकिन optimization logic के bug की वजह से leak हुई
Scrollback optimization और bug का कारण
- Ghostty,
scrollback-limit पार होने पर सबसे पुराने page को reuse करने वाला optimization करता है
- नया page allocate किए बिना सिर्फ pointers बदलकर performance बेहतर होती है
- समस्या यह थी कि इस प्रक्रिया में non-standard page का सिर्फ metadata standard size में बदला गया, जबकि वास्तविक memory वैसी ही रही
- बाद में मुक्त करते समय उसे standard page समझ लिया गया, इसलिए
munmap कॉल ही नहीं हुआ
- इसके कारण non-standard pages मुक्त हुए बिना जमा होते गए, और लंबे runtime में बड़े पैमाने की memory leak हुई
Claude Code और leak का बड़े पैमाने पर सामने आना
- Claude Code CLI अक्सर multi-codepoint grapheme output बनाता है, जिससे non-standard page usage बढ़ गया
- इसके अलावा scrollback output भी बहुत होने से leak तेज़ी से जमा हुई
- Ghostty की design में non-standard pages का होना दुर्लभ होना चाहिए, लेकिन Claude Code की प्रकृति के कारण leak बड़े पैमाने पर reproduce हुई
- developer ने स्पष्ट किया कि यह bug Claude Code की समस्या नहीं, बल्कि Ghostty की internal logic की कमी है
क्या बदला गया
VM tag का उपयोग करके leak trace करना
- macOS के Mach kernel VM tag feature का उपयोग करके PageList memory allocations को विशेष tag दिया गया
- debugging के समय Ghostty के memory regions को साफ़ तौर पर पहचाना जा सकता है
- leak के कारण को trace करने और fix verify करने में इससे बड़ी मदद मिली
- इस feature से PageList से जुड़ी memory के मुक्त होने या न होने को visual तौर पर जांचना संभव हुआ
Ghostty की memory leak prevention व्यवस्था
- Ghostty कई तरीकों से leak को detect और prevent करता है
- debug builds और unit tests में Zig का leak-detecting allocator उपयोग होता है
- CI में valgrind से पूरा test suite चलाया जाता है
- macOS Instruments से Swift code leak checks किए जाते हैं
- GTK से जुड़े PRs को Valgrind GUI tests से verify किया जाता है
- यह leak सिर्फ खास conditions में होती थी, इसलिए मौजूदा tests में reproduce नहीं हो पाई
- नया test case जोड़ दिया गया है ताकि regression को रोका जा सके
निष्कर्ष
- यह मामला Ghostty में अब तक की सबसे बड़ी memory leak के रूप में सामने आया
- fix के बाद भी user reports और reproduction tests के ज़रिए लगातार monitoring की जाएगी
- community द्वारा दिए गए diagnostic data और reproduction cases ने समस्या हल करने में निर्णायक भूमिका निभाई
- यह फिर रेखांकित हुआ कि reproducible environment memory leak ठीक करने की कुंजी है
अभी कोई टिप्पणी नहीं है.