جب ماحولیاتی متغیر عمل کو 40 گنا تیز کرتا ہے۔

آج ہم شرلاک سسٹم کی کچھ تازہ ترین اپڈیٹس کے بارے میں بات کرنا چاہتے ہیں [یہ اسٹینفورڈ یونیورسٹی میں ایک اعلیٰ کارکردگی کا کلسٹر ہے - تقریباً۔ trans.]، جو بڑی تعداد میں اندراجات کے ساتھ ڈائریکٹریز میں فائلوں کی فہرست سازی کو نمایاں طور پر تیز کرتا ہے۔

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

بہت سی فائلوں کی فہرست میں وقت لگتا ہے۔

یہ سب ایک صارف کے تکنیکی مدد کے سوال سے شروع ہوا۔ اس نے اس مسئلے کی اطلاع دی کہ پھانسی ls 15 سے زیادہ اندراجات کے ساتھ ڈائریکٹری میں چند منٹ لگتے ہیں۔ $SCRATCH [عارضی فائلوں کے لیے ڈائریکٹری - تقریبا. لین]۔

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

کیونکہ LS اچھا لگ رہا ہے۔

ہم نے دیکھا کہ یہ اصل میں کیا کرتا ہے۔ ls ڈائریکٹری کی فہرست بناتے وقت، اور اس عمل میں اتنا وقت کیوں لگتا ہے۔ زیادہ تر جدید تقسیم پر ls بطور ڈیفالٹ یہ چلتا ہے۔ ls --color=autoکیونکہ ہر کوئی رنگ پسند کرتا ہے۔

لیکن خوبصورت رنگ قیمت پر آتے ہیں: ہر فائل کے لیے ls مناسب رنگ منتخب کرنے کے لیے فائل کی قسم، اس کی اجازت، جھنڈوں، توسیعی صفات اور اس طرح کے بارے میں معلومات حاصل کرنا ضروری ہے۔

مسئلے کا ایک آسان حل یہ ہے کہ ls میں رنگ کو مکمل طور پر غیر فعال کر دیا جائے، لیکن صارفین کے غصے کا تصور کریں۔ کسی بھی حالت میں آپ کو رنگ کی پیداوار کو دور نہیں کرنا چاہئے، ہم راکشس نہیں ہیں.

تو ہم نے گہرائی میں دیکھا۔ ls ماحولیاتی متغیر کے ذریعے رنگوں کے اندراجات LS_COLORS، جو مقرر کیا گیا ہے۔ dircolors(1) کنفیگریشن فائل کی بنیاد پر dir_colors(5). جی ہاں، ایگزیکیوٹیبل کنفیگریشن فائل کو ماحولیاتی متغیر بنانے کے لیے پڑھتا ہے، جو پھر استعمال کرتا ہے۔ (اور اگر آپ فائلوں کے بارے میں نہیں جانتے ہیں۔ دروازہ (do)، پھر dir_colors یہ کام کرے گا، ہر چیز کے باوجود)۔

آئیے قریب سے دیکھیں

یہ تعین کرنے کے لیے کہ کون سی رنگ سکیم سست روی کا سبب بنتی ہے، ہم نے ایک تجرباتی ماحول بنایا:

$ mkdir $SCRATCH/dont
$ touch $SCRATCH/dont/{1..10000} # don't try this at home!
$ time ls --color=always $SCRATCH/dont | wc -l
10000

real    0m12.758s
user    0m0.104s
sys     0m0.699s

12,7 فائلوں کے لیے 10 سیکنڈ، بہت اچھا نہیں۔

ویسے ہمیں ایک جھنڈا چاہیے۔ --color=always: اگرچہ وہ رجوع کرتا ہے۔ ls --color=autoلیکن ls پتہ لگاتا ہے کہ جب یہ کسی ٹرمینل سے منسلک نہیں ہوتا ہے (جیسے پائپ کے ذریعے یا آؤٹ پٹ ری ڈائریکشن کے ساتھ) اور سیٹ ہونے پر رنگنے کو غیر فعال کر دیتا ہے۔ auto. ہوشیار آدمی۔

تو کیا اتنی دیر لگ رہی ہے؟ ہم نے ساتھ دیکھا strace:

$ strace -c ls --color=always $SCRATCH/dont | wc -l
10000
% time     seconds  usecs/call     calls    errors syscall
------ ----------- ----------- --------- --------- ----------------
 44.21    0.186617          19     10000           lstat
 42.60    0.179807          18     10000     10000 getxattr
 12.19    0.051438           5     10000           capget
  0.71    0.003002          38        80           getdents
  0.07    0.000305          10        30           mmap
  0.05    0.000217          12        18           mprotect
  0.03    0.000135          14        10           read
  0.03    0.000123          11        11           open
  0.02    0.000082           6        14           close
[...]

واہ: 10 کالز lstat()، 10 کالز getxattr() (جو سب ناکام ہو جاتے ہیں کیونکہ ہمارے ماحول میں وہ صفات نہیں ہیں جن کی تلاش ہے)، 10 کالز capget().

یقیناً اس کی اصلاح کی جا سکتی ہے۔

صلاحیتوں کا وصف؟ nope کیا

مشورے کے بعد 10 سال پہلے کا بگ، ہم نے انتساب کی جانچ کو غیر فعال کرنے کی کوشش کی۔ صلاحیتوں:

$ eval $(dircolors -b | sed s/ca=[^:]*:/ca=:/)
$ time strace -c ls --color=always $SCRATCH/dont | wc -l
10000
% time     seconds  usecs/call     calls    errors syscall
------ ----------- ----------- --------- --------- ----------------
 98.95    0.423443          42     10000           lstat
  0.78    0.003353          42        80           getdents
  0.04    0.000188          10        18           mprotect
  0.04    0.000181           6        30           mmap
  0.02    0.000085           9        10           read
  0.02    0.000084          28         3           mremap
  0.02    0.000077           7        11           open
  0.02    0.000066           5        14           close
[...]
------ ----------- ----------- --------- --------- ----------------
100.00    0.427920                 10221         6 total

real    0m8.160s
user    0m0.115s
sys     0m0.961s

واہ، ایکسلریشن کے 8 سیکنڈ تک! ہم نے ان تمام مہنگی کالوں سے جان چھڑائی getxattr()، اور چیلنجز capget() غائب بھی، بہت اچھا.

لیکن اب بھی یہ پریشان کن کالیں ہیں۔ lstat()، اگرچہ…

آپ کو کتنے پھولوں کی ضرورت ہے؟

لہذا، ہم نے قریب سے دیکھا LS_COLORS.

پہلے ہم نے صرف اس متغیر کو غیر فعال کیا:

$ echo $LS_COLORS
rs=0:di=01;34:ln=01;36:mh=00:pi=40;33:so=01;35:do=01;35:bd=40;33;01:cd=40;33;01:or=40;31;01:su=37;41:sg=30;43:ca=:tw=30;42:ow=34;42:st=37;44:ex=01;32:*.tar=01;31:*.tgz=01;31:*.arc=01;31:*.arj=01;31:*.taz=01;31:*.lha=01;31:*.lz4=01;31:*.lzh=01;31:*.lzma=01;31:*.tlz=01;31:*.txz=01;31:*.tzo=01;31:*.t7z=01;31:*.zip=01;31:*.z=01;31:*.Z=01;31:*.dz=01;31:*.gz=01;31:*.lrz=01;31:*.lz=01;31:*.lzo=01;31:*.xz=01;31:*.bz2=01;31:*.bz=01;31:*.tbz=01;31:*.tbz2=01;31:*.tz=01;31:*.deb=01;31:*.rpm=01;31:*.jar=01;31:*.war=01;31:*.ear=01;31:*.sar=01;31:*.rar=01;31:*.alz=01;31:*.ace=01;31:*.zoo=01;31:*.cpio=01;31:*.7z=01;31:*.rz=01;31:*.cab=01;31:*.jpg=01;35:*.jpeg=01;35:*.gif=01;35:*.bmp=01;35:*.pbm=01;35:*.pgm=01;35:*.ppm=01;35:*.tga=01;35:*.xbm=01;35:*.xpm=01;35:*.tif=01;35:*.tiff=01;35:*.png=01;35:*.svg=01;35:*.svgz=01;35:*.mng=01;35:*.pcx=01;35:*.mov=01;35:*.mpg=01;35:*.mpeg=01;35:*.m2v=01;35:*.mkv=01;35:*.webm=01;35:*.ogm=01;35:*.mp4=01;35:*.m4v=01;35:*.mp4v=01;35:*.vob=01;35:*.qt=01;35:*.nuv=01;35:*.wmv=01;35:*.asf=01;35:*.rm=01;35:*.rmvb=01;35:*.flc=01;35:*.avi=01;35:*.fli=01;35:*.flv=01;35:*.gl=01;35:*.dl=01;35:*.xcf=01;35:*.xwd=01;35:*.yuv=01;35:*.cgm=01;35:*.emf=01;35:*.axv=01;35:*.anx=01;35:*.ogv=01;35:*.ogx=01;35:*.aac=00;36:*.au=00;36:*.flac=00;36:*.mid=00;36:*.midi=00;36:*.mka=00;36:*.mp3=00;36:*.mpc=00;36:*.ogg=00;36:*.ra=00;36:*.wav=00;36:*.axa=00;36:*.oga=00;36:*.spx=00;36:*.xspf=00;36:
$ unset LS_COLORS
$ echo $LS_COLORS

$  time ls --color=always $SCRATCH/dont | wc -l
10000

real    0m13.037s
user    0m0.077s
sys     0m1.092s

کیا!؟! ابھی بھی 13 سیکنڈ؟

یہ پتہ چلتا ہے کہ جب ماحول متغیر ہوتا ہے LS_COLORS اس کے عناصر میں سے صرف ایک کی وضاحت نہیں کی گئی ہے یا غائب ہے۔ <type>=color:یہ پہلے سے طے شدہ ڈیٹا بیس کا استعمال کرتا ہے اور پھر بھی رنگ استعمال کرتا ہے۔ لہذا اگر آپ کسی مخصوص فائل کی قسم کے لئے رنگ کاری کو غیر فعال کرنا چاہتے ہیں، تو آپ کو اسے اوور رائڈ کرنے کی ضرورت ہے۔ <type>=: یا <type> 00 فائل میں DIR_COLORS.

کافی آزمائش اور غلطی کے بعد، ہم نے اپنی تلاش کو اس تک محدود کر دیا:

EXEC 00
SETUID 00
SETGID 00
CAPABILITY 00

جس کو لکھا جاتا ہے۔

LS_COLORS='ex=00:su=00:sg=00:ca=00:'

اس کا مطلب ہے: فائلوں کو انتساب کے لحاظ سے رنگ نہ دیں۔ صلاحیتوں، لیکن تھوڑا سا setuid/setgid، نہ ہی کی طرف سے عملدرآمد پرچم.

ہم تیز کرتے ہیں۔ ls

اور اگر آپ ان میں سے کوئی چیک نہیں کرتے ہیں تو پھر کال کریں۔ lstat() غائب، اور اب یہ بالکل مختلف معاملہ ہے:

$ export LS_COLORS='ex=00:su=00:sg=00:ca=00:'
$ time strace -c ls --color=always $SCRATCH/dont | wc -l
10000
% time     seconds  usecs/call     calls    errors syscall
------ ----------- ----------- --------- --------- ----------------
 63.02    0.002865          36        80           getdents
  8.10    0.000368          12        30           mmap
  5.72    0.000260          14        18           mprotect
  3.72    0.000169          15        11           open
  2.79    0.000127          13        10           read
[...]
------ ----------- ----------- --------- --------- ----------------
100.00    0.004546                   221         6 total

real    0m0.337s
user    0m0.032s
sys     0m0.029s

0,3 فائلوں کی فہرست پر 10 سیکنڈ، ایک ریکارڈ۔

شرلاک ترتیب دے رہا ہے۔

پہلے سے طے شدہ ترتیبات کے ساتھ 13 سیکنڈ سے 0,3 سیکنڈ تک معمولی ایڈجسٹمنٹ کے ساتھ LS_COLORS غیر موجودگی کی وجہ سے 40 گنا ایکسلریشن کا مطلب ہے۔ setuid / setgid اور رنگین قابل عمل فائلیں۔ اتنا بڑا نقصان نہیں۔

بلاشبہ، یہ اب ہر صارف کے لیے Sherlock میں ترتیب دیا گیا ہے۔

لیکن اگر آپ رنگ واپس کرنا چاہتے ہیں، تو آپ آسانی سے پہلے سے طے شدہ ترتیبات پر واپس جا سکتے ہیں:

$ unset LS_COLORS

لیکن پھر بہت ساری فائلوں والی ڈائریکٹریوں پر، کافی چلتے وقت اسے پینا یقینی بنائیں ls.

ماخذ: www.habr.com

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