/dev/shm의 작업으로 인해 오버플로가 발생했습니다.

/dev/shm의 작업으로 인해 오버플로가 발생했습니다.

/dev/shm에서 비슷한 작업을 수만 번 반복하는데, 각각 디렉터리를 만들고, 파일을 쓰고, 삭제합니다. 내 가정은 실제로 디렉토리를 생성하고 그 자리에서 삭제하는 것이므로 메모리 소비가 매우 낮아야 했습니다. 하지만 사용량이 상당히 높아 결국 메모리 오버플로가 발생하는 것으로 나타났습니다. 그래서 내 질문은 다음과 같습니다.

mkdir /dev/shm/foo
touch /dev/shm/foo/bar
[edit] /dev/shm/foo/bar
....
rm -rf /dev/shm/foo

결국 메모리 오버플로가 발생합니까? 이것이 실제로 그렇다면 그 자리에서 제거되는 것처럼 보이기 때문에 이유는 무엇입니까?

노트:수만 개의 유사한 작업이 있습니다.

답변1

df -h /dev/shm궁금합니다. 이 애플리케이션을 실행할 때 RAM 사용량이 어떻게 표시되나요?

임시 파일 시스템

기본적으로 일반적으로 시스템 물리적 메모리 양의 50%로 설정됩니다. 이것은여기에 녹음하세요kernel.org의 tmpfs 파일 시스템 문서에 있습니다. 매뉴얼 페이지에도 언급되어 있습니다 mount.

에서 발췌설치 매뉴얼 페이지

이 인스턴스의 최대 inode 수입니다. 기본값은 물리적 RAM 페이지 수의 절반 또는 (highmem이 있는 시스템에서) lowmem RAM 페이지 수의 절반 중 더 작은 값입니다.

확인하다

내 8GB RAM 노트북에는 다음과 같은 설정이 있습니다 /dev/shm.

$ df -h /dev/shm
Filesystem            Size  Used Avail Use% Mounted on
tmpfs                 3.9G  4.4M  3.9G   1% /dev/shm

어떻게 되어가나요?

제 생각에는 처음에 RAM의 50%를 할당하는 것 외에도 시간이 지남에 따라 실제로 메모리의 전체 50%를 소비하고 /dev/shmRAM의 나머지 50%와 함께 공간을 늘리는 것 같습니다. 교환 영역에 들어가세요. .

tmpfsvs의 또 다른 기능은 필요한 경우 스왑에 넣을 수 있다는 ramfs것입니다 .tmpfs

에서 발췌geek.com

                    Table: Comparison of ramfs and tmpfs

Experimentation                          Tmpfs                Ramfs
---------------                          -----                -----
Fill maximum space and continue writing  Will display error   Will continue writing
Fixed Size                               Yes                  No
Uses Swap                                Yes                  No
Volatile Storage                         Yes                  Yes

궁극적으로 이는 RAM에 구현된 파일 시스템이므로 둘 다처럼 작동할 것으로 예상됩니다. 내 말은 파일/디렉터리가 삭제되면 일부 물리적 메모리 페이지를 inode 테이블로 사용하고 해당 파일/디렉터리가 소비하는 일부 실제 공간을 사용한다는 것입니다.

일반적으로 HDD의 공간을 사용할 때 실제로 물리적 공간을 확보하는 것이 아니라 특정 파일이 소비하는 공간을 이제 사용할 수 있음을 나타내는 inode 테이블의 항목만 사용할 수 있습니다.

따라서 RAM 관점에서 볼 때 파일이 소비하는 공간은 메모리의 더티 페이지일 뿐입니다. 따라서 시간이 지남에 따라 충실하게 교체됩니다.

tmpfs제공하는 파일 시스템에서 사용되는 실제 RAM을 정리하기 위해 특별한 작업을 수행하는지 확실하지 않습니다 . 사람들이 자신의 시스템에서 수행 중인 작업을 "재활용"하는 데 15분 이상 소요된다는 언급을 여러 포럼에서 본 적이 있습니다 /dev/shm.

아마도 내가 찾은 이 논문의 tmpfs제목은 다음과 같았을 것입니다.tmpfs: 가상 메모리 파일 시스템이것이 더 낮은 수준에서 구현되는 방법과 VMM과 관련하여 어떻게 작동하는지에 대해 더 명확하게 설명할 것입니다. 이 문서는 SunOS용으로 특별히 작성되었지만 몇 가지 단서를 포함할 수 있습니다.

실험

/dev/shm다음과 같은 인위적인 테스트를 통해 자체 청소가 가능함을 알 수 있습니다 .

실험 #1

단일 파일이 포함된 디렉터리를 만든 다음 해당 디렉터리를 1000번 삭제합니다.

초기 상태/dev/shm
$ df -k /dev/shm
Filesystem           1K-blocks      Used Available Use% Mounted on
tmpfs                  3993744      5500   3988244   1% /dev/shm
파일로 채워라
$ for i in `seq 1 1000`;do mkdir /dev/shm/sam; echo "$i" \
      > /dev/shm/sam/file$i; rm -fr /dev/shm/sam;done
최종 상태는/dev/shm
$ df -k /dev/shm
Filesystem           1K-blocks      Used Available Use% Mounted on
tmpfs                  3993744      5528   3988216   1% /dev/shm

실험 #2

50MB 파일이 포함된 디렉터리를 만든 다음 해당 디렉터리를 300번 삭제합니다.

50MB의 무작위 정크 파일로 채우세요
$ start_time=`date +%s`
$ for i in `seq 1 300`;do mkdir /dev/shm/sam;                     \
   dd if=/dev/random of=/dev/shm/sam/file$i bs=52428800 count=1 > \
   /dev/shm/sam/file$i.log; rm -fr /dev/shm/sam;done              \
   && echo run time is $(expr `date +%s` - $start_time) s

...
8 bytes (8 B) copied, 0.247272 s, 0.0 kB/s
0+1 records in
0+1 records out
9 bytes (9 B) copied, 1.49836 s, 0.0 kB/s
run time is 213 s
최종 상태는/dev/shm

다시 말하지만, 소비되는 공간은 눈에 띄게 증가하지 않습니다 /dev/shm.

$ df -k /dev/shm
Filesystem           1K-blocks      Used Available Use% Mounted on
tmpfs                  3993744      5500   3988244   1% /dev/shm

결론적으로

위의 내용을 여러 번 실행해도 아무런 /dev/shm효과가 없는 것 같습니다. 그래서 /dev/shm당신이 설명하는 방식으로 사용하는 데 아무런 문제가 없다고 생각합니다.

관련 정보