"free -h" 명령 출력의 버퍼가 증가하는 이유

"free -h" 명령 출력의 버퍼가 증가하는 이유

저는 두 가지 실험을 했습니다.

첫 번째 실험(Ubuntu 20.04, ext4 파일 시스템):

  1. 명령 실행 free -h -w:
$ free -h -w
              total        used        free      shared     buffers       cache   available
Mem:           30Gi       2,6Gi        25Gi       106Mi       126Mi       2,1Gi        27Gi
  1. 명령 실행sudo find / | grep something
  2. 명령을 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):

  1. 명령 실행 free -h -w:
$ free -h -w
              total        used        free      shared     buffers       cache   available
Mem:           30Gi       2,6Gi        24Gi       106Mi       1,2Gi       2,6Gi        27Gi
  1. 명령 실행 dd if=/dev/nvme0n1p2 of=/dev/null bs=1M count=500- 귀하의 디스크가 여기에 또 다른 디스크가 될 것입니다
  2. 명령을 다시 실행 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첫 번째 경우에 열이 증가한 이유와 두 번째 경우에 왜 증가했습니까? 나는 이것을 읽었다free 출력의 buffers 열은 무엇입니까?하지만 여기에 대한 답변은 나에게 적합하지 않습니다.

그들은 "버퍼 열에 파일에 대한 메타데이터가 포함되어 있습니다"라고 말하지만 이는 잘못된 것입니다. 왜냐하면 inode, dentry 및 buffer_head(실제로 파일의 메타데이터)에 대한 슬랩을 계산하는 "캐시" 열이기 때문입니다. 또한 열에 가 포함되어 있음 man free을 알려줍니다 .cacheSReclaimable

그들은 또한 "버퍼 열에 블록 장치의 블록 캐시가 포함되어 있습니다"라고 말합니다. 이는 진실과 더 비슷해 보입니다. 왜 buffers실행했을 때 증가했는지 설명하지만 명령을 실행할 때 열이 증가한 dd이유는 설명하지 않습니다 . 그리고 이미 파일 캐시가 있는데 왜 필요한가요? DVD 디스크를 제외하고 블록 장치에서 직접 읽거나 쓸 수 없습니다.buffersfinddd

답변1

여기서 답을 찾았습니다.대용량 버퍼 메모리 사용량의 원인을 파악하는 방법은 무엇입니까? Linux는 파일의 inode를 두 번 저장하는 것 같습니다. 처음에는 ext4_inode_cache/ 로 inode_cache슬랩에 저장하고(명령을 사용하여 이 슬랩의 크기가 증가하는 것을 관찰했습니다 slabtop) 두 번째로 버퍼에 저장합니다(inode는 블록 장치에서 직접 읽히고 모든 블록은 블록 장치에서 직접 읽혀지기 때문입니다). 블록 장치는 버퍼에 저장됩니다. 따라서 명령을 실행하면 findLinux는 블록 장치에서 inode의 블록을 읽고 이를 버퍼에 저장한 다음 슬랩에 inode의 캐시를 생성합니다. 결과적으로 출력의 cachebuffers열이 모두 free증가합니다.

관련 정보