جڏهن هڪ ماحولي تبديليءَ واري عمل کي 40 ڀيرا تيز ڪري ٿو

اڄ اسان شيرلڪ سسٽم جي ڪجهه جديد تازه ڪارين بابت ڳالهائڻ چاهيون ٿا [هي اسٽينفورڊ يونيورسٽي ۾ هڪ اعلي ڪارڪردگي ڪلستر آهي - تقريبن. trans.]، جيڪو خاص طور تي فائلن جي لسٽنگ کي تيز ڪري ٿو ڊائريڪٽرن ۾ وڏي تعداد ۾ داخل ٿيڻ سان.

باقاعده مضمونن جي برعڪس، هي هڪ اندروني رپورٽ کان وڌيڪ آهي ته ڪيئن اسان باقاعده شيرلڪ تي ڪم ڪريون ٿا ته جيئن ان کي اسان جي استعمال ڪندڙن لاءِ بهترين طريقي سان هلايو وڃي. اسان کي اميد آهي ته مستقبل ۾ هن قسم جا وڌيڪ مضمون شايع ٿيندا.

گھڻن فائلن کي لسٽ ڪرڻ وقت وٺندو آهي

اهو سڀ هڪ صارف کان ٽيڪنيڪل سپورٽ سوال سان شروع ٿيو. هن مسئلي کي ٻڌايو ته execution ls ڊاريڪٽري ۾ 15 کان وڌيڪ داخلائن سان گڏ ڪجھ منٽ لڳن ٿا $SCRATCH [ڊائريڪٽري عارضي فائلن لاءِ - تقريبن. لين].

ھڪڙي ڊاريڪٽري ۾ ھزارين فائلون عام طور تي فائل سسٽم تي بوجھ پيدا ڪن ٿيون ۽ يقيني طور تي سفارش نه ڪئي وئي آھي. صارف اهو ڄاڻيو ۽ تسليم ڪيو ته اهو سٺو نه هو، پر ذڪر ڪيو ويو ته لسٽنگ شيرلڪ جي ڀيٽ ۾ سندس ليپ ٽاپ تي 1000 ڀيرا تيز هئي. يقينن، هن اسان کي نقصان پهچايو. تنهنڪري اسان وڌيڪ اونهي ڏٺو.

ڇاڪاڻ ته LS سٺو لڳندو آهي

اسان ڏٺو ته اهو اصل ۾ ڇا ڪندو آهي ls جڏهن هڪ ڊاريڪٽري لسٽ ڪري ٿي، ۽ اهو عمل ايترو ڊگهو ڇو وٺندو آهي. سڀ کان وڌيڪ جديد تقسيم تي ls ڊفالٽ طور تي هلندو آهي ls --color=auto، ڇاڪاڻ ته هرڪو رنگ پسند ڪندو آهي.

پر خوبصورت رنگ قيمت تي اچن ٿا: هر فائل لاءِ ls مناسب رنگ چونڊڻ لاءِ فائل جي قسم، ان جي اجازتن، جھنڊن، وڌايل خاصيتن ۽ جھڙوڪ بابت معلومات حاصل ڪرڻ گھرجي.

مسئلي جو ھڪڙو سادو حل آھي ls ۾ رنگ کي مڪمل طور تي غير فعال ڪرڻ، پر تصور ڪريو صارفين کان ناراضگي. ڪنهن به حالت ۾ توهان کي رنگ ڪڍڻ نه گهرجي، اسان راکشس نه آهيون.

تنهنڪري اسان وڌيڪ اونهي ڏٺو. ls ماحول جي تبديليءَ ذريعي رنگن جي داخلا LS_COLORS، جيڪو مقرر ڪيو ويو آهي dircolors(1) ترتيب واري فائل جي بنياد تي dir_colors(5). ها، executable ماحول جي متغير ٺاهڻ لاءِ ترتيب واري فائل کي پڙهي ٿو، جيڪو پوءِ استعمال ڪري ٿو (۽ جيڪڏهن توهان فائلن بابت نٿا ڄاڻو در آهي (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() (جيڪو سڀ ناڪام ٿيو ڇو ته اسان جي ماحول ۾ خاصيتون نه آهن ls ڳولي رهيو آهي)، 10 ڪالون capget().

يقينن اهو بهتر ٿي سگهي ٿو.

صلاحيتون وصف؟ نه

مشوري جي پٺيان 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 سيڪنڊ؟

اهو ظاهر ٿئي ٿو ته جڏهن ماحول variable 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، نه ئي طرفان executability پرچم.

اسان تيز ڪريون ٿا 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 ۽ رنگدار عملدار فائلون. ايترو وڏو نقصان ناهي.

يقينن، هي هاڻي هر صارف لاء شيرلڪ ۾ ترتيب ڏنل آهي.

پر جيڪڏهن توهان رنگين کي واپس ڪرڻ چاهيو ٿا، توهان صرف ڊفالٽ سيٽنگون ڏانهن واپس ڪري سگهو ٿا:

$ unset LS_COLORS

پر پوءِ ڊاريڪٽري تي تمام گهڻيون فائلون، پڪ سان پڪ ڪريو ته ان کي هلائڻ دوران ڪافي پيئجي ls.

جو ذريعو: www.habr.com

تبصرو شامل ڪريو