Go, कंटेनर, और Linux scheduler
(riverphillips.dev)- कंटेनर के अंदर Go applications: Go developers अक्सर अपनी applications को ऐसे कंटेनरों में deploy करते हैं जहाँ host resources पर एकाधिकार रोकने के लिए CPU limits की आवश्यकता होती है.
- Go runtime और CPU limits: Go runtime स्वाभाविक रूप से कंटेनर की CPU limits को नहीं पहचानता, जिससे अत्यधिक उपयोग और performance problems हो सकती हैं.
- Go garbage collector (GC): Go का GC concurrent रूप से चलता है, लेकिन sweep termination और mark termination के दौरान data integrity के लिए छोटे 'stop-the-world' pauses की आवश्यकता होती है.
- Linux scheduler - CFS: Linux का Completely Fair Scheduler (CFS) CPU time को अनुपातिक रूप से allocate करता है, और processes को अनुमति प्राप्त cores के अनुरूप CPU time मिलता है.
- Go और CFS की समस्या: Go प्रत्येक CPU core के लिए एक OS thread बनाता है, लेकिन कंटेनर की CPU limits को अनदेखा कर सकता है, जिससे GC का 'stop-the-world' समय लंबा हो सकता है.
GOMAXPROCSसेट करना:GOMAXPROCSenvironment variable का उपयोग करके Go के OS threads को कंटेनर की CPU limits के अनुरूप सेट किया जा सकता है, जिससे GC latency कम होती है.GOMAXPROCSautomation: Uber कीautomaxprocslibrary कंटेनर limits के आधार परGOMAXPROCSको अपने आप सेट कर सकती है, जिससे configuration सरल हो जाता है.- भविष्य में Go runtime improvements: Go runtime में automatic CPU limit awareness को integrate करने के लिए एक खुला GitHub issue मौजूद है.
निष्कर्ष: कंटेनर के अंदर Go applications में resources के कुशल उपयोग और performance बनाए रखने के लिए CPU limits और GOMAXPROCS को सही तरीके से configure करना महत्वपूर्ण है.
1 टिप्पणियां
Hacker News की राय
--cpu-sharesइस्तेमाल करने की सिफारिशGOMEMLIMITजोड़े जाने और memory limit auto-configure करने वाले tool (automemlimit) का उल्लेखkotool के maintainer द्वारा project का उल्लेख करने पर आभार व्यक्त किया गया