/dev/shmにファイルを生成するのが/tmpにファイルを生成するよりも速くないのはなぜですか?

/dev/shmにファイルを生成するのが/tmpにファイルを生成するよりも速くないのはなぜですか?

2つのbashファイルがあるとしましょう。最初の名前は次のとおりですdiskFile.bash

for i in {1..10000}
do
    file=$(mktemp)
    cat > $file <<- "SIGN"
        "Hello World"
SIGN
done
echo "finished"

2番目は次のとおりですramFile.bash

for i in {1..10000}
do
    file=$(mktemp -p /dev/shm/)
    cat > $file <<- "SIGN"
        "Hello World"
SIGN
done
echo "finished"

Linuxで内部的に作成されたファイルは、/dev/shmシステムRAMメモリ内のファイルです。ただし、を使用して最初のファイルを実行しようとすると、次の結果がtime bash diskFile.bash表示されます。

finished
15.56user 5.74system 0:20.25elapsed 105%CPU (0avgtext+0avgdata 6324maxresident)k

そしてtime bash ramFile.bash

finished
15.20user 5.37system 0:19.45elapsed 105%CPU (0avgtext+0avgdata 6380maxresident)

/dev/shmRAMメモリを使用する必要があることを考慮すると、時間差は重要ではないようです。一時ファイルを作成するのが/dev/shm一時ファイルを作成するよりも高速ではないのはなぜですか/tmp? Bashを使用してファイル生成プロセスを高速化する方法はありますか?

ベストアンサー1

私は自分自身に同じ質問をしました。 /dev/shm/は私のホームディレクトリや/tmpよりも速いですか?

私はbash-loopテストを信頼していません。他の人はこれがC / C ++で行われるべきであると提案しました。

私のテストは次のとおりです。

私たちは現在最大容量で動作している3TB RAMを備えた大規模なサーバーを持っているので、期待どおりに高速ではありません。しかし、今回のテストでは、バックグラウンドロードは100%安定していました。サーバーのジョブは/dev/shmとHDDを読み書きします。

最初の「df /tmp」は以下を提供します。

tmpfs          1585333764  976564 1584357200    1% /tmp

そして「df/dev/shm」は以下を提供します:

tmpfs          1585333764  977168 1584356596    1% /dev/shm

tmpfs は両方とも RAM にあることを知らせます。

このテストを使用したディスクには、次のスペースが残っていました。

/dev/sdb1        60T     52T  4,9T   92%

ベンチマークの実行に使用するコードは次のとおりです。

#include <iostream>
#include <fstream>
#include <string>
using namespace std;

int main()
{
  const int N=1000000000;

  char * data    = new char [N];
  char * data_in = new char [N];
  
  string   filename="out.txt";
//  string   filename="/tmp/out.txt";
//  string   filename="/dev/shm/out.txt";
  ofstream os(filename.c_str());

  for (int i=0; i<N; ++i)
    data[i] = 'A'+ i%20;

  os.write(data, N);
  os.close();

  ifstream is(filename.c_str());
  is.read(data_in, N);

  unsigned long sum;
  for (int i=0; i<N; ++i)
    sum += (unsigned char)data_in[i];

  cout << sum << endl;
}

私はすべてg ++ -O3を使って異なる出力ファイルパスで3つのバージョンをコンパイルしました。私が使用しているコンパイラは次のとおりです。gcc-Version 5.3.1 20160406(Red Hat 5.3.1-6)(GCC)コンパイラは少し古いですが、これがこのテストに影響を与えてはいけないと思います。

巨大なRAID5のHDD、高速SAS、SSDなし。 RAIDはディスクの書き込み速度を少し遅くします。

結果:ディスクの書き込みと読み取り:

real    0m5.739s
user    0m1.602s
sys     0m2.541s

tmpの書き込みと読み取り:

real    0m3.669s
user    0m1.645s
sys     0m2.009s

/dev/shm 書き込みと読み取り:

real    0m3.639s
user    0m1.633s
sys     0m1.991s

私はこれを何度も繰り返しました。結果は非常に一貫しています。

したがって、ディスクへの書き込みはメモリRAM(/ tmpまたは/ dev / shm)への書き込みよりもかなり遅くなります。値が近すぎて、誰もが自分のシステムに対してこれをテストする必要があると思います。 RAIDを持っているという事実は結果に影響を与えるかもしれませんが、最終的にはそれが私が比較したいものです。

したがって、/ dev / shmのI / OがHDDよりも遅いという答え/結論は一般的な答えではありません。

おすすめ記事