
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/shm
RAMメモリを使用する必要があることを考慮すると、時間差は重要ではないようです。一時ファイルを作成するのが/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よりも遅いという答え/結論は一般的な答えではありません。