리눅스에서 버퍼와 캐시 메모리의 차이점은 무엇입니까?


179

나에게 두 개의 리눅스 메모리 개념의 차이 무엇 분명하지 않다 : buffercache. 이 게시물을 읽었 으며 그들 사이의 차이점은 만료 정책 인 것 같습니다.

  1. 버퍼 정책은 선입 선출입니다
  2. 캐시 정책은 가장 최근에 사용한 것입니다.

내가 맞아?

특히, 나는 두 명령에서 찾고 : freevmstat

james@utopia:~$ vmstat -S M
procs -----------memory---------- ---swap-- -----io---- -system-- ----cpu----
r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa
5  0      0    173     67    912    0    0    19    59   75 1087 24  4 71  1
james@utopia:~$ free -m
             total       used       free     shared    buffers     cached
Mem:          2007       1834        172          0         67        914
-/+ buffers/cache:        853       1153
Swap:         2859          0       2859

당신은 우리에게 더 많은 맥락을 제공해야합니다. 두 용어는 다른 의미로 사용됩니다. free명령 출력 을 참조하고 있습니까?
leonbloy 2016 년

3
당신이 옳습니다, 나는 두 가지 명령을보고 있습니다 : free, vmstat. 내 업데이트를 참조하십시오.
James.Xu

1
또한 방문 할 unix.stackexchange.com
leonbloy

답변:


69

"버퍼"는 캐시 디스크 블록 전용 RAM의 양을 나타냅니다. "캐시 됨"은 "버퍼"와 유사하지만 이번에는 파일 읽기에서 페이지를 캐시합니다.

인용 :


3
나는 많은 양의 블록을 쓰는 간단한 파이썬 프로그램을 사용하여 이것을 테스트했습니다. 결과 는 열이 아니라에 cache의해보고 된대로 채워집니다 . 내가 생각하는 열이 모두 디스크 쓰기를 계산하고 디스크 읽기 및 다른 것에 사용된다. free -w -hbufferscachebuffers
CMCDragonkai

실험적 증거에 감사드립니다. 흥미로운 질문은 디스크가 플러시 될 수있는 것보다 빠르게 쓰는지 여부입니다. (예 : 동기화 시간이 오래 걸림) 더러운 블록이 깨끗한 블록과 다르게 계산되는지 알려줍니다. 리눅스는 확실히 두 가지 유형을 캐시하지만 (문제에서 언급 한 것처럼) 메모리 압박 측면에서 훨씬 더 심각합니다.
세스 로버트슨

179

버퍼는 특정 블록 장치와 관련이 있으며 파일 시스템 메타 데이터의 캐싱과 기내 페이지 추적을 포함합니다. 캐시에는 파킹 된 파일 데이터 만 포함됩니다. 즉, 버퍼는 디렉토리의 내용, 파일 사용 권한을 기억하고 특정 블록 장치에 대해 쓰거나 읽은 메모리를 추적합니다. 캐시에는 파일 자체의 내용 만 포함됩니다.

인용 링크


1
짧고 잘 설명되어 있습니다. 감사.
curiousguy

84

인용 된 답변 (참조 용) :

짧은 대답 : 캐시는 페이지 캐시의 크기입니다. 버퍼는 메모리 내 블록 I / O 버퍼의 크기입니다. 캐시 된 사항; 버퍼는 크게 관련이 없습니다.

긴 답변 : 캐시 됨은 스왑 캐시의 메모리를 뺀 Linux 페이지 캐시의 크기이며 SwapCached로 표시됩니다 (따라서 전체 페이지 캐시 크기는 캐시 된 + 스왑 캐시 됨). Linux는 페이지 캐시를 통해 모든 파일 I / O를 수행합니다. 쓰기는 단순히 페이지 캐시에서 해당 페이지를 더티로 표시하는 것으로 구현됩니다. 그런 다음 플러 셔 스레드는 정기적으로 더티 페이지를 디스크에 다시 기록합니다. 읽기는 페이지 캐시에서 데이터를 반환하여 구현됩니다. 데이터가 아직 캐시에 없으면 먼저 채워집니다. 최신 Linux 시스템에서 캐시는 쉽게 몇 기가 바이트가 될 수 있습니다. 메모리 압력에 따라 축소됩니다. 시스템은 필요에 따라 더 많은 메모리를 사용할 수 있도록 데이터를 디스크로 스왑 아웃하면서 페이지 캐시를 제거합니다.

버퍼는 메모리 내 블록 I / O 버퍼입니다. 상대적으로 수명이 짧습니다. Linux 커널 버전 2.4 이전에는 Linux에 별도의 페이지 및 버퍼 캐시가있었습니다. 2.4 이후로, 페이지 및 버퍼 캐시는 통합되고 버퍼는 페이지 캐시에 표시되지 않은 원시 디스크 블록 (파일 데이터가 아님)입니다. 따라서 버퍼 메트릭은 매우 중요합니다. 대부분의 시스템에서 버퍼는 종종 수십 메가 바이트에 불과합니다.


7
"버퍼는 크게 관련이 없습니다."-아니요. 파일 내용 캐싱과 관련이없는 경우가 많지만 메타 데이터를 캐시에 보관하면 작업 속도가 빨라집니다. 예를 들어 비디오 스트리밍 NAS 서버.
Gunther Piez

많은 I / O를 수행하는 모든 시스템은 버퍼에 많은 메모리를 사용합니다. 100GB MySQL / InnoDB 데이터베이스를 벌크로드하고 있으며 버퍼는 항상 2GB 이상입니다.
Marcelo Pacheco

21

이처럼 간단하지는 않지만 이해하는 데 도움이 될 수 있습니다.

버퍼는 파일 메타 데이터 (권한, 위치 등)를 저장하기위한 것입니다. 모든 메모리 페이지는 여기에서 추적됩니다.

캐시는 실제 파일 내용을 저장하기위한 것입니다.


5
IOW, 버퍼 = 메타 데이터; 캐시 = 데이터;
Freedom_Ben

13

RedHat에 의해 설명 :

캐시 페이지 :

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

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

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

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

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

버퍼 :

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


12

버퍼 및 캐시.

버퍼는 아직 디스크에 "쓰기"되지 않은 것입니다.

캐시는 디스크에서 "읽고"나중에 사용하기 위해 저장 한 것입니다.


2
새로운 사용자 팁 : 가능한 한 질문에 대한 답변과 명확하게 답변하십시오. 내가 당신이라면, "당신의 예를 들어서 ..."로 시작하는 섹션을 당신의 대답에 추가하고 그것에 대해 조금 자세히 설명하겠습니다.
Piotr Wadas

25
나는이 대답은, 즉 질문 (과 동일한 맥락에서 사실 생각하지 않는 것 "캐시" "버퍼"를하여 리눅스 커널 수단
Freedom_Ben

8

이 페이지는 버퍼와 캐시의 차이점을 깊이 이해하는 데 도움이 될 것이라고 생각합니다. http://www.tldp.org/LDP/sag/html/buffer-cache.html

디스크에서 읽는 것은 (실제) 메모리에 액세스하는 것에 비해 매우 느립니다. 또한 비교적 짧은 시간 동안 디스크의 동일한 부분을 여러 번 읽는 것이 일반적입니다. 예를 들어, 먼저 전자 메일 메시지를 읽은 다음 회신 할 때 편지를 편집기로 읽은 다음 메일 프로그램을 폴더에 복사 할 때 다시 읽도록 할 수 있습니다. 또는 ls많은 사용자가있는 시스템 에서 명령 이 얼마나 자주 실행될 수 있는지 고려하십시오 . 디스크에서 정보를 한 번만 읽은 다음 더 이상 필요하지 않을 때까지 메모리에 보관하면 첫 번째 읽기를 제외한 모든 속도를 높일 수 있습니다. 이를 디스크 버퍼링이라고하며, 목적에 사용되는 메모리를 버퍼 캐시라고합니다.

불행히도 메모리는 유한하고 부족한 희소 한 리소스이기 때문에 버퍼 캐시는 일반적으로 충분히 클 수 없습니다 (사용하려는 모든 데이터를 보유 할 수는 없음). 캐시가 가득 차면 가장 오랫동안 사용하지 않은 데이터는 삭제되고 사용 가능한 메모리가 새 데이터에 사용됩니다.

디스크 버퍼링은 쓰기에도 작동합니다. 한편으로, 기록 된 데이터는 종종 곧 다시 읽히고 (예를 들어, 소스 코드 파일이 파일에 저장된 후 컴파일러에 의해 읽혀 짐), 캐시에 기록 된 데이터를 넣는 것이 좋습니다. 반면, 데이터를 캐시에 넣고 디스크에 한 번에 쓰지 않고 쓰면 프로그램이 더 빨리 실행됩니다. 그런 다음 다른 프로그램의 속도를 늦추지 않고 백그라운드에서 쓰기를 수행 할 수 있습니다.


이것은 vmstat 및 free 명령의 출력에서 ​​버퍼와 캐시의 차이점이 아닌 버퍼 캐시에 대해 설명합니다.
Roel Schroeven

4

Seth Robertson의 Link 2는 "이러한 용어를 완전히 이해하려면 Robert M. Love의 Linux Kernel Development와 같은 Linux 커널 책을 참조하십시오."

나는 책의 두 번째 판에서 '버퍼'에 대한 내용을 발견했습니다.

물리적 장치 자체는 섹터 수준에서 처리 할 수 ​​있지만 커널은 모든 디스크 작업을 블록 단위로 수행합니다.

블록이 메모리에 저장되면 (예를 들어, 읽기 후 또는 쓰기 보류 중), '버퍼'에 저장됩니다. 각 '버퍼'는 정확히 하나의 블록과 연관됩니다. '버퍼'는 메모리의 디스크 블록을 나타내는 객체의 역할을합니다.

'버퍼'는 단일 물리 디스크 블록의 메모리 내 표현입니다.

블록 I / O 작업은 한 번에 하나의 디스크 블록을 조작합니다. 일반적인 블록 I / O 작업은 inode를 읽고 쓰는 것입니다. 커널은 bread () 함수를 제공하여 디스크에서 단일 블록의 저수준 읽기를 수행합니다. '버퍼'를 통해 디스크 블록은 관련 인 메모리 페이지에 매핑됩니다. "


2

버퍼는 쓰기 성능을 향상시키는 데 도움이되는 메타 데이터를 포함합니다.

캐시는 파일 성능 자체를 포함하며 (때로는 디스크에 쓰지 않는 경우도 있음) 읽기 성능을 향상시킵니다.


1

이 책의 인용문 : 정보 검색 소개

은닉처

우리는 메모리에 최대한 많은 데이터, 특히 자주 액세스해야하는 데이터를 유지하려고합니다. 우리는 자주 사용되는 디스크 데이터를 메인 메모리 캐싱에 유지하는 기술을 호출합니다.

완충기

운영 체제는 일반적으로 전체 블록을 읽고 씁니다. 따라서 디스크에서 단일 바이트를 읽는 것은 전체 블록을 읽는 것보다 많은 시간이 걸릴 수 있습니다. 8, 16, 32 및 64 킬로바이트 (KB)의 블록 크기가 일반적입니다. 우리는 읽거나 쓰는 블록이 버퍼에 저장되는 메인 메모리 부분을 호출합니다.


0

버퍼는 컴퓨터 내에서 한 장소에서 다른 장소로 이동하는 동안 데이터를 일시적으로 보유하는 데 사용되는 메모리 영역이며, 캐시는 자주 액세스하는 데이터를 빠르게 액세스하기 위해 저장할 수있는 임시 저장 영역입니다. 데이터가 캐시에 저장되면 원래 데이터를 다시 가져 오는 대신 캐시 된 사본에 액세스하여 나중에 사용할 수 있으므로 평균 액세스 시간이 단축됩니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.