ಪರಿಸರ ವೇರಿಯಬಲ್ ಪ್ರಕ್ರಿಯೆಯನ್ನು 40 ಪಟ್ಟು ವೇಗಗೊಳಿಸಿದಾಗ

ಇಂದು ನಾವು ಷರ್ಲಾಕ್ ಸಿಸ್ಟಮ್‌ಗೆ ಕೆಲವು ಇತ್ತೀಚಿನ ನವೀಕರಣಗಳ ಕುರಿತು ಮಾತನಾಡಲು ಬಯಸುತ್ತೇವೆ [ಇದು ಸ್ಟ್ಯಾನ್‌ಫೋರ್ಡ್ ವಿಶ್ವವಿದ್ಯಾಲಯದಲ್ಲಿ ಉನ್ನತ-ಕಾರ್ಯಕ್ಷಮತೆಯ ಕ್ಲಸ್ಟರ್ - ಅಂದಾಜು. ಟ್ರಾನ್ಸ್.], ಇದು ಹೆಚ್ಚಿನ ಸಂಖ್ಯೆಯ ನಮೂದುಗಳೊಂದಿಗೆ ಡೈರೆಕ್ಟರಿಗಳಲ್ಲಿ ಫೈಲ್‌ಗಳನ್ನು ಪಟ್ಟಿ ಮಾಡುವುದನ್ನು ಗಮನಾರ್ಹವಾಗಿ ವೇಗಗೊಳಿಸುತ್ತದೆ.

ಸಾಮಾನ್ಯ ಲೇಖನಗಳಿಗಿಂತ ಭಿನ್ನವಾಗಿ, ಇದು ನಮ್ಮ ಬಳಕೆದಾರರಿಗೆ ಉತ್ತಮವಾಗಿ ಕಾರ್ಯನಿರ್ವಹಿಸಲು ಷರ್ಲಾಕ್‌ನಲ್ಲಿ ನಾವು ಹೇಗೆ ನಿಯಮಿತವಾಗಿ ಕೆಲಸ ಮಾಡುತ್ತೇವೆ ಎಂಬುದರ ಕುರಿತು ಆಂತರಿಕ ವರದಿಯಾಗಿದೆ. ಮುಂದೆಯೂ ಇಂತಹ ಇನ್ನಷ್ಟು ಲೇಖನಗಳನ್ನು ಪ್ರಕಟಿಸಲೆಂದು ಆಶಿಸುತ್ತೇವೆ.

ಅನೇಕ ಫೈಲ್‌ಗಳನ್ನು ಪಟ್ಟಿ ಮಾಡಲು ಸಮಯ ತೆಗೆದುಕೊಳ್ಳುತ್ತದೆ

ಇದು ಎಲ್ಲಾ ಬಳಕೆದಾರರಿಂದ ತಾಂತ್ರಿಕ ಬೆಂಬಲ ಪ್ರಶ್ನೆಯೊಂದಿಗೆ ಪ್ರಾರಂಭವಾಯಿತು. ಅವರು ಮರಣದಂಡನೆ ಸಮಸ್ಯೆಯನ್ನು ವರದಿ ಮಾಡಿದರು ls 15 ನಮೂದುಗಳನ್ನು ಹೊಂದಿರುವ ಡೈರೆಕ್ಟರಿಯಲ್ಲಿ ಕೆಲವು ನಿಮಿಷಗಳನ್ನು ತೆಗೆದುಕೊಳ್ಳುತ್ತದೆ $SCRATCH [ತಾತ್ಕಾಲಿಕ ಫೈಲ್‌ಗಳಿಗಾಗಿ ಡೈರೆಕ್ಟರಿ - ಅಂದಾಜು. ಲೇನ್].

ಒಂದು ಡೈರೆಕ್ಟರಿಯಲ್ಲಿರುವ ಸಾವಿರಾರು ಫೈಲ್‌ಗಳು ಸಾಮಾನ್ಯವಾಗಿ ಫೈಲ್ ಸಿಸ್ಟಮ್‌ಗೆ ಹೊರೆಯಾಗುತ್ತವೆ ಮತ್ತು ಖಂಡಿತವಾಗಿಯೂ ಶಿಫಾರಸು ಮಾಡಲಾಗುವುದಿಲ್ಲ. ಬಳಕೆದಾರರು ಇದನ್ನು ತಿಳಿದಿದ್ದರು ಮತ್ತು ಅದು ಉತ್ತಮವಾಗಿಲ್ಲ ಎಂದು ಒಪ್ಪಿಕೊಂಡರು, ಆದರೆ ಅವರ ಲ್ಯಾಪ್‌ಟಾಪ್‌ನಲ್ಲಿ ಶೆರ್ಲಾಕ್‌ಗಿಂತ ಪಟ್ಟಿಯು 1000 ಪಟ್ಟು ವೇಗವಾಗಿದೆ ಎಂದು ಉಲ್ಲೇಖಿಸಿದ್ದಾರೆ. ಖಂಡಿತ, ಇದು ನಮಗೆ ನೋವುಂಟು ಮಾಡಿದೆ. ಆದ್ದರಿಂದ ನಾವು ಆಳವಾಗಿ ನೋಡಿದೆವು.

ಏಕೆಂದರೆ ಅದು ಚೆನ್ನಾಗಿ ಕಾಣುತ್ತದೆ

ಅದು ನಿಜವಾಗಿ ಏನು ಮಾಡುತ್ತದೆ ಎಂದು ನಾವು ನೋಡಿದ್ದೇವೆ ls ಡೈರೆಕ್ಟರಿಯನ್ನು ಪಟ್ಟಿ ಮಾಡುವಾಗ ಮತ್ತು ಪ್ರಕ್ರಿಯೆಯು ಏಕೆ ಹೆಚ್ಚು ಸಮಯ ತೆಗೆದುಕೊಳ್ಳುತ್ತದೆ. ಹೆಚ್ಚಿನ ಆಧುನಿಕ ವಿತರಣೆಗಳಲ್ಲಿ ls ಪೂರ್ವನಿಯೋಜಿತವಾಗಿ ಅದು ಚಲಿಸುತ್ತದೆ ls --color=auto, ಏಕೆಂದರೆ ಪ್ರತಿಯೊಬ್ಬರೂ ಬಣ್ಣಗಳನ್ನು ಇಷ್ಟಪಡುತ್ತಾರೆ.

ಆದರೆ ಸುಂದರವಾದ ಬಣ್ಣಗಳು ಬೆಲೆಗೆ ಬರುತ್ತವೆ: ಪ್ರತಿ ಫೈಲ್‌ಗೆ 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() (ಇದು ವಿಫಲಗೊಳ್ಳುತ್ತದೆ ಏಕೆಂದರೆ ನಮ್ಮ ಪರಿಸರವು ಹುಡುಕುತ್ತಿರುವ ಗುಣಲಕ್ಷಣಗಳನ್ನು ಹೊಂದಿಲ್ಲ), 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

ಕಾಮೆಂಟ್ ಅನ್ನು ಸೇರಿಸಿ