반응형

Buffers와 cached 영역

커널은 블록디바이스(디스크)로부터 데이터를 읽거나 사용자의 데이터를 디스크에 저장한다. 하지만 디스크는 다른 장치에 비해 매우 느리기 때문에 디스크에 요청을 기다리는 시간이 상당히 많이 소요되고, 이로 인해 시스템에 부하가 발생하게 된다.

 

한번 읽은 디스크의 내용을 메모리에 저장해 두어서 동일한 내용을 읽고자 하면 다시크로 요청하지 않고 메모리에 저장해 두어서, 동일한 내용을 일고자 한다면 디스크로 요청하지 않고 메모리오 요청하게 되는데 이런기능을 캐싱기능이라고 한다

 

이때 사용되는 캐싱영역을 buffers, cached라고 부른는데 이 차이점을 알아보고자 한다.

 

 

 

Page Cache는 bio 구조체를 만들고 해당 구조체에 디스크로부터 받은 일반적인 데이터를 저장하게 되고 Buffer Cache는 일반적인 데이터가 아닌 _get_blk()와 같은 내부 함수를 통해 데이터가 아닌 super block, inode block 데이터를 저장한다. 정리하면 Page Cache는 파일 내용을 저장하고 있는 캐쉬, Buffer Cache는 파일시스템의 메타 데이터를 담고 있는 블록을 저장한다.

 

서버운영 시간이 길지 않을 때는 가용영역에 있는 메모리의 사용양이 사용영역보다 많게 됩니다. 시간이 조금 지나면 시스템은 가용영역 중 일부를 , 캐쉬영역으로 사용하게 됩니다. 그러나 시간이 지날수록 application에서 사용해야 되는 사용영역이 늘어나게 되면 일부 캐쉬영역을 반환해서 사용영역으로 반환하게 된다, 이렇게 지나고 캐쉬영역이 사용할 메모리 공간이 없어지게 되면 시스템 swap 영역을 사용하게 되고 그 순간부터 시스템 성능이 줄어들게 됩니다. 이처럼 buffers와 cached는 시스템의 I/O 성능 향상을 위해서 커널이 사용하는 영역입니다.

 

/proc/meminfo 읽기

root@choi:~# cat /proc/meminfo

MemTotal: 16305588 kB

MemFree: 366592 kB

MemAvailable: 15282500 kB

Buffers: 7065240 kB

Cached: 8024384 kB

SwapCached: 196 kB

Active: 5018828 kB

Inactive: 10413956 kB

Active(anon): 220168 kB

Inactive(anon): 223656 kB

Active(file): 4798660 kB

Inactive(file): 10190300 kB

Unevictable: 16 kB

Mlocked: 16 kB

SwapTotal: 2097148 kB

SwapFree: 2087420 kB

Dirty: 812 kB

Writeback: 0 kB

AnonPages: 343028 kB

Mapped: 242032 kB

Shmem: 100664 kB

Slab: 388140 kB

SReclaimable: 262456 kB

SUnreclaim: 125684 kB

KernelStack: 6288 kB

PageTables: 27120 kB

NFS_Unstable: 0 kB

Bounce: 0 kB

WritebackTmp: 0 kB

CommitLimit: 10249940 kB

Committed_AS: 2933680 kB

VmallocTotal: 34359738367 kB

VmallocUsed: 0 kB

VmallocChunk: 0 kB

HardwareCorrupted: 0 kB

AnonHugePages: 2048 kB

ShmemHugePages: 0 kB

ShmemPmdMapped: 0 kB

CmaTotal: 0 kB

CmaFree: 0 kB

HugePages_Total: 0

HugePages_Free: 0

HugePages_Rsvd: 0

HugePages_Surp: 0

Hugepagesize: 2048 kB

DirectMap4k: 941696 kB

DirectMap2M: 15716352 kB

SwapCached : SwapCached는 SWAP으로 빠진 영역 중 다시 메모리로 돌아온 영역입니다. 시스템에 메모리가 부족하면 커널은 프로세스의 주소공간 중 swap영역으로 이동시킬 수 있는 메모리를 선택해서 swap 영역으로 이동시킨다. 이 과정에서 I/O가 일어나기 때문에 성능저하가 발생한다. 그 후 메모리가 확보되어 swap영역으로 빠졌던 영역이 다시 메모리로 돌아가더라도 지우지 않고 이후에 발생할 수 있는 메모리 부족현상을 대비해서 이전에 내용을 지우지 않습니다.

 

Active(anon) : 특정 파일 내용을 저장하고 있는 Page Cache 영역을 제외한 메모리영역을 의미 한다. 주로 프로세스들이 사용하는 메모리 영역을 지칭하며, 그중에서도 비교적 최근에 메모리영역이 참조되어 swap 영역으로 이동되지 않을 메모리 영역을 의미한다.

 

Inactive(anon) : Active(anon)와 동일영역, 비교적 참조한지가 오래되어 swap으로 이동할 수 있는 메모리 영역

 

Active(file) : anon과 다르게 file로 되어 있는 이 영역은 커널이 I/O 성능 향상을 위해 사용된는 영역을 의미한다. buffer와 cached가 여기에 속한다. 최근에 참조되어 swap영역으로 이동되지 않을 메모리 영역이다.

 

Inactive(file) : Active(file)과 비슷한 용도로 사용, 비교적 참조 된지 오래되어 swap 영역으로 내려 갈 수 있는 영역이다.

 

Dirty : I/O 성능향상을 위해 커널이 캐시 목적으로 사용하는 영역 중 쓰기 작업 이 이루어져서 실제 블록 디바이스 드라이버에 씌어져야 할 영역을 의미한다. 커널은 기본적으로 I/O 쓰기 요청이 들어오면 바로 블록 디바이스 드라이버에 내리지 않고 일정량이 될 때까지 모았다가 지연쓰기를 한다.

 

slab : 메모리 영역 중 커널이 직접 사용하는 영역을 Slab 영역이라고 한다. 이 영역에는 dentry cache, inode cache등 커널이 사용하는 메모리가 포함된다.

 

SReclaimable : slab 영역 중 재사용 될 수 있는 영역이다. 캐시 용도로 사용되는 메모리들이 주로 여기에 포함된다. 메모리 부족현상이 일어나면 해제되어 프로세스에 할당 될 수 있는 영역이다.

 

SUnreclaim : slab 영역 중 재사용 될 수 없는 영역이다. 커널이 현재 사용중인 영역이며 해제해서 다른 용도로 사용할 ㅅ없다.

반응형

+ Recent posts