Nuair a bhios caochladair àrainneachd a’ luathachadh a’ phròiseas 40 uair

An-diugh tha sinn airson bruidhinn mu chuid de na h-ùrachaidhean as ùire air siostam Sherlock [is e cruinneachadh àrd-choileanadh a tha seo aig Oilthigh Stanford - approx. trans.], a tha gu mòr ag àrdachadh liosta fhaidhlichean ann an clàran le àireamh mhòr de inntrigidhean.

Eu-coltach ri artaigilean cunbhalach, is e seo barrachd de aithisg teachdaire air mar a bhios sinn ag obair gu cunbhalach air Sherlock gus a chumail a ’dol aig a’ char as fheàrr airson ar luchd-cleachdaidh. Tha sinn an dòchas barrachd artaigilean mar seo fhoillseachadh san àm ri teachd.

Bheir e ùine airson mòran fhaidhlichean a liostadh

Thòisich e uile le ceist taic theicnigeach bho neach-cleachdaidh. Thug e cunntas air an duilgheadas a bha aig a’ chur gu bàs ls bheir e beagan mhionaidean ann an eòlaire le còrr air 15 inntrigeadh a-steach $SCRATCH [eòlaire airson faidhlichean sealach - approx. lain].

Mar as trice bidh na mìltean de fhaidhlichean ann an aon eòlaire nan eallach don t-siostam faidhle agus gu cinnteach chan eilear ga mholadh. Bha fios aig an neach-cleachdaidh air seo agus dh’aidich e nach robh e math, ach thuirt e gu robh an liostadh 1000 uair nas luaithe air an laptop aige na Sherlock. Gu dearbh, rinn seo cron oirnn. Mar sin choimhead sinn nas doimhne.

Leis gu bheil e a’ coimhead snog

Thug sinn sùil air na tha e a’ dèanamh dha-rìribh ls nuair a bhios tu a’ clàradh eòlaire, agus carson a bheir am pròiseas cho fada. Air na sgaoilidhean as ùire ls gu gnàthach bidh e a’ ruith mar ls --color=auto, oir is toil le a h-uile duine na dathan.

Ach thig dathan brèagha aig prìs: airson gach faidhle ls feumaidh fiosrachadh fhaighinn mun t-seòrsa faidhle, na ceadan aige, brataichean, buadhan leudaichte is an leithid gus an dath iomchaidh a thaghadh.

Is e aon fhuasgladh sìmplidh don duilgheadas dath a chuir dheth gu tur, ach smaoinich air an ùpraid bho luchd-cleachdaidh. Cha bu chòir dhut ann an suidheachadh sam bith an toradh dath a thoirt air falbh, chan e uilebheistean a th’ annainn.

Mar sin choimhead sinn nas doimhne. ls cuir a-steach dathan tro chaochladair àrainneachd LS_COLORS, a tha air a shuidheachadh dircolors(1) stèidhichte air faidhle rèiteachaidh dir_colors(5). Tha, leughaidh am faidhle so-ghnìomhaichte am faidhle rèiteachaidh gus caochladair àrainneachd a chruthachadh, a bhios mi a’ cleachdadh an uairsin (agus mura h-eil thu eòlach air faidhlichean le (dèan), an uairsin dir_colors obraichidh e, A dh'aindeoin a h-uile càil).

Bheir sinn sùil nas mionaidiche

Gus faighinn a-mach dè an sgeama dathan a tha ag adhbhrachadh an slaodachadh, chruthaich sinn àrainneachd deuchainneach:

$ 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 diogan airson 10 faidhle, chan eil e fìor mhath.

Air an t-slighe, feumaidh sinn bratach --color=always: ged tha e tionndadh gu ls --color=autoach ls lorg nuair nach eil e ceangailte ri inneal-crìochnachaidh (m.e. le pìob no le ath-stiùireadh toraidh) agus a’ cur à comas dathadh ma thèid a shuidheachadh gu auto. Fear glic.

Mar sin dè a tha cho fada? Sheall sinn le 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 fios lstat(), 10 fios getxattr() (a tha uile a’ fàiligeadh leis nach eil na buadhan a tha san àrainneachd againn a’ sireadh), 10 fios capget().

Gu cinnteach faodar seo a mheudachadh.

Feart comasan? Chan eil

A 'leantainn comhairle bug bho chionn 10 bliadhna, dh'fheuch sinn ri sgrùdadh feartan a chur à comas Comasan:

$ 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

Wow, suas ri 8 diogan de luathachadh! Fhuair sinn cuidhteas na gairmean daor sin uile getxattr(), agus dùbhlain capget() à sealladh cuideachd, sgoinneil.

Ach tha na gairmean neònach sin ann fhathast lstat(), Ged…

Cia mheud flùr a dh'fheumas tu?

Mar sin, thug sinn sùil nas mionaidiche LS_COLORS.

An toiseach tha sinn dìreach air an caochladair seo a chuir à comas:

$ 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

Dè!?! 13 diogan fhathast?

Tha e a 'tionndadh a-mach nuair a tha an àrainneachd caochlaideach LS_COLORS chan eil ach aon de na h-eileamaidean aige air a mhìneachadh no air chall <type>=color:, bidh e a’ cleachdadh an stòr-dàta togte gu bunaiteach agus a’ cleachdadh dathan fhathast. Mar sin ma tha thu airson dathadh a chuir dheth airson seòrsa faidhle sònraichte, feumaidh tu a dhol thairis air <type>=: no <type> 00 ann am faidhle DIR_COLORS.

Às deidh tòrr deuchainn is mearachd, chaol sinn ar rannsachadh sìos gu seo:

EXEC 00
SETUID 00
SETGID 00
CAPABILITY 00

a tha sgrìobhta mar

LS_COLORS='ex=00:su=00:sg=00:ca=00:'

Tha seo a’ ciallachadh: na cuir dath air faidhlichean a rèir feart. Comasan, ach mean air mhean setuid/setgid, no le bratach gnìomhachaidh.

Bidh sinn a 'luathachadh ls

Agus mura dèan thu gin de na sgrùdaidhean sin, cuir fios thugainn lstat() à sealladh, agus a-nis tha e na chùis gu tur eadar-dhealaichte:

$ 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 diogan air liosta de 10 faidhle, clàr.

Sherlock a shuidheachadh

Bho 13 diogan le roghainnean bunaiteach gu 0,3 diogan le mion-atharrachaidhean LS_COLORS a’ ciallachadh luathachadh 40-fhillte air sgàth neo-làthaireachd setuid / setgid agus faidhlichean so-ghnìomhaichte dathte. Chan e call cho mòr a th’ ann.

Gu dearbh, tha seo a-nis air a rèiteachadh ann an Sherlock airson gach neach-cleachdaidh.

Ach ma tha thu airson an dath a thilleadh, faodaidh tu dìreach tilleadh gu na roghainnean bunaiteach:

$ unset LS_COLORS

Ach an uairsin air clàran le tòrr fhaidhlichean, bi cinnteach gun dèan thu cofaidh fhad ‘s a tha e a’ ruith ls.

Source: www.habr.com

Cuir beachd ann