假设我有两个 bash 文件。第一个叫做diskFile.bash
:
for i in {1..10000}
do
file=$(mktemp)
cat > $file <<- "SIGN"
"Hello World"
SIGN
done
echo "finished"
第二个叫做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;
}
我使用不同的输出文件路径编译了 3 个版本,全部使用 g++ -O3。我使用的编译器是: gcc-Version 5.3.1 20160406 (Red Hat 5.3.1-6) (GCC) 编译器有点旧,但是我认为这应该不会影响这个测试。
HDD 位于巨大的 RAID5 中,快速 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 慢的答案/结论并不是一般答案。