Linux에서 free 명령으로보고 된 "버퍼"와 "캐시"의 차이점은 무엇입니까?


73

이것은 때때로 본 오래된 질문입니다. 그것에 대한 나의 이해는 다소 제한적입니다 (오래 전에 차이점에 대해 읽었지만 관련 사실은 실제로 붙어 있지 않습니다).

내가 이해할 때

  • 버퍼

    활성 I / O 작업 (예 : 디스크에 쓰기 위해 대기중인 데이터)이있는 프로그램에서 사용

  • 은닉처

    완료된 I / O 작업, 즉 요청을 충족시키기 위해 플러시 된 버퍼 또는 디스크에서 데이터를 읽은 결과입니다.

후손에 대한 명확한 설명을 얻을 수 있습니까?



버퍼에서 찾은 메타 데이터와 비슷하지만 io 버퍼와 관련이 없습니다. 일부 커널 버퍼는 슬랩 할당 자에서 설명되지만 버퍼 또는 캐시 메모리로 계산되지 않습니다.
eckes

답변:


42

"캐시 된"총계에는 tmpfs 파일 시스템과 같은 다른 메모리 할당도 포함됩니다. 이것을 실제로 보려면 다음을 시도하십시오.

mkdir t
mount -t tmpfs none t
dd if=/dev/zero of=t/zero.file bs=10240 count=10240
sync; echo 3 > /proc/sys/vm/drop_caches; free -m
umount t
sync; echo 3 > /proc/sys/vm/drop_caches; free -m

램 기반 파일 시스템에 복사 한 100Mb만큼 "캐시"값이 감소하는 것을 볼 수 있습니다 (여유 RAM이 충분하다고 가정하면 머신이 이미 오버 커밋 된 경우 스왑으로 종료 될 수 있음) 메모리 사용). free를 호출하기 전에 "sync; echo 3> / proc / sys / vm / drop_caches"는 모든 쓰기 버퍼 (동기화)에 보류중인 모든 것을 작성해야하며 메모리에서 캐시 / 버퍼링 된 디스크 블록을 모두 지워야합니다. "캐시 된"값의 할당.

가상 시스템 (예 : VMWare에서 실행되는 RAM)에서 사용하는 RAM은 현재 열려있는 메모리 매핑 된 파일에서 사용하는 RAM과 마찬가지로 무료의 "캐시 된"값으로 계산 될 수 있습니다 (이는 사용중인 하이퍼 바이저 / 버전에 따라 다름) 커널 버전 사이에서도 가능합니다).

따라서 "버퍼링 보류 파일 / 네트워크 쓰기 수 및 캐시 된 수는 최근 물리적 읽기를 저장하기 위해 RAM에 보유 된 최근 읽기 / 쓰기 블록 수"만큼 간단하지는 않지만 대부분의 경우이 간단한 설명이 수행합니다.


1
흥미로운 뉘앙스에 +1 이것은 내가 찾고있는 종류의 정보입니다. 사실, 나는 수치가 너무 복잡하고 많은 다른 활동에 관여하여 가장 일반적인 지표라고 생각합니다.
Avery Payne

가상 컴퓨터에서 사용하는 RAM이 적어도 qemu-kvm에 대해 "캐시 된"것으로 계산되지는 않습니다. KVM 호스트에서 캐시 값이 너무 작아서 (1.9 Gig에서) 정확할뿐만 아니라 VM 중 하나를 제거 / 시작해도 변경되지 않습니다. VM 중 하나에서 tmpfs 마운트 트릭을 수행해도 변경되지 않습니다. 여기에 800Meg tmpfs 파티션을 만들고 "캐시 된"VM에 적절한 값을 표시했지만 VM 호스트에서 변경되지 않았습니다. 그러나 VM을 파괴 / 시작할 때 "사용 된"값이 줄어들거나 커졌습니다.
Mike S

... 커널 3.10.0-327을 실행하는 Centos 7.2.1511 VM 호스트에서 테스트를 실행했습니다.
Mike S

@MikeS : 다른 가상화 솔루션이 메모리를 처리하는 방법은 다양 할 수 있습니다. 실제로 커널이 다양한 버전의 메모리 사용을 측정하는 방법은 주요 버전간에 변경 될 수 있습니다.
David Spillett

@ Mikes : "VM 중 하나에서 tmpfs 마운트 트릭을 수행하십시오"와 관련하여 VM에서 사용하는 다른 mem을 표시하지 않으면 호스트 판독에 영향을 미치지 않습니다. KVM VM 자체에서 효과가 나타납니다 .dd free = 2020 이전, dd free = 1899 후, drop fs free = 2001 후 (19Mb 차이는 VM의 다른 프로세스로 인한 것이므로 실행했을 때 유휴 상태가 아닙니다. 시험). 호스트는 변경 사항을 보지 못할 수 있습니다. 메모리는 VM의 프로세스에서 사용할 수 있지만 VM에 여전히 할당되어있을 수 있습니다.
David Spillett


5

버퍼에 대한 더 명확한 설명을 찾고 있었고 "Professional Linux® Kernel Architecture 2008"

16 장 : 페이지 및 버퍼 캐시

상호 작용

페이지와 버퍼 사이에 링크를 설정하면 커널의 다른 부분에 이점이없는 경우에는 거의 목적이 없습니다. 이미 언급했듯이, 블록 장치와의 일부 전송 작업은 기본 장치의 블록 크기에 따라 크기가 다른 단위로 수행해야 할 수도 있지만 커널의 많은 부분은 페이지 단위로 I / O 작업을 수행하는 것을 선호합니다. 특히 메모리 관리 측면에서 훨씬 쉬워집니다. 이 시나리오에서 버퍼는 두 세계 사이의 중개자 역할을합니다.


3

RedHat에 의해 설명 :

캐시 페이지 :

캐시는 메모리의 일부로 데이터를 투명하게 저장하여 해당 데이터에 대한 향후 요청을 더 빨리 처리 할 수 ​​있습니다. 이 메모리는 커널에서 디스크 데이터를 캐시하고 i / o 성능을 향상시키는 데 사용됩니다.

Linux 커널은 로컬 및 원격 파일 시스템 및 디스크에서 정보를 캐시하기 위해 가능한 한 많은 RAM을 사용할 수 있도록 구축되었습니다. 시간이 시스템에서 다양한 읽기 및 쓰기가 수행됨에 따라 커널은 시스템에서 실행중인 다양한 프로세스 또는 가까운 미래에 사용될 관련 프로세스의 데이터를 위해 메모리에 저장된 데이터를 유지하려고합니다. 프로세스가 중지 / 종료 될 때 캐시는 회수되지 않지만, 다른 프로세스에 사용 가능한 메모리보다 많은 메모리가 필요한 경우 커널은 캐시 데이터를 저장하고 해당 메모리를 새 프로세스에 할당하여 메모리를 회수하기 위해 휴리스틱을 실행합니다.

어떤 종류의 파일 / 데이터가 요청되면, 커널은 사용자가 작업중인 파일의 일부 복사본을 찾고, 그러한 복사본이 존재하지 않으면 캐시 메모리의 새 페이지를 하나 할당하여 채 웁니다. 디스크에서 적절한 내용을 읽습니다.

캐시에 저장된 데이터는 이전에 계산 된 값이거나 디스크의 다른 곳에 저장된 원래 값의 복제본 일 수 있습니다. 일부 데이터가 요청되면 캐시에 먼저 해당 데이터가 포함되어 있는지 확인합니다. 데이터는 소스 출처보다 캐시에서 더 빨리 검색 할 수 있습니다.

SysV 공유 메모리 세그먼트는 디스크의 데이터를 나타내지 않지만 캐시로 간주됩니다. ipcs -m 명령을 사용하고 bytes 열을 확인하여 공유 메모리 세그먼트의 크기를 확인할 수 있습니다.

버퍼 :

버퍼는 페이지 캐시에 저장된 데이터의 디스크 블록 표현입니다. 버퍼에는 페이지 캐시에있는 파일 / 데이터의 메타 데이터가 포함됩니다. 예 : 페이지 캐시에있는 데이터 요청이있는 경우 먼저 커널은 페이지 캐시에 포함 된 실제 파일 / 데이터를 가리키는 메타 데이터가 포함 된 버퍼의 데이터를 확인합니다. 메타 데이터에서 파일의 실제 블록 주소가 알려지면 처리를 위해 커널에 의해 선택됩니다.


2

버퍼링 / 캐시 해제

경고 이것은 프로덕션 서버에서 권장하지 않는 강력한 방법을 설명합니다! 그래서 당신은 경고가 있습니다, 무언가 잘못되었다고 탓하지 마십시오.

이해를 돕기 위해 캐시 된 파일을 삭제하는 것보다 시스템이 가능한 많은 메모리를 위임 하도록 할 수 cache있습니다.

전문

테스트를 수행하기 전에 다른 창에서 히트를 열 수 있습니다.

$ vmstat -n 1
procs -----------memory---------- ---swap-- -----io---- -system-- ----cpu----
 r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa
 0  1  39132  59740  39892 1038820    0    0     1     0    3    3  5 13 81  1
 1  0  39132  59140  40076 1038812    0    0   184     0 10566 2157 27 15 48 11
...

실시간 스왑 진화를 위해.

참고 : 현재 디렉토리에 사용 가능한 디스크를 최대한 폐기해야합니다 . mem + swap이 있습니다.

데모
$ free
         total       used       free     shared    buffers     cached
Mem:       2064396    2004320      60076          0      90740     945964
-/+ buffers/cache:     967616    1096780
Swap:      3145720      38812    3106908

$ tot=0
$ while read -a line;do
      [[ "${line%:}" =~ ^(Swap|Mem)Total$ ]] && ((tot+=2*${line[1]}))
    done </proc/meminfo
$ echo $tot
10420232

$ dd if=/dev/zero of=veryBigFile count=$tot
10420232+0 records in
10420232+0 records out
5335158784 bytes (5.3 GB) copied, 109.526 s, 48.7 MB/s

$ cat >/dev/null veryBigFile

$ free
             total       used       free     shared    buffers     cached
Mem:       2064396    2010160      54236          0      41568    1039636
-/+ buffers/cache:     928956    1135440
Swap:      3145720      39132    3106588

$ rm veryBigFile 

$ free
         total       used       free     shared    buffers     cached
Mem:       2064396    1005104    1059292          0      41840      48124
-/+ buffers/cache:     915140    1149256
Swap:      3145720      39132    3106588

참고로, 내가 한 모든 호스트는 강력하게 사용됩니다. 이것은 정말 조용한 기계에서 더 중요합니다.


1
가능하면 -1입니다. 이것은 (A) 질문과 관련이 없으며 (B) 캐시 정리를 트리거하는 끔찍한 무딘 힘 방법입니다. 후자를 수행하는 직접적인 방법이 있으므로 부작용으로 플러시 될 때까지 시스템이 데이터를 스팸으로 보내 시스템을 속이는 것은 방어 할 수 없습니다.
underscore_d

이런! 실제 서버에서는 절대로 그렇게하지 마십시오!
tamerlaha

@Tamerlaha 나는 동의하지만, 첫 번째 단락을 다시 읽으십시오 : 당신은 경고합니다, 나를 비난하지 마십시오 ! 이것의 목표는 버퍼 / 캐시 영향을 보여주는 것입니다.
F. Hauri
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.