일부 캐시는 왜 삭제할 수 없나요?

일부 캐시는 왜 삭제할 수 없나요?

출력은 다음과 같습니다 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()를 호출하여 "재활용 속도를 높이려고 [시도]"합니다. 나는 이것이 무엇을 의미하는지 구체적으로 확인하지 않았습니다 :-).

관련 정보