출력은 다음과 같습니다 free -m
.
total used free shared buff/cache available
Mem: 421 158 153 39 109 195
Swap: 0 0 0
echo 3 > /proc/sys/vm/drop_caches
가능한 모든 캐시를 삭제 했지만 buff/cache
값은 여전히 109MB로 유지됩니다. 이 캐시는 무엇에 보관되어 있나요? 어떻게든 포기할 수 있을까요?
사용된 시스템은 XUbuntu 16.04입니다.
이 캐시 중 일부(43MB)는 tmpfs에서 사용될 수 있습니다.
tmpfs on /run/user/1000 type tmpfs (rw,nosuid,nodev,relatime,size=43188k,mode=700,uid=1000,gid=1000)
이렇게 하면 해석의 여지가 더 많아집니다.
출력 df -mt tmpfs
:
Filesystem 1M-blocks Used Available Use% Mounted on
tmpfs 43 3 40 7% /run
tmpfs 211 1 211 1% /dev/shm
tmpfs 5 1 5 1% /run/lock
tmpfs 211 0 211 0% /sys/fs/cgroup
tmpfs 43 1 43 1% /run/user/1000
답변1
tmpfs를 채우면 43MB만 사용됩니다. 미리 메모리를 예약하지 않습니다. 하지만:
믿거나 말거나, 39M "공유" 번호는 삭제할 수 없으며 모두 "버프/캐시"로 계산됩니다. 여기에는 모든 tmpfs 파일이 포함됩니다. 또한 비밀 커널 tmpfs :-)에서 할당된 "공유" 메모리도 포함됩니다. 여기에는 "System V 공유 메모리"와 특정 유형의 메모리가 포함됩니다.그래픽 버퍼.
그럼에도 불구하고 두 가지 오류는 대략 상쇄됩니다. 나머지 기억은 어떻습니까?
Linux에서 캐시를 삭제할 때 현재 실행 중인 프로그램에 매핑된 캐시는 삭제하지 않도록 선택합니다. 이러한 매핑 중 대부분은 프로그램/라이브러리 코드 파일입니다.
일부 데이터 파일도 매핑될 수 있습니다. 예를 들어 검색 로그를 실행하면 액세스 로그 파일 journalctl
대신 사용됩니다 systemd
.mmap()
read()
를 사용하여 남은 캐시를 확인할 수 있습니다 sudo smem -t -m
. 나는 그들이 현재 주로 프로그램과 그들이 사용하는 라이브러리를 실행할 것으로 예상합니다.
입증하다
이를 확인하려면 다음 커널 코드에 대한 링크를 참조하세요.
캐시 삭제캐시된 각 "inode"(파일)에 대해validate_mapping_pages()를 호출하여 작동합니다.
무효화_매핑_페이지()- inode의 잠금 해제된 모든 페이지를 무효화합니다.
[...]
validate_mapping_pages()는 IO 활동을 차단하지 않습니다. 더티 페이지, 잠긴 페이지, 쓰기 저장 페이지 또는페이지 테이블에 매핑.
"더티" 페이지(캐시된 쓰기)가 있거나 쓰기가 진행 중인 경우에도 삭제되거나 보류되지 않습니다. 이는 에서도 언급되었습니다.문서/sysctl/vm.txt.
더티/쓰기 저장 페이지의 경우, invalidate_mapping_pages()는 deactivate_file_page()를 호출하여 "재활용 속도를 높이려고 [시도]"합니다. 나는 이것이 무엇을 의미하는지 구체적으로 확인하지 않았습니다 :-).