通常の記事とは異なり、これはユーザーにとって可能な限り最良の方法でそれを維持するためにSherlockが定期的にどのように機能するかに関するインサイダーレポートです。 今後、このような記事をさらに公開していきたいと考えています。
多くのファイルをリストするには時間がかかります
すべては、ユーザーからの技術サポートの質問から始まりました。 彼は、
$SCRATCH
15,000を超えるエントリがあるディレクトリで
ls
を実行すると数分かかるという問題を報告しました。 トランス。]。
通常、1つのディレクトリにある何千ものファイルがファイルシステムに問題を引き起こすため、これは絶対にお勧めできません。 ユーザーはこれを知っていて、それが良くないことを認めましたが、彼のラップトップでは、リストはSherlockよりも1000倍速いことを言及しました。 もちろん、それは私たちを襲った。 したがって、私たちはより深く見えました。
lsがきれいだから
ディレクトリをリストするときに
ls
実際に行うことと、プロセスにそれほど時間がかかる理由を調べました。 最近のほとんどのディストリビューションでは、
ls
デフォルトは
ls --color=auto
になっています。これは誰もが色が好きだからです。
しかし、美しい色には価格があります。適切な色を選択するには、ファイルごとに、ファイルタイプ、解像度、フラグ、高度な属性などに関する情報を取得する必要があります。
問題の簡単な解決策の1つは、lsの色を完全に無効にすることですが、ユーザーのinりを想像してください。 どのような場合でもカラー出力を取得することはできません、私たちはモンスターではありません。
したがって、私たちはより深く見えました。
ls
は、環境
LS_COLORS
使用してエントリに色を
dircolors(1)
LS_COLORS
。この環境
LS_COLORS
は、
dir_colors(5)
構成ファイルに基づいて
dir_colors(5)
設定します。 はい、 実行可能ファイルは設定ファイルを読み取ってlsが使用する環境変数を作成します ( ドア (do)ファイルがわからない場合は、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
10,000個のファイルに対して12.7秒、あまり良くありません。
ところで、フラグでは、何がそんなに時間がかかるのでしょうか?--color=always
が必要です:ls --color=auto
変わりますが、ls --color=auto
は端末に接続されていないことを検出し(たとえば、チャネルまたは出力リダイレクトを使用)、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,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()
呼び出しをすべて
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:または= 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: $ LS_COLORSを設定解除 $ echo $ LS_COLORS $ time ls --color = always $ SCRATCH / dont | wc -l 10,000 実際の0m13.037s ユーザー0m0.077s sys 0m1.092s
何!?! まだ13秒?
LS_COLORS
環境
LS_COLORS
定義されていない場合、または要素
<type>=color:
1つのみ
<type>=color:
欠落している場合、デフォルトで組み込みデータベースを使用し、色を使用します。 したがって、特定のファイルタイプのカラーリングを無効にする場合は、
DIR_COLORS
ファイルで
<type>=:
または
<type> 00
で上書きする必要があります。
多くの試行錯誤の後、検索範囲をこれに絞り込みました。
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
10,000ファイルのリストで0.3秒、レコード。
Sherlockを構成する
デフォルト設定の13秒から小さな設定の0.3秒まで
LS_COLORS
は、
setuid
/
setgid
および色付きの実行可能ファイルがないため、40倍高速であることを意味します。 それほど大きな損失ではありません。
もちろん、今では各ユーザーに対してSherlockで構成されています。
ただし、色を戻したい場合は、デフォルト設定に戻すことができます。
$ unset LS_COLORS
ただし、多数のファイルがあるディレクトリでは、
ls
が動作している間にコーヒーを入れてください。