이것은 때때로 본 오래된 질문입니다. 그것에 대한 나의 이해는 다소 제한적입니다 (오래 전에 차이점에 대해 읽었지만 관련 사실은 실제로 붙어 있지 않습니다).
내가 이해할 때
버퍼
활성 I / O 작업 (예 : 디스크에 쓰기 위해 대기중인 데이터)이있는 프로그램에서 사용
은닉처
완료된 I / O 작업, 즉 요청을 충족시키기 위해 플러시 된 버퍼 또는 디스크에서 데이터를 읽은 결과입니다.
후손에 대한 명확한 설명을 얻을 수 있습니까?
이것은 때때로 본 오래된 질문입니다. 그것에 대한 나의 이해는 다소 제한적입니다 (오래 전에 차이점에 대해 읽었지만 관련 사실은 실제로 붙어 있지 않습니다).
내가 이해할 때
버퍼
활성 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
참고로, 내가 한 모든 호스트는 강력하게 사용됩니다. 이것은 정말 조용한 기계에서 더 중요합니다.