Бүгін біз Шерлок жүйесінің кейбір соңғы жаңартулары туралы сөйлескіміз келеді [бұл Стэнфорд университетіндегі өнімділігі жоғары кластер – шамамен. trans.], бұл файлдарды жазбалар саны көп каталогтардағы листингті айтарлықтай жылдамдатады.
Кәдімгі мақалалардан айырмашылығы, бұл біздің пайдаланушыларымыз үшін ең жақсы жұмыс істеуі үшін Шерлокпен қалай жұмыс істейтініміз туралы инсайдерлік есеп. Болашақта осындай мақалалар көп жарияланады деп үміттенеміз.
Көптеген файлдарды тізімдеу уақытты алады
Барлығы пайдаланушының техникалық қолдау сұрағынан басталды. Ол орындалу мәселесі туралы хабарлады ls
15 000-нан астам жазбасы бар каталогта бірнеше минут кетеді $SCRATCH
[уақытша файлдарға арналған каталог – шамамен. жолақ].
Бір каталогтағы мыңдаған файлдар әдетте файлдық жүйеге ауыртпалық түсіреді және бұл ұсынылмайды. Пайдаланушы мұны білді және бұл жақсы емес екенін мойындады, бірақ листинг Шерлокқа қарағанда оның ноутбукінде 1000 есе жылдамырақ екенін атап өтті. Әрине, бұл бізге ауыр тиді. Сондықтан біз тереңірек қарадық.
Өйткені ls әдемі көрінеді
Біз оның шын мәнінде не істейтінін қарастырдық 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 файл үшін 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()
.
Әрине, мұны оңтайландыруға болады.
Мүмкіндіктер атрибуты? Жоқ
Кеңестен кейін
$ 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 файл тізімінде 000 секунд, рекорд.
Шерлок орнатылуда
Әдепкі параметрлермен 13 секундтан кішігірім реттеулермен 0,3 секундқа дейін LS_COLORS
болмауына байланысты 40 еселік үдеу дегенді білдіреді setuid
/ setgid
және түрлі-түсті орындалатын файлдар. Мұндай үлкен шығын емес.
Әрине, бұл қазір әрбір пайдаланушы үшін Шерлокта конфигурацияланған.
Бірақ бояуды қайтарғыңыз келсе, әдепкі параметрлерге оралуға болады:
$ unset LS_COLORS
Бірақ содан кейін файлдары көп каталогтарда кофе жұмыс істеп тұрған кезде қайнатуды ұмытпаңыз ls
.
Ақпарат көзі: www.habr.com