/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/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보다 느리다는 대답/결론은 일반적인 대답이 아닙니다.

관련 정보