環境変数がプロセスを40倍高速化したとき

今日は、Sherlockシステムの最新のアップデートについてお話したいと思います[これは、スタンフォード大学の高性能クラスターです。 per。]。これにより、多数のエントリがあるディレクトリ内のファイルのリストが大幅に高速化されます。



通常の記事とは異なり、これはユーザーにとって可能な限り最良の方法でそれを維持するために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:*。cpi​​o = 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



が動作している間にコーヒーを入れてください。



All Articles