کله چې د چاپیریال متغیر پروسه 40 ځله تیزوي

نن ورځ موږ غواړو د شیرلاک سیسټم ته د ځینې وروستي تازه معلوماتو په اړه وغږیږو [دا د سټینفورډ پوهنتون کې د لوړ فعالیت کلستر دی - نږدې. trans.]، کوم چې د لوی شمیر ننوتلو سره په لارښودونو کې د فایلونو لیست کول د پام وړ ګړندي کوي.

د منظم مقالو برعکس، دا د داخلي راپور څخه ډیر دی چې څنګه موږ په منظم ډول په شیرلاک کار کوو ترڅو دا زموږ د کاروونکو لپاره په غوره توګه پرمخ بوځي. موږ هیله لرو چې په راتلونکي کې دا ډول نور مقالې خپرې کړو.

د ډیری فایلونو لیست کول وخت نیسي

دا ټول د یو کارونکي څخه د تخنیکي مالتړ پوښتنې سره پیل شوي. هغه د دې ستونزې راپور ورکړ چې د اعدام ls په یوه ډایرکټر کې څو دقیقې وخت نیسي چې له 15 څخه زیاتو ننوتونو سره $SCRATCH [د لنډمهاله فایلونو لپاره لارښود - نږدې. لین]

په یوه ډایرکټر کې په زرګونو فایلونه معمولا د فایل سیسټم ته یو بوج راوړي او یقینا سپارښتنه نه کیږي. کارونکي پدې پوهیدل او اعتراف یې وکړ چې دا ښه نه و ، مګر یادونه یې وکړه چې لیست کول د شیرلاک په پرتله د هغه په ​​لپ ټاپ کې 1000 ځله ګړندی و. البته، دا موږ ته زیان رسوي. نو موږ ژوره وکتل.

ځکه چې دا ښکلی ښکاري

موږ وګورو چې دا واقعیا څه کوي 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().

یقینا دا اصلاح کیدی شي.

د وړتیا ځانګړتیا؟ نه

د مشورې تعقیب بګ د 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 او رنګ شوي اجرا وړ فایلونه. دومره لوی تاوان نه دی.

البته، دا اوس د هر کارونکي لپاره په شیرلاک کې ترتیب شوی.

مګر که تاسو غواړئ رنګ بیرته راستانه کړئ، تاسو کولی شئ په ساده ډول ډیفالټ ترتیباتو ته راستانه شئ:

$ unset LS_COLORS

مګر بیا د ډیری فایلونو سره لارښودونو کې ، ډاډ ترلاسه کړئ چې د چلولو پرمهال کافي وخورئ ls.

سرچینه: www.habr.com

Add a comment