ہیج پیجز کے فائدے اور نقصانات

ہیج پیجز کے فائدے اور نقصانات

کورس کے طلباء کے لیے تیار کردہ مضمون کا ترجمہ "لینکس ایڈمنسٹریٹر".

پہلے، میں نے لینکس پر ہیج پیجز کی جانچ اور ان کو فعال کرنے کے بارے میں بات کی تھی۔
یہ مضمون صرف اس صورت میں مفید ہو گا جب آپ کے پاس ہیج پیجز استعمال کرنے کی جگہ ہو۔ میں نے بہت سارے لوگوں سے ملاقات کی ہے جو اس امکان سے بیوقوف ہیں کہ Hugepages جادوئی طور پر پیداوری کو بہتر بنائے گا۔ تاہم، ہیج پیجنگ ایک پیچیدہ موضوع ہے اور اگر غلط استعمال کیا جائے تو کارکردگی کو کم کر سکتا ہے۔

حصہ 1: اس بات کی تصدیق کرنا کہ بڑے صفحات لینکس پر فعال ہیں (اصل یہاں)

مسئلہ:
آپ کو یہ چیک کرنے کی ضرورت ہے کہ آیا آپ کے سسٹم پر ہیج پیجز فعال ہیں۔

حل:
یہ بہت آسان ہے:

cat /sys/kernel/mm/transparent_hugepage/enabled

آپ کو کچھ اس طرح ملے گا:

always [madvise] never

آپ کو دستیاب اختیارات کی فہرست نظر آئے گی (ہمیشہ، madvise، کبھی نہیں)، اور فی الحال فعال آپشن قوسین میں بند ہو جائے گا (بطور ڈیفالٹ پاگل).

پاگل اس کا مطلب ہے 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
  • madvise کو بطور ڈیفالٹ سیٹ کرنے کے لیے، استعمال کریں:
    CONFIG_TRANSPARENT_HUGEPAGE_MADVISE=y
    # Comment out CONFIG_TRANSPARENT_HUGEPAGE_ALWAYS=y

حصہ 2: ہیج پیجز کے فائدے اور نقصانات

ہم Hugepages کے استعمال کے فوائد، نقصانات اور ممکنہ نقصانات کو منتخب طور پر بیان کرنے کی کوشش کریں گے۔ چونکہ ایک تکنیکی طور پر پیچیدہ اور علمی مضمون کو ان لوگوں کے لیے سمجھنا مشکل ہو گا جو یہ سوچنے کے فریب میں مبتلا ہیں کہ ہیج پیجز ایک علاج ہے، اس لیے میں سادگی کے لیے درستگی کو قربان کروں گا۔ یہ ذہن میں رکھنے کے قابل ہے کہ بہت سارے موضوعات واقعی پیچیدہ ہیں اور اس وجہ سے بہت آسان ہیں۔

براہ کرم نوٹ کریں کہ ہم لینکس چلانے والے 64 بٹ x86 سسٹم کے بارے میں بات کر رہے ہیں، اور یہ کہ میں صرف یہ فرض کر رہا ہوں کہ یہ سسٹم شفاف ہیج پیجز کو سپورٹ کرتا ہے (چونکہ یہ کوئی نقصان نہیں ہے کہ بڑے صفحات کو اوور رائٹ نہیں کیا جاتا ہے)، جیسا کہ تقریباً کسی بھی جدید لینکس میں ہوتا ہے۔ ماحول

میں ذیل کے لنکس میں مزید تکنیکی وضاحت منسلک کروں گا۔

مجازی میموری

اگر آپ C++ پروگرامر ہیں، تو آپ جانتے ہیں کہ میموری میں موجود اشیاء کے مخصوص پتے (پوائنٹر ویلیوز) ہوتے ہیں۔

تاہم، یہ پتے لازمی طور پر میموری (RAM ایڈریس) میں جسمانی پتوں کی عکاسی نہیں کرتے ہیں۔ وہ ورچوئل میموری میں پتوں کی نمائندگی کرتے ہیں۔ پروسیسر کے پاس ایک خاص MMU (میموری مینجمنٹ یونٹ) ماڈیول ہے جو کرنل میپ ورچوئل میموری کو فزیکل لوکیشن میں مدد کرتا ہے۔

اس نقطہ نظر کے بہت سے فوائد ہیں، لیکن سب سے اہم یہ ہیں:

  • کارکردگی (مختلف وجوہات کی بناء پر)؛
  • پروگرام آئسولیشن یعنی کوئی بھی پروگرام دوسرے پروگرام کی میموری سے نہیں پڑھ سکتا۔

صفحات کیا ہیں؟

ورچوئل میموری کو صفحات میں تقسیم کیا گیا ہے۔ ہر انفرادی صفحہ ایک مخصوص جسمانی میموری کی طرف اشارہ کرتا ہے، یہ RAM میں کسی علاقے کی طرف اشارہ کر سکتا ہے، یا یہ کسی فزیکل ڈیوائس کو تفویض کردہ ایڈریس کی طرف اشارہ کر سکتا ہے، جیسے کہ ویڈیو کارڈ۔

زیادہ تر صفحات جن کے ساتھ آپ ڈیل کرتے ہیں یا تو وہ RAM کی طرف اشارہ کرتے ہیں یا تبدیل ہو جاتے ہیں، یعنی وہ آپ کی ہارڈ ڈرائیو یا SSD پر محفوظ ہوتے ہیں۔ دانا ہر صفحے کے فزیکل لے آؤٹ کا انتظام کرتا ہے۔ اگر کسی جعلی صفحہ تک رسائی حاصل کی جاتی ہے، تو کرنل اس تھریڈ کو روکتا ہے جو میموری تک رسائی حاصل کرنے کی کوشش کر رہا ہے، ہارڈ ڈرائیو/ایس ایس ڈی سے RAM میں صفحہ پڑھتا ہے، اور پھر تھریڈ پر عمل درآمد جاری رکھتا ہے۔

یہ عمل شفاف ہے، یعنی ضروری نہیں کہ یہ HDD/SSD سے براہ راست پڑھے۔ عام صفحات کا سائز 4096 بائٹس ہے۔ بڑے صفحات کا سائز 2 میگا بائٹس ہے۔

Translation-associative buffer (TLB)

جب کوئی پروگرام میموری کے کسی صفحے تک رسائی حاصل کرتا ہے، تو CPU کو معلوم ہونا چاہیے کہ کس فزیکل پیج سے ڈیٹا پڑھنا ہے (یعنی ایک ورچوئل ایڈریس میپ ہو)۔

کرنل میں ڈیٹا ڈھانچہ (صفحہ ٹیبل) ہوتا ہے جس میں استعمال ہونے والے صفحات کے بارے میں تمام معلومات ہوتی ہیں۔ اس ڈیٹا سٹرکچر کا استعمال کرتے ہوئے، آپ ایک ورچوئل ایڈریس کو فزیکل ایڈریس پر میپ کر سکتے ہیں۔

تاہم، صفحہ کی میز کافی پیچیدہ اور سست ہے، لہذا جب بھی کوئی عمل میموری تک رسائی حاصل کرتا ہے تو ہم پورے ڈیٹا ڈھانچے کا تجزیہ نہیں کر سکتے۔

خوش قسمتی سے، ہمارے پروسیسر میں ایک TLB ہے جو ورچوئل اور فزیکل ایڈریس کے درمیان میپنگ کو محفوظ کرتا ہے۔ اس کا مطلب یہ ہے کہ اگرچہ ہمیں پہلی رسائی کی کوشش پر صفحہ کے ٹیبل کو پارس کرنے کی ضرورت ہے، لیکن صفحہ تک تمام بعد میں رسائی کو TLB میں ہینڈل کیا جا سکتا ہے، جس سے تیزی سے کام کیا جا سکتا ہے۔

چونکہ یہ ایک فزیکل ڈیوائس کے طور پر لاگو ہوتا ہے (جو اسے پہلے جگہ پر تیز کرتا ہے)، اس کی صلاحیت محدود ہے۔ لہذا اگر آپ مزید صفحات تک رسائی حاصل کرنا چاہتے ہیں، تو TLB ان سب کے لیے نقشہ جات کو ذخیرہ نہیں کر سکے گا، جس کی وجہ سے آپ کا پروگرام بہت سست ہو جائے گا۔

بڑے صفحات بچاؤ کے لیے آتے ہیں۔

تو TLB اوور فلو سے بچنے کے لیے ہم کیا کر سکتے ہیں؟ (ہم فرض کرتے ہیں کہ پروگرام کو اب بھی اتنی ہی میموری کی ضرورت ہے)۔

یہ وہ جگہ ہے جہاں ہیج پیجز آتے ہیں۔ 4096 بائٹس کے بجائے صرف ایک TLB اندراج کی ضرورت ہوتی ہے، ایک TLB اندراج اب مکمل طور پر 2 میگا بائٹس کی طرف اشارہ کر سکتا ہے۔ آئیے فرض کریں کہ TLB میں 512 اندراجات ہیں، یہاں بڑے صفحات کے بغیر ہم میچ کر سکتے ہیں:

4096 b⋅512=2 MB

پھر ہم ان کے ساتھ کیسے موازنہ کر سکتے ہیں:

2 MB⋅512=1 GB

یہی وجہ ہے کہ ہیج پیجز بہت اچھے ہیں۔ وہ زیادہ محنت کے بغیر پیداوری کو بہتر بنا سکتے ہیں۔ لیکن یہاں اہم انتباہات ہیں۔

بڑے صفحات کی جعل سازی

دانا خود بخود نگرانی کرتا ہے کہ ہر میموری کا صفحہ کتنی بار استعمال ہوتا ہے۔ اگر کافی جسمانی میموری (RAM) نہیں ہے تو، دانا کم اہم (کم کثرت سے استعمال ہونے والے) صفحات کو ہارڈ ڈسک میں منتقل کرے گا تاکہ زیادہ اہم صفحات کے لیے کچھ RAM خالی کر سکے۔
اصولی طور پر، یہ ہیج پیجز پر لاگو ہوتا ہے۔ تاہم، دانا صرف پورے صفحات کو تبدیل کر سکتا ہے، انفرادی بائٹس کو نہیں۔

ہم کہتے ہیں کہ ہمارے پاس اس طرح کا پروگرام ہے:

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

اس صورت میں، کرنل کو ہارڈ ڈرائیو/ایس ایس ڈی سے صرف ایک بائٹ پڑھنے کے لیے زیادہ سے زیادہ 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(), اس موضوع میں ایک ناقابل یقین حد تک تیز سیکھنے کا وکر ہے۔ لہذا اگر آپ اس میں واقعی اچھا حاصل کرنے کا ارادہ رکھتے ہیں تو، کسی مثبت نتائج کی توقع کرنے سے پہلے چند ہفتوں تک پڑھنے اور جانچنے کے لیے تیار رہیں۔

کیا پڑھنا ہے؟

ایک سوال ہے؟ کمنٹس میں لکھیں!

ماخذ: www.habr.com

نیا تبصرہ شامل کریں