Орчны хувьсагч нь процессыг 40 дахин хурдасгах үед

Өнөөдөр бид Шерлок системийн хамгийн сүүлийн үеийн шинэчлэлтүүдийн талаар ярихыг хүсч байна [энэ нь Стэнфордын их сургуулийн өндөр хүчин чадалтай кластер юм - ойролцоогоор. trans.] бөгөөд энэ нь олон тооны оруулгатай лавлах дахь файлуудыг жагсаахыг ихээхэн хурдасгадаг.

Энгийн нийтлэлүүдээс ялгаатай нь энэ нь Шерлок дээр хэрхэн тогтмол ажиллаж байгаа талаарх мэдээллийг хэрэглэгчдэдээ хамгийн сайн байлгахын тулд хийсэн мэдээлэл юм. Цаашид энэ мэт нийтлэлүүдийг олон нийтлэнэ гэж найдаж байна.

Олон файлыг жагсаахад цаг хугацаа шаардагдана

Энэ бүхэн хэрэглэгчийн техникийн дэмжлэгийн асуултаас эхэлсэн. Гүйцэтгэлийн явцад асуудал гарсан гэж тэр мэдээлсэн ls 15 гаруй оруулгатай лавлахад хэдхэн минут зарцуулдаг $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 секунд, тийм ч сайн биш.

Дашрамд хэлэхэд бидэнд туг хэрэгтэй --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 секунд, дээд амжилт.

Шерлокийг тохируулж байна

Анхдагч тохиргоотой 13 секундээс бага зэргийн тохируулгатай 0,3 секунд хүртэл LS_COLORS байхгүйн улмаас 40 дахин хурдасна гэсэн үг setuid / setgid болон өнгөт ажиллах боломжтой файлууд. Тийм том алдагдал биш.

Мэдээжийн хэрэг, үүнийг Шерлок дээр хэрэглэгч бүрт тохируулсан болно.

Гэхдээ хэрэв та будгийг буцааж өгөхийг хүсвэл үндсэн тохиргоо руугаа буцаж болно.

$ unset LS_COLORS

Гэхдээ дараа нь олон файлтай лавлах дээр кофег ажиллаж байх үед нь исгэж байгаарай ls.

Эх сурвалж: www.habr.com

сэтгэгдэл нэмэх