为什么在 /dev/shm 中创建文件并不比在 /tmp 中创建文件快?

为什么在 /dev/shm 中创建文件并不比在 /tmp 中创建文件快?

假设我有两个 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 慢的答案/结论并不是一般答案。

相关内容