캐시와 버퍼의 차이점

리눅스는 항상 여유 메모리 공간을 Buffer와 Cache로 사용하려고 시도한다. 메모리에 데이터를 저장해서 느린 디스크로의 접근을 최대한 줄여 성능을 향상 시킨다.

Buffer는 버퍼 캐시로 디바이스 블록에 대한 메타데이터들을 메모리에 캐싱한 크기, 블록 디아비스로부터 데이터를 읽어오기 위해 필요한 정보들을 메모리에 저장해 둔다.

Cache는 페이지 캐시와 slab으로 사용중인 메모리 크기

  • 페이지 캐시는 한 번 디스크로 읽어온 데이터를 메모리에 저장하여 같은 데이터를 다시 읽을 때 디스크로 요청하지 않고 메모리에서 바로 읽어올 수 있게 한다.

  • slab은 커널에서 관리하는 커널 오브젝트를 저장하는 단위, 커널은 어플리케이션 할당 단위인 페이지보다 작은 단위인 slab 단위로 메모리를 사용한다. 하나의 메모리 페이지에 여러 slab들이 존재할 수 있다.

  • slab에 파일의 inode나 dentry 정보들을 캐싱할 수 있다.

01:10:49 cwlim@HOWOKACE ~  cat /proc/meminfo
MemTotal:        3714960 kB
MemFree:         3032296 kB
MemAvailable:    3133216 kB
Buffers:            3748 kB
Cached:           291776 kB
SwapCached:            0 kB
Active:           108628 kB
Inactive:         318660 kB
Active(anon):       1816 kB
Inactive(anon):   139224 kB
Active(file):     106812 kB
Inactive(file):   179436 kB
Unevictable:           0 kB
Mlocked:               0 kB
SwapTotal:       4108284 kB
SwapFree:        4108284 kB
Dirty:                 0 kB
Writeback:             0 kB
AnonPages:        128860 kB
Mapped:           128216 kB
Shmem:              9276 kB
KReclaimable:      36900 kB
Slab:             106876 kB
SReclaimable:      36900 kB
SUnreclaim:        69976 kB
KernelStack:        5680 kB
PageTables:         2284 kB
NFS_Unstable:          0 kB
Bounce:                0 kB
WritebackTmp:          0 kB
CommitLimit:     5965764 kB
Committed_AS:     619200 kB
VmallocTotal:   34359738367 kB
VmallocUsed:       54480 kB
VmallocChunk:          0 kB
Percpu:            62464 kB
HardwareCorrupted:     0 kB
AnonHugePages:     49152 kB
ShmemHugePages:        0 kB
ShmemPmdMapped:        0 kB
FileHugePages:         0 kB
FilePmdMapped:         0 kB
CmaTotal:              0 kB
CmaFree:               0 kB
HugePages_Total:       0
HugePages_Free:        0
HugePages_Rsvd:        0
HugePages_Surp:        0
Hugepagesize:       2048 kB
Hugetlb:               0 kB
DirectMap4k:      161600 kB
DirectMap2M:     2983936 kB
DirectMap1G:     3145728 kB

Inactive(anon)와 Inactive(file), SRelaimable은 참조된 지 오래되어 스왑 영역으로 이동하고 그영역을 새로운 메모리로 할당할 수 있는 크기이다.

  • Inactive(anon)는 익명 메모리 중 참조가 적은 메모리 크기

  • Inactive(file)은 페이지 캐시 중 참조가 적은 메모리 캐시

  • SRelaimable은 slab 중 재할당이 가능한 영역이다.

free 명령어에서 이 값들을 참조하여 메모리 캐싱된 데이터들 중 스왑영역으로 아웃 시키고 메모리를 비워 새로울 할당을 할 수 있는 크기를 free 명령어의 availalbe로 보여주는 것이다. available은 어디까지나 시스템에서 계산된 예측 크기이니 이 값에 너무 의존해서는 안된다.

출처 :https://www.whatap.io/ko/blog/37/

Last updated