نن ورځ موږ غواړو د شیرلاک سیسټم ته د ځینې وروستي تازه معلوماتو په اړه وغږیږو [دا د سټینفورډ پوهنتون کې د لوړ فعالیت کلستر دی - نږدې. trans.]، کوم چې د لوی شمیر ننوتلو سره په لارښودونو کې د فایلونو لیست کول د پام وړ ګړندي کوي.
د منظم مقالو برعکس، دا د داخلي راپور څخه ډیر دی چې څنګه موږ په منظم ډول په شیرلاک کار کوو ترڅو دا زموږ د کاروونکو لپاره په غوره توګه پرمخ بوځي. موږ هیله لرو چې په راتلونکي کې دا ډول نور مقالې خپرې کړو.
د ډیری فایلونو لیست کول وخت نیسي
دا ټول د یو کارونکي څخه د تخنیکي مالتړ پوښتنې سره پیل شوي. هغه د دې ستونزې راپور ورکړ چې د اعدام ls
په یوه ډایرکټر کې څو دقیقې وخت نیسي چې له 15 څخه زیاتو ننوتونو سره $SCRATCH
[د لنډمهاله فایلونو لپاره لارښود - نږدې. لین]
په یوه ډایرکټر کې په زرګونو فایلونه معمولا د فایل سیسټم ته یو بوج راوړي او یقینا سپارښتنه نه کیږي. کارونکي پدې پوهیدل او اعتراف یې وکړ چې دا ښه نه و ، مګر یادونه یې وکړه چې لیست کول د شیرلاک په پرتله د هغه په لپ ټاپ کې 1000 ځله ګړندی و. البته، دا موږ ته زیان رسوي. نو موږ ژوره وکتل.
ځکه چې دا ښکلی ښکاري
موږ وګورو چې دا واقعیا څه کوي 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()
.
یقینا دا اصلاح کیدی شي.
د وړتیا ځانګړتیا؟ نه
د مشورې تعقیب
$ 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
او رنګ شوي اجرا وړ فایلونه. دومره لوی تاوان نه دی.
البته، دا اوس د هر کارونکي لپاره په شیرلاک کې ترتیب شوی.
مګر که تاسو غواړئ رنګ بیرته راستانه کړئ، تاسو کولی شئ په ساده ډول ډیفالټ ترتیباتو ته راستانه شئ:
$ unset LS_COLORS
مګر بیا د ډیری فایلونو سره لارښودونو کې ، ډاډ ترلاسه کړئ چې د چلولو پرمهال کافي وخورئ ls
.
سرچینه: www.habr.com