የHugepages ጥቅሞች እና ጉዳቶች

የHugepages ጥቅሞች እና ጉዳቶች

ለትምህርቱ ተማሪዎች የተዘጋጀውን ጽሑፍ ትርጉም "ሊኑክስ አስተዳዳሪ".

ከዚህ ቀደም Hugepagesን በሊኑክስ ላይ እንዴት እንደምሞክር እና ማንቃት እንዳለብኝ ተናግሬ ነበር።
ይህ ጽሑፍ ጠቃሚ የሚሆነው Hugepagesን የሚጠቀሙበት ቦታ ካሎት ብቻ ነው። Hugepages ምርታማነትን በአስማት ያሻሽለዋል በሚል ተስፋ የተታለሉ ብዙ ሰዎችን አግኝቻለሁ። ነገር ግን ግዙፍ ፔጅንግ ውስብስብ ርዕስ ነው እና በስህተት ጥቅም ላይ ከዋለ አፈፃፀሙን ሊያሳንስ ይችላል።

ክፍል 1፡ ግዙፍ ገፆች በሊኑክስ ላይ መንቃታቸውን ማረጋገጥ (የመጀመሪያው እዚህ)

ችግር:
HugePages በስርዓትዎ ላይ መንቃቱን ማረጋገጥ አለብዎት።

መፍትሔው:
በጣም ቀላል ነው፡-

cat /sys/kernel/mm/transparent_hugepage/enabled

እንደዚህ አይነት ነገር ያገኛሉ፡-

always [madvise] never

ያሉትን አማራጮች ዝርዝር ያያሉ (ሁሌም ፣ እብድ ፣ በጭራሽ), እና አሁን ያለው አማራጭ በቅንፍ ውስጥ (በነባሪ) ይዘጋል ማበድ).

ማበድ ማለት ነው transparent hugepages ግዙፍ ገጾችን ለመጠቀም ለሚጠይቁ የማህደረ ትውስታ ቦታዎች ብቻ የነቃ እብድ (2).

ሁል ጊዜ ማለት ነው transparent hugepages ለሁሉም ሂደቶች ሁል ጊዜ የነቃ። ይሄ አብዛኛውን ጊዜ አፈጻጸምን ያሻሽላል, ነገር ግን ብዙ ሂደቶች አነስተኛ መጠን ያለው ማህደረ ትውስታን የሚወስዱበት የአጠቃቀም መያዣ ካለዎት, አጠቃላይ የማህደረ ትውስታ ጭነት በከፍተኛ ሁኔታ ሊጨምር ይችላል.

ፈጽሞ ማለት ነው transparent hugepages madvise በመጠቀም ሲጠየቁ እንኳን አይካተትም። ለበለጠ መረጃ ያነጋግሩ ሰነድ የሊኑክስ ኮርነሎች.

ነባሪውን እሴት እንዴት እንደሚቀይሩ

አማራጭ 1: በቀጥታ መቀየር sysfs (እንደገና ከተነሳ በኋላ መለኪያው ወደ ነባሪ እሴቱ ይመለሳል)

echo always >/sys/kernel/mm/transparent_hugepage/enabled
echo madvise >/sys/kernel/mm/transparent_hugepage/enabled
echo never >/sys/kernel/mm/transparent_hugepage/enabled

አማራጭ 2፦ ከርነሉን በተሻሻለ ውቅር በማሰባሰብ የስርዓት ነባሪውን ይቀይሩ (ይህ አማራጭ የሚመከር ብጁ ከርነል የሚጠቀሙ ከሆነ ብቻ ነው)

  • ሁልጊዜ በነባሪነት ለማዘጋጀት፣ ይጠቀሙ፡-
    CONFIG_TRANSPARENT_HUGEPAGE_ALWAYS=y
    # Comment out CONFIG_TRANSPARENT_HUGEPAGE_MADVISE=y
  • ማድቪዝን እንደ ነባሪ ለማዘጋጀት፣ ይጠቀሙ፡-
    CONFIG_TRANSPARENT_HUGEPAGE_MADVISE=y
    # Comment out CONFIG_TRANSPARENT_HUGEPAGE_ALWAYS=y

ክፍል 2፡ የHugepages ጥቅሞች እና ጉዳቶች

Hugepagesን በመጠቀም ጥቅሞቹን ፣ ጉዳቶችን እና ሊሆኑ የሚችሉ ጉዳቶችን በመምረጥ ለማስረዳት እንሞክራለን። Hugepages መድሀኒት ነው ብለው ለሚታለሉ ሰዎች በቴክኖሎጂ ውስብስብ እና ፔዳንታዊ ፅሁፍ ለመረዳት አዳጋች ስለሚሆን ለቀላልነት ትክክለኛነትን እሰዋለሁ። ብዙ ርእሶች በእውነት የተወሳሰቡ እና በጣም የተቃለሉ መሆናቸውን ማስታወስ ብቻ ተገቢ ነው።

እባክዎን እየተነጋገርን ያለነው ሊኑክስን ስለሚያስኬዱ 64-ቢት x86 ሲስተሞች ነው ፣ እና ስርዓቱ ግልፅ ግዙፍ ገጾችን እንደሚደግፍ እገምታለሁ (ይህ ትልቅ ገጾች አለመፃፍ ጉዳቱ ስላልሆነ) በማንኛውም ዘመናዊ ሊኑክስ ውስጥ እንደሚታየው። አካባቢ.

ከዚህ በታች ባሉት ማገናኛዎች ውስጥ ተጨማሪ ቴክኒካዊ መግለጫዎችን አያይዛለሁ.

ምናባዊ ማህደረ ትውስታ

የC++ ፕሮግራም አድራጊ ከሆንክ በማህደረ ትውስታ ውስጥ ያሉ ነገሮች የተወሰኑ አድራሻዎች (ጠቋሚ እሴቶች) እንዳላቸው ታውቃለህ።

ሆኖም፣ እነዚህ አድራሻዎች የግድ አካላዊ አድራሻዎችን በማህደረ ትውስታ (ራም አድራሻዎች) የሚያንፀባርቁ አይደሉም። በምናባዊ ማህደረ ትውስታ ውስጥ አድራሻዎችን ይወክላሉ. ፕሮሰሰሩ የከርነል ካርታ ምናባዊ ማህደረ ትውስታን ወደ አካላዊ ቦታ የሚያግዝ ልዩ MMU (የማህደረ ትውስታ አስተዳደር ክፍል) ሞጁል አለው።

ይህ ዘዴ ብዙ ጥቅሞች አሉት, ነገር ግን በጣም አስፈላጊዎቹ የሚከተሉት ናቸው.

  • አፈፃፀም (በተለያዩ ምክንያቶች);
  • የፕሮግራም ማግለል ፣ ማለትም ፣ ምንም ፕሮግራም ከሌላ ፕሮግራም ማህደረ ትውስታ ማንበብ አይችልም።

ገጾች ምንድን ናቸው?

ምናባዊ ማህደረ ትውስታ በገጾች ተከፍሏል. እያንዳንዱ ገጽ ወደ አንድ የተወሰነ አካላዊ ማህደረ ትውስታ ይጠቁማል፣ ራም ውስጥ ያለውን ቦታ ሊያመለክት ይችላል፣ ወይም ለአካላዊ መሣሪያ የተመደበውን አድራሻ ለምሳሌ የቪዲዮ ካርድ ሊያመለክት ይችላል።

እርስዎ የሚያስተናግዷቸው አብዛኛዎቹ ገፆች ራም ይጠቁማሉ ወይም ይቀያይራሉ ይህም ማለት በሃርድ ድራይቭዎ ወይም በኤስኤስዲ ላይ ተከማችተዋል ማለት ነው። ከርነሉ የእያንዳንዱን ገጽ አካላዊ አቀማመጥ ያስተዳድራል። የተፈተለ ገፅ ከተደረሰ ከርነል ወደ ማህደረ ትውስታ ለመድረስ የሚሞክርን ክር ያቆማል፣ ገጹን ከሃርድ ድራይቭ/ኤስኤስዲ ወደ RAM ያነብባል እና ከዚያ ክር መስራቱን ይቀጥላል።

ይህ ሂደት ዥረት ግልጽ ነው፣ ይህም ማለት የግድ ከኤችዲዲ/ኤስኤስዲ በቀጥታ አይነበብም። የመደበኛ ገፆች መጠን 4096 ባይት ነው። ግዙፍ ገጾች መጠን 2 ሜጋባይት ነው።

የትርጉም-ተባባሪ ቋት (TLB)

አንድ ፕሮግራም የማስታወሻ ገጽን ሲደርስ ሲፒዩ ከየትኛው አካላዊ ገጽ ውሂብ ማንበብ እንዳለበት ማወቅ አለበት (ማለትም ምናባዊ የአድራሻ ካርታ ይኑርዎት)።

ከርነሉ ጥቅም ላይ ስለሚውሉ ገፆች ሁሉንም መረጃዎች የያዘ የውሂብ መዋቅር (የገጽ ሰንጠረዥ) አለው። ይህን የውሂብ መዋቅር በመጠቀም፣ ምናባዊ አድራሻን ወደ አካላዊ አድራሻ ማተም ይችላሉ።

ሆኖም የገጹ ሠንጠረዥ በጣም የተወሳሰበ እና ቀርፋፋ ነው፣ስለዚህ አንድ ሂደት ማህደረ ትውስታን በደረሰ ቁጥር የዳታ አወቃቀሩን በቀላሉ መተንተን አንችልም።

እንደ እድል ሆኖ፣ የእኛ ፕሮሰሰር በምናባዊ እና በአካላዊ አድራሻዎች መካከል ያለውን ካርታ የሚሸፍን TLB አለው። ይህ ማለት በመጀመሪያው የመዳረሻ ሙከራ ላይ የገጹን ሰንጠረዥ መተንተን ብንፈልግም ሁሉም ተከታይ የገጹ መዳረሻዎች በTLB ውስጥ ሊያዙ ይችላሉ፣ ይህም ፈጣን ስራን ይፈቅዳል።

እንደ አካላዊ መሳሪያ ስለሚተገበር (ይህም በመጀመሪያ ደረጃ ፈጣን ያደርገዋል), አቅሙ ውስን ነው. ስለዚህ ተጨማሪ ገጾችን ማግኘት ከፈለጉ፣ TLB ለሁሉም ካርታዎችን ማከማቸት አይችልም፣ ይህም ፕሮግራምዎ በጣም ቀርፋፋ እንዲሆን ያደርገዋል።

ግዙፍ ገጾች ለማዳን ይመጣሉ

ስለዚህ የTLB ከመጠን በላይ እንዳይፈስ ምን እናድርግ? (ፕሮግራሙ አሁንም ተመሳሳይ መጠን ያለው ማህደረ ትውስታ ያስፈልገዋል ብለን እንገምታለን).

Hugepages የሚመጣው እዚህ ነው። 4096 ባይት አንድ TLB መግቢያ ብቻ ከሚያስፈልገው፣ አንድ የTLB መግቢያ አሁን ግዙፍ 2 ሜጋባይት ሊያመለክት ይችላል። TLB 512 ግቤቶች እንዳሉት እናስብ፣ እዚህ ያለ Hugepages ልንመሳሰል እንችላለን፡

4096 b⋅512=2 MB

ከዚያ እንዴት ከነሱ ጋር ማወዳደር እንችላለን፡-

2 MB⋅512=1 GB

ለዚህ ነው Hugepages ግሩም የሆነው። ብዙ ጥረት ሳያደርጉ ምርታማነትን ማሻሻል ይችላሉ. ግን እዚህ ጉልህ ማስጠንቀቂያዎች አሉ።

ግዙፍ ገፆች ማፈግፈግ

ኮርነሉ እያንዳንዱ የማህደረ ትውስታ ገጽ ምን ያህል ጊዜ ጥቅም ላይ እንደሚውል በራስ-ሰር ይቆጣጠራል። በቂ አካላዊ ማህደረ ትውስታ (ራም) ከሌለ, ከርነል በጣም አስፈላጊ ለሆኑ ገፆች አንዳንድ ራም ለማስለቀቅ አስፈላጊ ያልሆኑ (ብዙ ጊዜ ጥቅም ላይ የማይውሉ) ገጾችን ወደ ሃርድ ዲስክ ይንቀሳቀሳል.
በመርህ ደረጃ, ለ Hugepages ተመሳሳይ ነው. ነገር ግን ከርነሉ የተናጠል ባይት ሳይሆን ሙሉ ገጾችን ብቻ ነው መቀየር የሚችለው።

እንደዚህ አይነት ፕሮግራም አለን እንበል፡-

char* mymemory = malloc(2*1024*1024); // Возьмем это за одну Hugepage!
// Заполним mymemory какими-либо данными
// Сделаем много других вещей,
// которые приведут к подмене страницы mymemory
// ...
// Запросим доступ только к первому байту
putchar(mymemory[0]); 

በዚህ አጋጣሚ ከርነል አንድ ባይት እንዲያነቡ ከሃርድ ድራይቭ/SSD እስከ 2 ሜጋባይት መረጃ መተካት (ማንበብ) ያስፈልገዋል። እንደ መደበኛ ገፆች፣ ከሃርድ ድራይቭ/ኤስኤስዲ ለማንበብ 4096 ባይት ብቻ ያስፈልጋል።

ስለዚህ፣ ግዙፍ ገጽ ከተሻረ፣ ሙሉውን ገጽ መድረስ ከፈለጉ ለማንበብ ፈጣን ይሆናል። ይህ ማለት የተለያዩ የማህደረ ትውስታ ክፍሎችን በዘፈቀደ ለመድረስ እየሞከሩ እና ሁለት ኪሎባይት ብቻ እያነበቡ ከሆነ መደበኛ ገፆችን መጠቀም እና ስለ ሌላ ነገር መጨነቅ አለብዎት.

በሌላ በኩል፣ ብዙ የማህደረ ትውስታ ክፍሎችን በቅደም ተከተል ማግኘት ከፈለጉ ግዙፍ ገፆች አፈጻጸምዎን ያሻሽላሉ። ነገር ግን፣ እራስዎ መሞከር አለብዎት (በአብስትራክት ሶፍትዌር ሳይሆን) እና ምን በፍጥነት እንደሚሰራ ይመልከቱ።

በማህደረ ትውስታ ውስጥ ምደባ

C ከጻፉ፣ በዘፈቀደ ትንሽ (ወይም በዘፈቀደ ትልቅ) የማህደረ ትውስታ መጠንን በመጠቀም ከቁልል መጠየቅ እንደሚችሉ ያውቃሉ። malloc(). 30 ባይት የማስታወስ ችሎታ ያስፈልግዎታል እንበል፡-

char* mymemory = malloc(30);

ለአንድ ፕሮግራም አውጪ፣ ከኦፕሬቲንግ ሲስተም 30 ባይት ማህደረ ትውስታን "እየጠየቁ" እና ጠቋሚን ወደ አንዳንድ ምናባዊ ማህደረ ትውስታ እየመለሱ ያሉ ሊመስል ይችላል። ግን በእውነቱ malloc () ከተግባሩ ውስጥ የሚጠራ C ተግባር ብቻ ነው። brk እና sbrk ከስርዓተ ክወናው ማህደረ ትውስታን ለመጠየቅ ወይም ነፃ ለማድረግ.

ሆኖም ለእያንዳንዱ ምደባ ብዙ እና ተጨማሪ ማህደረ ትውስታን መጠየቅ ውጤታማ አይደለም; ምናልባት አንዳንድ የማህደረ ትውስታ ክፍል ቀድሞውኑ የተፈታ ሊሆን ይችላል። (free()), እና እንደገና ልንጠቀምበት እንችላለን. malloc() የተፈታ ማህደረ ትውስታን እንደገና ለመጠቀም በጣም ውስብስብ ስልተ ቀመሮችን ተግባራዊ ያደርጋል።

በተመሳሳይ ጊዜ, ሁሉም ነገር ለእርስዎ ሳይስተዋል ይከሰታል, ስለዚህ ለምን ያስጨንቀዎታል? ግን ፈተናው ስለሆነ free() ማለት አይደለም። ማህደረ ትውስታ ወዲያውኑ ወደ ስርዓተ ክወናው ይመለሳል.

የማስታወስ መቆራረጥ የመሰለ ነገር አለ. በጣም በከፋ ሁኔታ ውስጥ፣ ጥቂት ባይት ብቻ ጥቅም ላይ የሚውሉ ክምር ክፍሎች አሉ፣ በመካከላቸው ያለው ነገር ሁሉ ተለቅቋል። (free()).

እባክዎን ያስታውሱ የማህደረ ትውስታ መከፋፈል በሚያስደንቅ ሁኔታ የተወሳሰበ ርዕስ ነው ፣ እና በፕሮግራሙ ላይ ትንሽ ለውጦች እንኳን ከፍተኛ ተጽዕኖ ሊያሳድሩ ይችላሉ። በአብዛኛዎቹ ሁኔታዎች ፕሮግራሞች ጉልህ የሆነ የማስታወስ መበታተን አያስከትሉም ፣ ግን በአንዳንድ ክምር አካባቢ የመከፋፈል ችግር ካለ ፣ ግዙፍ ገጾች ሁኔታውን ሊያባብሰው እንደሚችል ማወቅ አለብዎት።

ግዙፍ ገጾችን መምረጥ

ይህንን ጽሑፍ ካነበቡ በኋላ የትኞቹ የፕሮግራምዎ ክፍሎች ግዙፍ ገጾችን በመጠቀም ሊጠቀሙ እንደሚችሉ እና የትኞቹ እንደማይችሉ ወስነዋል። ስለዚህ ግዙፍ ገጾች በጭራሽ መንቃት አለባቸው?

እንደ እድል ሆኖ መጠቀም ይችላሉ madvise()ጠቃሚ ለሆኑት የማስታወሻ ቦታዎች ብቻ ግዙፍ ገጽን ለማንቃት።

በመጀመሪያ ግዙፍ ገፆች በmadvise() ሞድ ውስጥ እየሰሩ መሆናቸውን ያረጋግጡ መመሪያዎች በጽሁፉ መጀመሪያ ላይ.

ከዚያ ተጠቀም madvise()ግዙፍ ገጾችን የት እንደሚጠቀሙ በትክክል ለከርነል ለመንገር።

#include <sys/mman.h>
// Аллоцируйте большое количество памяти, которую будете использовать
size_t size = 256*1024*1024;
char* mymemory = malloc(size);
// Просто включите hugepages…
madvise(mymemory, size, MADV_HUGEPAGE);
// … и задайте следующее
madvise(mymemory, size, MADV_HUGEPAGE | MADV_SEQUENTIAL)

ይህ ዘዴ የማስታወስ ችሎታን እንዴት ማስተዳደር እንደሚቻል ለከርነል ምክር ብቻ መሆኑን ልብ ይበሉ። ይህ ማለት ኮርነሉ ለተወሰነ ማህደረ ትውስታ ግዙፍ ገጾችን ይጠቀማል ማለት አይደለም።

ሰነዶችን ይመልከቱ (manpage)madviseስለ ማህደረ ትውስታ አስተዳደር የበለጠ ለማወቅ እና madvise()ይህ ርዕስ በሚያስደንቅ ሁኔታ ቁልቁል የመማር አቅጣጫ አለው። ስለዚህ በጣም ጥሩ ለመሆን ካሰቡ ምንም አይነት አወንታዊ ውጤት ከመጠበቅዎ በፊት ለማንበብ ይዘጋጁ እና ለጥቂት ሳምንታት ይሞክሩ።

ምን ማንበብ?

ጥያቄ አለህ? በአስተያየቶቹ ውስጥ ይፃፉ!

ምንጭ: hab.com

አስተያየት ያክሉ