Linux 서버가 있고 여분의 500GB 디스크 파티션이 있습니다. 형식을 지정하고 / tmp에 사용하고 싶었습니다. 서버는 때때로 큰 데이터 처리 작업을 실행하여 / tmp가 GB의 임시 데이터를 보유 할 수 있습니다.
그런 다음 대신 스왑 파티션으로 추가하고 / tmp를 tmpfs에 마운트 할 수 있다는 아이디어를 얻었습니다. 이 아이디어는 합리적입니까?
서버에는 6GB의 RAM이 있으므로 대부분의 경우 / tmp의 데이터는 RAM에만 있으며 속도 이점이 뛰어납니다. 문제는 / tmp에 10-20GB의 데이터가 있다고 가정하면 시스템은 어떻게 작동합니까? 단순히 / tmp를 ext4 파티션에 마운트 한 것과 비교하여 성능은 어떻습니까? 도와 주셔서 감사합니다.
편집 : tmpfs 사용이 RAM 제한에 도달하면 시스템이 메모리 스왑 아웃을 시작한다는 것이 분명합니다. 그러나 리눅스는 tmpfs 데이터를 바꾸고 RAM에 “일반적인”데이터를 유지하기에 충분히 똑똑합니까? 그렇다면 합리적으로 행동 할 수 있다고 생각합니다. 그렇지 않은 경우 전체 시스템이 심각하게 영향을받습니다.
답변
이것은 좋은 생각이 아닙니다 TM .
당신은 큰과 괜찮을거야 /tmp
파티션, (당신의에서이 같이 장착 /etc/fstab
)
tmpfs /dev/tmp tmpfs defaults,nosuid,nodev,noexec,noatime,nodiratime,size=6000M 0 0
그리고 외부 드라이브를 거대한 스왑 파티션으로 추가 할 수 있습니다
/dev/sdb1 swap swap defaults 0 0
그것이 한계에 도달하면 머신은 RAM에서 디스크로 페이지를 교환하기 시작합니다.이 시점에서로드 평균이 지붕을 통과하고 머신이 정지합니다.
어떤 식 으로든 SWAP에 의존하는 것은 나쁜 생각입니다. 500GB 드라이브를 판매하고 더 많은 RAM을 구입하는 것이 좋습니다 .
요약하자면
실제로 500GB 디스크를 사용하려면 /tmp
atime 및 diratime을 비활성화 한 비 저널 파일 시스템으로 500GB 디스크를 마운트 할 수 있습니다 (예 🙂 ext2
. 즉 기계를 다루는 것보다 실질적으로 더 빠른 것 SWAP
보내고
답변
이것은 합리적인 아이디어 일 수 있습니다.
파일 시스템이 시스템 장애시 디스크의 데이터가 손상되지 않도록하기 위해 실제 파일 시스템을 / tmp에 배치하면 오버 헤드가 발생합니다. 부팅 할 때 정리 된 / tmp의 경우 분명히 오버 헤드입니다. tmpfs를 사용하면 오버 헤드를 피할 수 있습니다.
반면에 파일 시스템은 파일이 액세스 시간을 최적화하는 방식으로 디스크에 정리되어 있는지 확인합니다. 즉, 조각화를 피할 수 있습니다. 일반적인 순차 파일 액세스는 (주로) 순차 디스크 액세스를 발생 시키며 이는 임의 액세스보다 효율적입니다. 이 효과는 SSD보다 하드 디스크 회전에 더 두드러집니다. swap은 어떤 메모리가 어떤 파일에 속하는지, tmpfs가 페이지가 실제 메모리 또는 디스크에 어떻게 매핑되는지를 인식하지 못하기 때문에 swap + tmpfs 조합은이를 쉽게 수행 할 수 없습니다. 그러나 큰 파일의 경우 tmpfs와 swap이 모두 인접한 경우에 일관되게 유지하기 때문에 제대로 작동해야합니다. 적어도 스왑에 여유 공간이 많으면 (그렇지 않으면 조각화가 시작되고) 쓰기가 스왑 아웃 될 가능성이있을 정도로 느리게 발생합니다.
결론은 다음과 같습니다. 상황에 따라 두 옵션을 모두 사용하여 가장 적합한 옵션을 확인해야합니다.
tmpfs를 마운트 할 때 크기를 명시 적으로 설정해야합니다. 기본값은 물리적 RAM의 절반이므로 3GB입니다.
답변
일반적으로의 데이터가 많지 /tmp
않지만 제한된 기간 동안 무한한 기가 바이트를 소비하는 경우 실제로 좋습니다 . 문제는 리눅스 스왑 시스템이 유스 케이스에 대해 제대로 알지 못한다는 것입니다. 일반적으로 프로그램 페이지보다 캐시 덤프 또는 스왑을 우선시하지만 실제로 도움이되지는 않습니다. cgroup을 사용하여 목표를 달성하는 것이 가능할 수 있습니다. 스크래치 데이터가 프로그램 메모리에 저장되어있을 때이지만이 경우 cgroup을 구성하는 방법을 모르겠습니다 (FUSE tmpfs를 사용할 수 있다고 가정합니다 …) . 다행히도 필요하지 않습니다. zram 및 백업 장치를 사용하여 원하는 동작을 얻을 수 있습니다.
zram-init
압축 램 블록 장치 인 zram 설정을 자동화하는 프로그램입니다. 일반적으로 zram-init
구성에 /tmp
zram으로 마운트하기위한 예제가 있습니다. 다음과 같습니다.
type0=/tmp
flag0=
size0=524288 # 500G of logical space
mlim0=2G # 2G of memory
back0=/dev/loop0 # (or /dev/sdxN, your large slow drive)
notr0=
maxs0=4 # maximum number of parallel processes for this device
algo0=zstd
labl0=tmp # the label name
uuid0=
args0=
이것은 / tmp에 쓰여진 것을 압축하여 메모리에 저장합니다. 일반적인 압축은 약 50 % 정도입니다. 최대 2G의 실제 메모리를 소비합니다. 실제 메모리가 부족하면 가장 오래된 파일을 가져 와서 백업 장치로 밀어 넣고 여전히 압축합니다. 파일을 압축 및 압축 해제하는 데 약간의 CPU 오버 헤드가 발생하지만 이는 일반적으로 감소 된 IO에 의해 상쇄됩니다.
cgroup과 함께 유사한 설정을 사용하여 전체 시스템 성능에 영향을 미치지 않으면 서 특정 프로세스를 교환 할 수 있습니다.