Қоршаған ортаның айнымалысы процесті 40 есе жылдамдатқанда

Бүгін біз Шерлок жүйесінің кейбір соңғы жаңартулары туралы сөйлескіміз келеді [бұл Стэнфорд университетіндегі өнімділігі жоғары кластер – шамамен. trans.], бұл файлдарды жазбалар саны көп каталогтардағы листингті айтарлықтай жылдамдатады.

Кәдімгі мақалалардан айырмашылығы, бұл біздің пайдаланушыларымыз үшін ең жақсы жұмыс істеуі үшін Шерлокпен қалай жұмыс істейтініміз туралы инсайдерлік есеп. Болашақта осындай мақалалар көп жарияланады деп үміттенеміз.

Көптеген файлдарды тізімдеу уақытты алады

Барлығы пайдаланушының техникалық қолдау сұрағынан басталды. Ол орындалу мәселесі туралы хабарлады ls 15 000-нан астам жазбасы бар каталогта бірнеше минут кетеді $SCRATCH [уақытша файлдарға арналған каталог – шамамен. жолақ].

Бір каталогтағы мыңдаған файлдар әдетте файлдық жүйеге ауыртпалық түсіреді және бұл ұсынылмайды. Пайдаланушы мұны білді және бұл жақсы емес екенін мойындады, бірақ листинг Шерлокқа қарағанда оның ноутбукінде 1000 есе жылдамырақ екенін атап өтті. Әрине, бұл бізге ауыр тиді. Сондықтан біз тереңірек қарадық.

Өйткені ls әдемі көрінеді

Біз оның шын мәнінде не істейтінін қарастырдық 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 файл үшін 000 секунд, өте жақсы емес.

Айтпақшы, бізге ту керек --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
[...]

Wow: 10 000 қоңырау lstat(), 10 000 қоңырау getxattr() (бәрі сәтсіз аяқталды, себебі ортамызда ls іздейтін атрибуттар жоқ), 10 000 қоңырау 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 файл тізімінде 000 секунд, рекорд.

Шерлок орнатылуда

Әдепкі параметрлермен 13 секундтан кішігірім реттеулермен 0,3 секундқа дейін LS_COLORS болмауына байланысты 40 еселік үдеу дегенді білдіреді setuid / setgid және түрлі-түсті орындалатын файлдар. Мұндай үлкен шығын емес.

Әрине, бұл қазір әрбір пайдаланушы үшін Шерлокта конфигурацияланған.

Бірақ бояуды қайтарғыңыз келсе, әдепкі параметрлерге оралуға болады:

$ unset LS_COLORS

Бірақ содан кейін файлдары көп каталогтарда кофе жұмыс істеп тұрған кезде қайнатуды ұмытпаңыз ls.

Ақпарат көзі: www.habr.com

пікір қалдыру