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

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

내가 이해할 때

  • 버퍼

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

  • 은닉처

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

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



답변

“캐시 된”총계에는 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에 보유 된 최근 읽기 / 쓰기 블록 수”만큼 간단하지는 않지만 대부분의 경우이 간단한 설명이 수행합니다.


답변

까다로운 질문. 여유 공간을 계산할 때 실제로 버퍼를 추가하고 둘 다 캐시해야합니다. 이것이 내가 찾은 것입니다

버퍼는 아직 디스크에 “쓰기”되지 않은 것입니다. 캐시는 디스크에서 “읽고”나중에 사용하기 위해 저장 한 것입니다.

http://visualbasic.ittoolbox.com/documents/difference-between-buffer-and-cache-12135


답변

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

16 장 : 페이지 및 버퍼 캐시

상호 작용

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


답변

RedHat에 의해 설명 :

캐시 페이지 :

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

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

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

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

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

버퍼 :

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


답변

버퍼링 / 캐시 해제

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

이해를 돕기 위해 캐시 된 파일을 삭제하는 것보다 시스템이 가능한 많은 메모리를 위임 하도록 할 수 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

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


답변