누적 tmpfs가 사용 가능한 가상 메모리를 초과합니다.

누적 tmpfs가 사용 가능한 가상 메모리를 초과합니다.

물리적 메모리보다 더 많은 tmpfs 공간이 할당되어 가득 차면 어떻게 되는지 궁금합니다.


자세한 세부 사항:

4GB RAM, 4GB 스왑 공간이 있다고 가정해 보겠습니다.

mount -o size=4G -t tmpfs tmpfs /mnt1
mount -o size=4G -t tmpfs tmpfs /mnt2
mount -o size=4G -t tmpfs tmpfs /mnt3

내가 아는 한, 이러한 장치는 처음부터 할당된 메모리를 실제로 할당하지 않으므로 문제가 없습니다.

이제 나는 다음과 같은 글을 쓰기 시작합니다:

cat /dev/zero >/mnt1/bla &
cat /dev/zero >/mnt2/bla &
cat /dev/zero >/mnt3/bla &

그리고...


질문:

시스템이 이를 어떻게 처리해야 하는지 알고 싶습니다.

아무것도 찾지 못했지만 tmpfs를 여러 번 마운트하면 뒤에서 동일한 장치를 계속해서 마운트하는 것입니까, 아니면 완전히 별개의 다른 장치 인스턴스를 생성하는 것입니까?

시스템 충돌을 어떻게든 방지했습니까, 아니면 그렇게 해도 되나요?

tmpfs를 /tmp에 할당했을 때 나는 그 근본 원인에 대해 생각하기 시작했습니다.

  1. 직접 설치하는 방법도 있고,
  2. 또 다른 방법은 파일을 만드는 것입니다./dev/shm, 바인드 마운트합니다.

tmpfs 공간 할당에 제한이 없는 경우 2. - 바인드 마운트 - tmpfs를 광범위하게 사용하고 싶지만 내 작업의 결과를 생각하는 데 너무 많은 시간을 소비하고 싶지 않은 경우 이는 본질적으로 더 안전한 옵션일 수 있습니다. .

답변1

기계가 충돌할 것입니다. 이야기의 끝. (*)

시스템 관리자는 모든 tmpfs 인스턴스에 대해 합리적인 크기 제한을 제공해야 합니다.

tmpfs좋아요, "램디스크"를 쉽게 만들 수 있지만 한 가지 주목할 점은 tmpfs전역 크기 제한이 없지만 설치된 인스턴스당 크기 제한이 있다는 것입니다.

OOM 종료는 다시 사용할 수 없습니다 tmpfs. 최대로 교체할 수 있지만 사용 가능한 스왑 공간이 충분한 경우에만 가능합니다.

그래서 tmpfs여기에 하나, 저기에 하나, 여기에 하나, 저기에 하나... 그리고 각각 작은 크기보다는 몇 기가바이트의 제한을 가지고 있다면, 머신이 크래시를 일으키기 쉽습니다(또는 무한 스왑으로 보내기- 취소-재교환 루프) 그냥 모두 채우세요.

불행하게도 tmpfs기본값은 RAM의 최대 50%( 10M많은 작업에 충분하지 않거나 충분하지 않음)이며 기본값은 전역적으로 쓰기 가능합니다. 따라서 tmpfsRAM이 가득 차면 3~4개의 인스턴스가 메모리의 200%를 차지하는 것이 일반적입니다 . 일반 사용자라면 누구나 시스템을 중단시킬 수 있습니다.

이제 당신을 방문 /etc/fstab하고 그들에게 건전한 한계를 부여할 시간입니다.


(*)

이제 나는 다음과 같은 글을 쓰기 시작합니다:

cat /dev/zero >/mnt1/bla &

귀하의 예는 실제로 가장 무해합니다. 임의의 데이터 대신 0을 작성하므로 몇 가지 간단한 최적화(동일 페이지 병합 또는 zswap)를 수행하면 여전히 살아남을 수 있습니다. 0은 다른 방법으로 압축하거나 최적화할 수 있습니다.

임의의 데이터를 쓰고 싶습니다. 이는 최적화할 수 없으며 그대로 저장해야 합니다.

그러나 임의의 데이터를 쓰는 것은 여전히 ​​상대적으로 무해합니다. 스왑 공간이 채워지고, 공간이 충분하면 그걸로 끝입니다. 교체에 대한 가장 좋은 시나리오는 교체된 내용을 다시 읽지 않는 것입니다.

그러면 당신은 글을 쓰고 싶을 뿐만 아니라 읽고 싶어질 것입니다. 그러면 tmpfs가 램과 스왑으로 거의 덮이지 않더라도 머신은 여전히 ​​스스로 스왑되어 죽을 것입니다.

관련 정보