ዛሬ ስለ Sherlock ስርዓት አንዳንድ የቅርብ ጊዜ ዝመናዎችን ማውራት እንፈልጋለን [ይህ በስታንፎርድ ዩኒቨርሲቲ ከፍተኛ አፈጻጸም ያለው ስብስብ ነው - በግምት። 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()
(ይህ ሁሉ አይሳካለትም ምክንያቱም አካባቢያችን ls የሚፈልጓቸውን ባህሪያት ስለሌለው) 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 ሰከንድ, መዝገብ.
Sherlockን በማዘጋጀት ላይ
13 ሰከንድ በነባሪ ቅንጅቶች ወደ 0,3 ሰከንድ በትንሽ ማስተካከያ LS_COLORS
በሌለበት ምክንያት 40 እጥፍ ማፋጠን ማለት ነው። setuid
/ setgid
እና ባለቀለም ሊተገበሩ የሚችሉ ፋይሎች። እንደዚህ ያለ ትልቅ ኪሳራ አይደለም.
በእርግጥ ይህ አሁን በሼርሎክ ውስጥ ለእያንዳንዱ ተጠቃሚ ተዋቅሯል።
ግን ቀለሙን መመለስ ከፈለጉ በቀላሉ ወደ ነባሪ ቅንጅቶች መመለስ ይችላሉ-
$ unset LS_COLORS
ነገር ግን ብዙ ፋይሎች ባሉባቸው ማውጫዎች ላይ፣ በሚሰራበት ጊዜ ቡና ማፍላቱን እርግጠኛ ይሁኑ ls
.
ምንጭ: hab.com