ሰርቨሮቻችንን ያቀዘቀዘው የጎደለው የswap ፋይል
በሴፕቴምበር 24፣ ከምርት ሰርቨሮቻችን አንዱ መመለስ አቆመ። ሎድ ባላንሰሩ ጤናማ እንዳልሆነ ምልክት አደረገበት፤ የርቀት ትዕዛዝ መሳሪያችንም ሊደርስበት አልቻለም፤ ግን ምንም አልተበላሸም፤ ለብዙ ማህደረ ትውስታ ተገድሎም አልነበረም። ሰርቨሩ እየተንቀጠቀጠ ነበር፦ swap የለም፣ እና ኮንቴይነሮች ከማሽኑ ካለው በላይ ማህደረ ትውስታ እንዲጠቀሙ ተፈቅዶላቸው ነበር፤ ስለዚህ ሊኑክስ መሮጥ የሚያስፈልጉትን ፋይሎች እያስወጣና እንደገና እያነበበ ምንም ሂደት አላደረገም። በእያንዳንዱ ሰርቨር 2 GB swap ፋይል ማከል ችግሩን ፈታው። የበለጠ አስደሳቹ ትምህርት ስለ ጤና ፍተሻዎች ነበር።
“ቀዘቀዘ” ምን ይመስል ነበር
- የሎድ ባላንሰሩ የጤና ፍተሻዎች በዚያ ሰርቨር ላይ ጊዜ አለፉ።
- በAWS Systems Manager የተላኩ ትዕዛዞች “Pending” ላይ ቆዩ፤ ፈጽሞ አልሮጡም።
- በሎጎቹ ውስጥ የማህደረ ትውስታ ግድያ አልነበረም። ምንም ሂደት አልሞተም።
ከአንድ ሳምንት በፊት የምርት ሰርቨሮቻችንን እያንዳንዳቸው 2 GB ማህደረ ትውስታ ወዳላቸው ትናንሽ ARM ሰርቨሮች አዛውረን ነበር። የስቴጂንግ ሰርቨራችን፣ የበለጠ ትንሽ፣ በዴፕሎይ ጊዜ የኮንቴይነር ምስል ሲፈታ በተመሳሳይ መንገድ ቀዝቅዞ ነበር።
ለምን የማህደረ ትውስታ ስህተት የለም?
ሊኑክስ ሂደትን የሚገድለው እውነት ሊያስመልስ የሚችለው ማህደረ ትውስታ ሲያልቅ ብቻ ነው። ከዚያ በፊት ማህደረ ትውስታውን ከገጽ መሸጎጫ ያስመልሳል፤ ይህ ፋይሎች በRAM ውስጥ የሚይዝበት ቅጂ ነው፤ የእያንዳንዱ ሮጪ ፕሮግራም ኮድ ጭምር።
በሰርቨሮቻችን ላይ የኮንቴይነሮቹ የተጣመሩ የማህደረ ትውስታ ገደቦች ወደ 3.3 GB ይደርሳሉ፤ ማሽኑ ግን ወደ 1.8 GB ገደማ ብቻ ይጠቀማል። ብዙ ጊዜ ሁሉም ገደባቸውን በአንድ ጊዜ አይጠቀሙም። ሲጠቀሙ ግን ከርነሉ የፕሮግራም ኮዱን ከመሸጎጫው እያስወጣ ቦታ ይፈጥር ነበር፤ ያ ኮድ እንደገና ሲሮጥ ከዲስክ ያነበበዋል። ይህ ዑደት፣ መንቀጠቀጥ (thrashing)፣ ማሽኑን ከሞላ ጎደል ምላሽ-አልባ ሊያደርገው ይችላል፤ ቴክኒካል ማህደረ ትውስታው ግን በጭራሽ አያልቅም። ስለዚህ ምንም አይገደልም፤ ምንም አያገግምም።
swap በሌለበት ከርነሉ የተመደበ ግን አልፎ አልፎ የሚጠቀምበትን ማህደረ ትውስታ የሚያስቀምጥበት ቦታ የለውም፤ ስለዚህ ከመሸጎጫው ለመውሰድ ይገደዳል።
መፍትሄው
የሰርቨር ቡትስትራፕ ስክሪፕቱ አሁን በእያንዳንዱ ጊዜ ሰርቨር ሲነሳ ወይም ሲጠገን 2 GB swap ፋይል በዝቅተኛ swappiness (10) ይፈጥራል። ዝቅተኛ swappiness ማለት ከርነሉ አሁንም የሚሰራ ማህደረ ትውስታን በRAM ማቆየትን ይመርጣል፤ ነገር ግን እምብዛም የማይነኩ ገጾች ወደ ዲስክ ሊሄዱ ይችላሉ፤ የፕሮግራም ኮድን ከመሸጎጫው ከማስወጣት ይልቅ። በቀጥታ ለሁለቱ የምርት ሰርቨሮችና ለስቴጂንግ ተግብረነዋል፤ የዴፕሎይ ቧንቧው ደግሞ በእያንዳንዱ የምርት ዴፕሎይ የቡትስትራፕ ስክሪፕቱን እንደገና ያትማል፤ ስለዚህ የተተካ ሰርቨር ደግሞ ያገኘዋል።
እኛን የበለጠ ያሳሰበው ክፍል፦ ጤናማ ያልሆነው ሰርቨር ቀረ
የሰርቨር ቡድናችን EC2 የጤና ፍተሻዎችን ይጠቀም ነበር፤ “ማሽኑ እየሮጠ ነው?” የሚለውን፣ እንጂ የሎድ ባላንሰር የጤና ፍተሻዎችን ሳይሆን፣ “ለጥያቄዎች ምላሽ እየሰጠ ነው?” የሚለውን። ስለዚህ ሎድ ባላንሰሩ የተወውን ሰርቨር ቡድኑ አሁንም ጤናማ አድርጎ ይቆጥረዋል። ፈጽሞ አይተካም። የምርት ስራ በአንድ ሰርቨር ላይ በጸጥታ ይሮጣል፤ አንድ ሰው እስኪያስተውለውና ሌላውን እስኪያስነሳው ድረስ።
የቡድኑን ወደ ሎድ-ባላንሰር የጤና ፍተሻዎች መቀየር ግልጽ መፍትሄ ይመስላል፤ ግን ለእኛ ቀጥተኛ አይደለም፦ በዴፕሎይ ወቅት ሰርቨሮች ሆን ብለው የጤና መጨረሻ ነጥባቸው ላይ ስህተት ይመልሳሉ፤ ባላንሰሩ እንዲያፈናቅላቸው (ዜሮ 502 ዴፕሎይዎችን እንዴት እንዳገኘን ይመልከቱ)። በዚያ ምልክት ላይ የሚተካ ቡድን በእያንዳንዱ ዴፕሎይ መካከል ሰርቨሮችን ይተካል።
ስለዚህ ለአሁኑ ወደ ዴፕሎይ ማረጋገጫ ዝርዝራችን ደረጃ ጨመርን፦ ከእያንዳንዱ ዴፕሎይ በኋላ ሥራው ብቻ ሳይሆን የእያንዳንዱን ዒላማ ጤና በሎድ ባላንሰሩ ላይ ፈትሹ። ትዕዛዞች ወደ ሰርቨር “Pending” ላይ ከቆዩ፣ እየተንቀጠቀጠ ነው፤ ዳግም ያስነሱት፤ ቀድሞ ከመዞሪያው ውጭ ነው።
ከዚህ የወሰድነው
- “አለመበላሸት” ማለት “ጤናማ” ማለት አይደለም። መንቀጥቀጥ ምንም ስህተት አያመጣም፤ ማሽኑ ምላሽ መስጠት እስኪያቆም ድረስ ግን የዘገየ ነው።
- ትናንሽ ሰርቨሮች swap ያስፈልጋቸዋል። ትንሽ እንኳ፣ በዝቅተኛ swappiness፣ ለከርነሉ ቀዝቃዛ ማህደረ ትውስታ የሚያስቀምጥበት ቦታ ይሰጠዋል።
- ከማሽኑ የሚበልጡ የማህደረ ትውስታ ገደቦች ውርርድ ናቸው። አንዳንዴ ይሸነፋሉ። የወሰዱትን ውርርድ ሲጨርሱ ይወቁ።
- የራስ-ማስፋፊያዎ የሚያምነው የጤና ፍተሻ የትኛው እንደሆነ ይወቁ። “ቪኤም በርቷል?” ብቻ የሚጠይቅ የጤና ፍተሻ መስራት ያቆመውን ሰርቨር አይተካም።