<p>- Heap विश्लेषण के लिए मल्टी-पेटाबाइट Postgres चला रहा है<br />
- तेज़ी से बढ़ते हुए node utilization 80% से ऊपर चला गया, जिससे ingestion pipeline में performance समस्याएँ आने लगीं <br />
- समस्या की जड़ यह थी कि SSD में utilization 100% के करीब पहुँचने पर performance घटने की प्रवृत्ति होती है<br />
- ZFS, जो CoW(Copy-on-Write) है, उपयोग करने से समस्या और बढ़ गई <br />
→ हर बार block update होने पर एक नई copy लिखी जाती है <br />
- बेशक, CoW के कई फायदे भी हैं<br />
→ filesystem-level compression दूसरे filesystems की तुलना में आसान है, इसलिए 4-5x compression के साथ space बचाया जा सका <br />
→ अधिक durability होने से Postgres के `full_page_writes` को disable किया जा सकता है, जिससे performance भी बेहतर होती है और कुल IO कम होता है <br />
→ consistency सुनिश्चित करने वाले point-in-time snapshots — क्योंकि pages वास्तव में immutable रहते हैं, इसलिए snapshot के दौरान भी पुराने pages बने रहते हैं<br />
- लेकिन ZFS जैसे CoW filesystems में capacity भरने के साथ performance गिरती है<br />
→ हर page update पर block allocator को खाली blocks खोजने पड़ते हैं, इसलिए utilization बढ़ने पर performance degradation गंभीर हो जाता है <br />
→ पहले unlink किए गए blocks को हटाना पड़ता है और उन्हें मौजूदा blocks के साथ मिलाना पड़ता है <br />
→ बेहतर compression ratio पाने के लिए block size को बड़ा करके 64kb रखा गया था, जिससे स्थिति और खराब हुई <br />
→ इन कारणों से ZFS का utilization 80% से ऊपर न जाने देना बेहतर है <br />
<br />
- ZFS 2.x में upgrade करके lz4 compression से Zstandard compression पर जाने की कोशिश की गई <br />
→ lz4 बहुत तेज़ है और लगभग 4.4x compression ratio देता है <br />
→ Zstandard लगभग 5.5x तक compression ratio देता है, यानी 20% सुधार <br />
→ लेकिन कई benchmarks में Zstandard, lz4 से धीमा दिखा<br />
→ इसलिए वास्तविक परिस्थिति में कड़े tests करने का फैसला किया गया <br />
→ test results में query performance में कोई बदलाव नहीं था, storage usage लगभग 20% घट गया, और write query time आधा रह गया <br />
<br />
- Heap का DB cluster 5 nodes में बँटा है, और हर node अपने-अपने ASG में शामिल है <br />
→ node बदलना आसान था: बस उसे ASG से अलग करना था, फिर ASG नया node बनाता, latest backup से restore करता और warm standby mode में चला जाता <br />
→ नई configuration के साथ AMI बनाया गया और हर node पर एक-एक करके बदलाव किए गए <br />
→ कुल usage लगभग 21% घटा, write time 50% कम हुआ, और query performance में खास फर्क नहीं था </p>
1 टिप्पणियां