저는 두 가지 실험을 했습니다.
첫 번째 실험(Ubuntu 20.04, ext4 파일 시스템):
- 명령 실행
free -h -w
:
$ free -h -w
total used free shared buffers cache available
Mem: 30Gi 2,6Gi 25Gi 106Mi 126Mi 2,1Gi 27Gi
- 명령 실행
sudo find / | grep something
- 명령을 다시 실행하고
free -h -w
"버퍼" 열이 크게 증가하고(약 1G) "캐시" 열도 증가하는 것을 확인합니다(약 500M).
$ free -h -w
total used free shared buffers cache available
Mem: 30Gi 2,6Gi 24Gi 106Mi 1,2Gi 2,6Gi 27Gi
두 번째 실험(동일 PC):
- 명령 실행
free -h -w
:
$ free -h -w
total used free shared buffers cache available
Mem: 30Gi 2,6Gi 24Gi 106Mi 1,2Gi 2,6Gi 27Gi
- 명령을 실행하세요
dd if=/dev/nvme0n1p2 of=/dev/null bs=1M count=500
. 여기에서 디스크가 또 다른 디스크가 됩니다. - 명령을 다시 실행
free -h -w
하고 버퍼가 500M 증가했는지 확인합니다.
$ free -h -w
total used free shared buffers cache available
Mem: 30Gi 2,6Gi 24Gi 115Mi 1,7Gi 2,6Gi 27Gi
따라서 질문은 buffers
첫 번째 경우에 열이 증가하는 이유와 두 번째 경우에 증가하는 이유는 무엇입니까? 나는 이것을 읽었다무료 출력의 버퍼 열은 무엇입니까?그러나 여기에 대한 대답은 나에게 적합하지 않습니다.
그들은 "버퍼 열에 파일에 대한 메타데이터가 포함되어 있다"고 말합니다. 그러나 "캐시" 열은 inode, dentry 및 buffer_head(실제로는 파일의 메타데이터)의 슬랩을 계산하기 때문에 이는 잘못된 것입니다. man free
또한 cache
열에 SReclaimable
.
그들은 또한 "버퍼 열에 블록 장치의 블록 캐시가 포함되어 있습니다"라고 말합니다. 이는 사실과 더 비슷해 보이며 buffers
명령을 실행할 때 열이 증가하는 이유를 설명하지만 실행할 때 열이 증가하는 dd
이유는 설명하지 않습니다. 명령. 이 경우에도 이미 파일 캐시가 있다면 왜 필요한가요? DVD 디스크를 제외하고 누구도 블록 장치에서 데이터를 직접 읽거나 쓸 수 없습니다.buffers
find
dd
답변1
여기서 답을 찾았습니다.과도한 버퍼 메모리 사용량의 원인을 확인하는 방법은 무엇입니까?
Linux는 파일의 inode를 두 번 저장하는 것 같습니다. 첫 번째는 슬래브에 ext4_inode_cache
/ 로 저장하고(명령을 사용하여 이 슬랩의 크기를 늘리는 것을 관찰했습니다 ), 두 번째는 버퍼에 저장합니다(inode가 블록 장치에서 직접 읽혀지기 때문입니다. 모든 블록은 블록 장치에서 직접 읽혀집니다(블록 장치는 이를 버퍼에 저장합니다). 따라서 명령을 실행하면 Linux는 블록 장치에서 inode의 블록을 읽고 이를 버퍼에 저장한 다음 슬랩에 inode의 캐시를 생성합니다. 결과적으로 출력의 및 열이 모두 증가합니다.inode_cache
slabtop
find
cache
buffers
free