zram이 "압축된" 값에 비해 더 많은 메모리를 차지하는 이유는 무엇입니까?

zram이 "압축된" 값에 비해 더 많은 메모리를 차지하는 이유는 무엇입니까?

저는 zram을 설정하고 Linux 상자에서 광범위하게 테스트하여 이것이 제 시나리오에 실제로 도움이 될지 여부를 측정했습니다. 그러나 나는 혼란스러워 zram~인 것 같다압축되지 않은 전체 데이터 크기에 대해 메모리를 사용합니다. "zramctl"을 입력하면 다음이 표시됩니다.

NAME       ALGORITHM DISKSIZE   DATA  COMPR  TOTAL STREAMS MOUNTPOINT
/dev/zram0                 2G 853,6M 355,1M 367,1M       4 [SWAP]

zramctl의 도움말 명령에 따르면는 메타데이터를 포함한 DATA비압축 크기 및 TOTAL압축 메모리입니다. 그러나 을 입력하면 swapon -s다음과 같은 출력이 표시됩니다.

Filename            Type        size     used    Priority
/dev/sda2           partition   1463292  0       4
/dev/zram0          partition   2024224  906240  5

906240사용된 메모리(KB)이며 DATAzramctl의 853,6M 값으로 변환할 수 있습니다. 이는 압축된 zram 장치가 저장하는 것보다 더 많은 메모리를 필요로 한다는 인상을 줍니다. 가득 차면 DATA실제로 디스크 드라이브로 교체되기 시작하므로 확실히 꽉 찬 것입니다.

zram이 원래 데이터 크기만큼 많은 메모리를 차지하는 것처럼 보이는 이유는 무엇입니까? 왜 COMPR크기가 또는 가 아닌가 TOTAL? 아직 이에 대한 정보를 찾지 못해서 온라인에는 아무런 정보도 없는 것 같습니다. 감사합니다!

답변1

그래서 좀 더 테스트하고 관찰한 끝에 저는 몇 가지 매우 흥미로운 사실을 발견했습니다. DATA물론압축되지 않은스왑 공간이 차지하는 메모리 양입니다. 그러나 언뜻 보면 매우 기만적이고 혼란스럽습니다. zram을 설정하여 스왑으로 사용하면 disksize압축된 데이터에 대해 zram이 소비하는 총 메모리 양을 나타내지 않습니다. 대신 총액을 나타냅니다.압축되지 않은zram은 데이터를 압축합니다. 따라서 2GB 크기의 zram 장치를 만들 수 있지만 실제로는 총 압축 메모리가 약 500 - 1000MB 정도(물론 시나리오에 따라 다름)가 되면 zram이 중지됩니다. 또는 Gnome의 시스템 모니터와 같은 명령이 swapon -s표시됩니다.압축되지 않은zramctl의 데이터 크기와 마찬가지로 zram 장치의 데이터 크기입니다 DATA. 다행히 zram은 실제로 보고된 메모리 양을 사용하지 않습니다. 그러나 이는 실제로 실제로 활용하려면 가지고 있는 RAM + 50%와 동일한 zram 디스크 크기를 생성해야 함을 의미합니다.아니요zram-config가 잘못 수행한 것처럼 디스크 크기는 RAM 크기의 절반과 같습니다. 하지만 더 자세히 알아보려면 계속 읽어보세요.

더 깊은 맥락은 다음과 같습니다. 내가 왜 그렇게 확신합니까? zswap으로도 테스트했기 때문입니다. 나는 anon_prio와 비교하여 mm/vmscan.c에서 file_prio 값을 낮추는 자체 커널을 컴파일했습니다(최신 Linux 5.6 커널에서는 변수 이름이 각각 fp 및 ap로 변경되었습니다). file_prio 값을 줄이면 커널이 귀중한 캐시 메모리를 버리는 것을 방지할 수 있습니다. 기본적으로 vm.swappiness100으로 설정된 경우에도 커널은 예비 메모리이든 활성 프로그램이든 상관없이 캐시된 대량의 RAM 데이터를 삭제합니다. 기본 구성이 성능에 미치는 영향은 다음과 같습니다.극심한정말로 zram을 사용하고 싶을 때 메모리 부족이 발생하는 경우에는 절대적으로생각하다스왑 코어는 거의 사용되지 않습니다.그리고압축률이 높은 메모리 방법을 더 자주 사용하십시오. 사용 가능한 메모리가 많을수록 데이터 캐싱을 위한 공간이 더 많아집니다. 이렇게 하면 캐시된 데이터가 터무니없이 빠른 속도로 삭제되지 않으며 Linux는 지워진 특정 프로그램 파일 캐시를 반복적으로 다시 읽을 필요가 없습니다. 일반 하드 드라이브에서 테스트할 때 성능 영향을 쉽게 확인할 수 있습니다.

zswap 테스트로 돌아가서: 사용자 정의 커널을 사용하여 50~70% 메모리 표시에 도달하면 zswap에 압축할 수 있는 충분한 메모리가 있습니다. Gnome의 시스템 모니터는 즉시 페이지 파티션에 대한 스왑 데이터 사용량이 높은 것으로 나타났지만 이상하게도 하드 드라이브 페이징이 전혀 없었습니다! 물론 이것은 가장 최근에 사용된 메모리를 자체적으로 교체하는 zswap의 설계입니다. 하지만 시스템이 이렇게 높은 스왑 사용량을 보고한다는 점이 흥미롭습니다.스왑 파티션의 경우그럼에도 불구하고 결국에는 스왑 파티션이나 스왑 파일의 크기에 따라 제한을 받게 됩니다. 메모리를 모두 압축하더라도~ 해야 하다최소한 압축되지 않은 데이터의 스왑 크기. 따라서 zswap의 4GB 스왑 메모리가 실제로는 1~2GB만 사용하더라도 스왑의 크기는 압축되지 않은 데이터 크기로 조정되어야 합니다. zram도 마찬가지지만 여기에는 적어도 실제 예약된 메모리가 없습니다. 물론 동적으로 증가하는 스왑 파일과 함께 zswap을 사용하지 않는 한 말이죠.

zram에 대해 이야기해 봅시다.매우 흥미로운 세부 사항이것은 내 관찰을 뒷받침합니다.

zram을 만드는 것은 의미가 없습니다메모리 크기의 2배 이상 왜냐하면 우리는 2:1의 압축 비율을 기대하기 때문입니다. zram은 사용하지 않을 때 디스크 크기의 약 0.1%를 사용하므로 거대한 zram은 낭비입니다.

이는 zram을 효과적으로 사용하려면 다음을 수행해야 함을 의미합니다.적어도설치한 RAM과 동일한 디스크 크기를 만듭니다. 압축률이 매우 높기 때문에 GB RAM + 50%를 권장하지만, 위 인용문은 +100%를 초과하면 별 의미가 없다는 뜻입니다. 또한 압축되지 않은 데이터 크기와 일치하는 디스크 크기를 지정해야 하므로 실제 실제 메모리 사용량을 제어하고 예측하는 것이 훨씬 더 어렵습니다. 위의 유용한 공식 소스에서 TOTAL다음 명령을 사용하여 실제 메모리 사용량(zramctl 값과 동일)을 제한 할 수 있습니다 echo 1G > /sys/block/zram0/mem_limit. 그러나 실제로 그렇게 하면 시스템이 잠깁니다. 시스템은 여전히 ​​교체를 시도하지만 zram은 제한을 적용하고 CPU 사용량이 매우 높아 시스템이 잠기게 됩니다. 이러한 행동이 의도적이었을 리가 없으며, 이는 전체 이야기의 일부가 매우 신뢰할 수 없다는 인상을 강화했습니다.

결론적으로:

  • zram 장치 생성 중에 설정한 것은 disksize기본적으로 가상 디스크 크기입니다.아니요실제 RAM 사용량을 나타냅니다.
  • 시나리오에 대한 실제 RAM 사용량(압축 비율)을 예측하거나 너무 큰 zram 디스크를 만들지 않도록 해야 합니다. 실제로는 현재 RAM 크기 + 50%가 거의 항상 괜찮습니다.
  • 불행하게도 Linux 커널의 기본 구성은 vm.swappiness100으로 설정된 경우에도 zram 압축에 완전히 부적합합니다. 실제로 만들려면 사용자 정의 커널을 만들어야 합니다.진짜Linux는 가장 압축 가능한 데이터를 교체하여 메모리를 확보하는 대신 너무 많은 파일 캐시를 지우므로 이 편리한 기능을 사용하십시오.많은더 일찍. 아이러니하게도 이런 상황을 해결해주는 유용한 패치가 있습니다.결코 받아들여지지 않았다.
  • 압축된 데이터가 이 임계값에 도달하면 zram 제한을 사용하면 echo 1G > /sys/block/zram0/mem_limit시스템이 잠깁니다. 제한 외에는 다른 대안이 없는 것 같으므로 잘 예측된 zram 디스크 크기로 zram 사용량을 제한하는 것이 더 나을 것입니다.

관련 정보