آج ہم شرلاک سسٹم کی کچھ تازہ ترین اپڈیٹس کے بارے میں بات کرنا چاہتے ہیں [یہ اسٹینفورڈ یونیورسٹی میں ایک اعلیٰ کارکردگی کا کلسٹر ہے - تقریباً۔ trans.]، جو بڑی تعداد میں اندراجات کے ساتھ ڈائریکٹریز میں فائلوں کی فہرست سازی کو نمایاں طور پر تیز کرتا ہے۔
باقاعدہ مضامین کے برعکس، یہ ایک اندرونی رپورٹ ہے کہ ہم کس طرح باقاعدگی سے Sherlock پر کام کرتے ہیں تاکہ اسے اپنے صارفین کے لیے بہترین طریقے سے چلایا جا سکے۔ ہم مستقبل میں اس طرح کے مزید مضامین شائع کرنے کی امید کرتے ہیں۔
بہت سی فائلوں کی فہرست میں وقت لگتا ہے۔
یہ سب ایک صارف کے تکنیکی مدد کے سوال سے شروع ہوا۔ اس نے اس مسئلے کی اطلاع دی کہ پھانسی ls
15 سے زیادہ اندراجات کے ساتھ ڈائریکٹری میں چند منٹ لگتے ہیں۔ $SCRATCH
[عارضی فائلوں کے لیے ڈائریکٹری - تقریبا. لین]۔
ایک ڈائرکٹری میں ہزاروں فائلیں عام طور پر فائل سسٹم پر بوجھ بنتی ہیں اور یقینی طور پر اس کی سفارش نہیں کی جاتی ہے۔ صارف کو یہ معلوم تھا اور اس نے اعتراف کیا کہ یہ اچھا نہیں تھا، لیکن ذکر کیا کہ اس کے لیپ ٹاپ پر شیرلاک کے مقابلے میں لسٹنگ 1000 گنا زیادہ تیز تھی۔ یقیناً اس سے ہمیں تکلیف ہوئی۔ تو ہم نے گہرائی میں دیکھا۔
کیونکہ LS اچھا لگ رہا ہے۔
ہم نے دیکھا کہ یہ اصل میں کیا کرتا ہے۔ ls
ڈائریکٹری کی فہرست بناتے وقت، اور اس عمل میں اتنا وقت کیوں لگتا ہے۔ زیادہ تر جدید تقسیم پر ls
بطور ڈیفالٹ یہ چلتا ہے۔ ls --color=auto
کیونکہ ہر کوئی رنگ پسند کرتا ہے۔
لیکن خوبصورت رنگ قیمت پر آتے ہیں: ہر فائل کے لیے ls
مناسب رنگ منتخب کرنے کے لیے فائل کی قسم، اس کی اجازت، جھنڈوں، توسیعی صفات اور اس طرح کے بارے میں معلومات حاصل کرنا ضروری ہے۔
مسئلے کا ایک آسان حل یہ ہے کہ ls میں رنگ کو مکمل طور پر غیر فعال کر دیا جائے، لیکن صارفین کے غصے کا تصور کریں۔ کسی بھی حالت میں آپ کو رنگ کی پیداوار کو دور نہیں کرنا چاہئے، ہم راکشس نہیں ہیں.
تو ہم نے گہرائی میں دیکھا۔ ls
ماحولیاتی متغیر کے ذریعے رنگوں کے اندراجات LS_COLORS
، جو مقرر کیا گیا ہے۔ dircolors(1)
کنفیگریشن فائل کی بنیاد پر dir_colors(5)
. جی ہاں،
آئیے قریب سے دیکھیں
یہ تعین کرنے کے لیے کہ کون سی رنگ سکیم سست روی کا سبب بنتی ہے، ہم نے ایک تجرباتی ماحول بنایا:
$ 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 کیا
مشورے کے بعد
$ 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:'
اس کا مطلب ہے: فائلوں کو انتساب کے لحاظ سے رنگ نہ دیں۔
، نہ ہی کی طرف سے
ہم تیز کرتے ہیں۔ 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