የአካባቢ ተለዋዋጭ ሂደቱን በ 40 ጊዜ ሲያፋጥነው

ዛሬ ስለ Sherlock ስርዓት አንዳንድ የቅርብ ጊዜ ዝመናዎችን ማውራት እንፈልጋለን [ይህ በስታንፎርድ ዩኒቨርሲቲ ከፍተኛ አፈጻጸም ያለው ስብስብ ነው - በግምት። trans.]፣ ይህም ብዙ ቁጥር ያላቸው ምዝግቦች ባሉባቸው ማውጫዎች ውስጥ ያሉ ፋይሎችን መዘርዘርን በእጅጉ ያፋጥናል።

ከመደበኛ መጣጥፎች በተለየ ይህ በሼርሎክ ላይ በመደበኛነት እንዴት እንደምንሰራ ለተጠቃሚዎቻችን በተሻለ ሁኔታ እንዲሰራ ለማድረግ የበለጠ የውስጥ አዋቂ ዘገባ ነው። እንደዚህ ያሉ ተጨማሪ ጽሑፎችን ወደፊት ለማተም ተስፋ እናደርጋለን።

ብዙ ፋይሎችን መዘርዘር ጊዜ ይወስዳል

ሁሉም የተጀመረው ከአንድ ተጠቃሚ የቴክኒክ ድጋፍ ጥያቄ ነው። አፈጻጸሙ ያለውን ችግር ዘግቧል ls ከ15 በላይ መግቢያዎች ባለው ማውጫ ውስጥ ጥቂት ደቂቃዎችን ይወስዳል $SCRATCH [ለጊዜያዊ ፋይሎች ማውጫ - በግምት. መስመር]።

በአንድ ማውጫ ውስጥ ያሉ በሺዎች የሚቆጠሩ ፋይሎች ብዙውን ጊዜ በፋይል ስርዓቱ ላይ ሸክም ይፈጥራሉ እና በእርግጠኝነት አይመከርም። ተጠቃሚው ይህንን አውቆ ጥሩ እንዳልሆነ አምኗል፣ ነገር ግን ዝርዝሩ በላፕቶፑ ላይ ከሼርሎክ በ1000 እጥፍ ፈጣን እንደነበር ጠቅሷል። በእርግጥ ይህ ጎድቶናል። ስለዚህ በጥልቀት ተመለከትን።

ምክንያቱም ጥሩ ይመስላል።

በትክክል የሚሰራውን ተመልክተናል ls ማውጫ ሲዘረዝሩ እና ለምን ሂደቱ ረጅም ጊዜ ይወስዳል። በአብዛኛዎቹ ዘመናዊ ስርጭቶች ላይ ls በነባሪነት እንደ ይሰራል ls --color=auto, ምክንያቱም ሁሉም ሰው ቀለሞችን ይወዳሉ.

ግን የሚያምሩ ቀለሞች ዋጋ አላቸው: ለእያንዳንዱ ፋይል ls ተገቢውን ቀለም ለመምረጥ ስለ የፋይል አይነት፣ ፈቃዶቹ፣ ባንዲራዎች፣ የተራዘሙ ባህሪያት እና የመሳሰሉት መረጃ ማግኘት አለበት።

ለችግሩ አንድ ቀላል መፍትሄ በ ls ውስጥ ቀለምን በአጠቃላይ ማሰናከል ነው, ነገር ግን የተጠቃሚዎችን ቁጣ አስቡት. በምንም አይነት ሁኔታ የቀለም ውጤትን መውሰድ የለብዎትም, እኛ ጭራቆች አይደለንም.

ስለዚህ በጥልቀት ተመለከትን። ls በአካባቢ ተለዋዋጭ በኩል ቀለሞች ግቤቶች LS_COLORS, የተቀመጠው dircolors(1) በማዋቀር ፋይል ላይ የተመሠረተ dir_colors(5)... አዎ, ተፈጻሚው የአካባቢ ተለዋዋጭ ለመፍጠር የውቅር ፋይሉን ያነባል፣ ይህም ls ከዚያ ይጠቀማል (እና ስለ ፋይሎች የማያውቁ ከሆነ በር (አድርገው)፣ ከዚያ 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 ሰከንድ?

አካባቢው በሚለዋወጥበት ጊዜ ተለወጠ 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 ሰከንድ, መዝገብ.

Sherlockን በማዘጋጀት ላይ

13 ሰከንድ በነባሪ ቅንጅቶች ወደ 0,3 ሰከንድ በትንሽ ማስተካከያ LS_COLORS በሌለበት ምክንያት 40 እጥፍ ማፋጠን ማለት ነው። setuid / setgid እና ባለቀለም ሊተገበሩ የሚችሉ ፋይሎች። እንደዚህ ያለ ትልቅ ኪሳራ አይደለም.

በእርግጥ ይህ አሁን በሼርሎክ ውስጥ ለእያንዳንዱ ተጠቃሚ ተዋቅሯል።

ግን ቀለሙን መመለስ ከፈለጉ በቀላሉ ወደ ነባሪ ቅንጅቶች መመለስ ይችላሉ-

$ unset LS_COLORS

ነገር ግን ብዙ ፋይሎች ባሉባቸው ማውጫዎች ላይ፣ በሚሰራበት ጊዜ ቡና ማፍላቱን እርግጠኛ ይሁኑ ls.

ምንጭ: hab.com

አስተያየት ያክሉ