/var/log/messages
free 명령어 정리 본문
RAM은 하드에 저장 되어 있는 데이터를 더 빨리 가져오기 위해 사용 된다.
자주 쓰는 데이터들을 RAM이란 곳에 저장해와서 더 빨리 가져올 수 있게 하기 때문이다.
기업들이 I/O를 위해 돈을 아낌없이 투자하는 것을 볼 수 있듯이, RAM은 아주 중요한 역할을 담당하고 있다.
그렇기에 health-check를 할 때, free나 sar를 이용해서 꼭 분석을 해야한다.
개인적으로 free란 명령어는 아는 만큼만 보인다는 말에 적합한 표현 같아서 정리를 깊게 하고 싶었다.
현시점을 기준으로, 메모리와 스왑을 아래와 같은 항목에 대해서 조사가 가능하다.
total: 현제 메모리의 크기
used: 현재 사용중인 메모리의 크기
free: 안 쓰고 있는 메모리의 양( total - buff/cache 한 수치와 아주 유사 )
shared: 프로세스 통신 간에 사용되는 메모리의 양(주로 tmpfs가 사용)
buffer/cache: 데이터의 속성과, 캐시 동작을 위해 사용되는 메모리의 양
필요할 때 해제가 가능
간혹, available의 수치에 비해 이 항목의 수치가 월등히 높은 경우가 있다. 그때는 echo 1 > /proc/sys/vm/drop_caches를 이용해서 pagecache를 삭제할 수 있다. cache가 차지하고 있는 용량을 확인하기 위해서는 free -w를 입력하면 된다. |
available: swap없이 사용할 수 있는 메모리의 양의 추정치이다.
한 항목을 제외하고는, 매우 단순한 성격을 가진다. 전체를 기준으로 잡기 때문이다. 그런데, 현재 동작 중인 여러 프로세스들을 기준으로 하는 항목이 있다. 이 항목을 어떻게 다루느냐에 따라 swap을 사용하는지 안 하는지를 조절 할 수 있고
메모리의 용량을 확보 할 수 있다, 바로 buffer/cache이다.
buffer/cache의 설명은 간단히 적었지만, 깊게 들어가보면 3가지 항목으로 구분해서 볼 수 있다.
1. Buffer Cache
리눅스 커널이 I/O를 향상하기 위해 사용하는 메모리 영역이다.
Super block과 inode에 해당하는 메타데이터(=속성)를 저장한다,.
Super block은 파일 시스템의 속성을 정의한다. 파일 시스템 유형, 크기 다른 데이터 속성의 구조 정의 등을 예시로 들 수 있다. 이 예시는, 저번 글의 있는 SUSE 공식 문서 링크를 읽어보면 체감이 될 것이다. 커널의 코드로도 확인할 수 있다. |
2. Page Cache
리눅스 커널이 I/O를 향상하기 위해 사용하는 메모리 영역이다.
메모리에서도 자주 쓰는 데이터들을 저장한 곳이며, Page(4KB) 단위로 관리한다. Page 들을 모아놓은 테이블을 Page Tabel이라 하는데, 이 곳이 Ram의 용량 부족시, 해결할 수 있는 첫번째 타켓이다. 이유는 아래와 같다.
Cache에 저장이 된다는 의미는, 데이터가 Page Cache라는 영역에 복사가 되고, 메모리에 복사가 된 것을 의미한다. Page Cache 영역을 가진다는 것은, Page들을 관리하는 Ram의 영역을 가진다는 것을 의미한다. 이때 프로세스가 데이터를 read 하면, Page Cache에 그 데이터를 작성하고 수정이 되었다는 의미로 'dirty' 플래그를 붙인다.
Page Cache의 문제는. 더 이상 Ram에 없게 된 상황에서 캐시에 있는 데이터 아무거나 읽을 때 마다 이 테이블의 크기는 증가한다. 즉, 낭비가 일어난다. 그렇게 되니, 2순위로 dirty-page를 하드 디스크에 저장한 후 dirty-page를 해제한다.
관련 커널 파라미터는 아래와 같다.
vm.dirty_writeback_centisecs
dirty-page 복사본을 하드 디스크에 복사를 하는데, 복사 주기를 결정하는 파라미터이다.
단위는 ms이다. 기본 값은 500ms, 즉 5초에 한번 씩 동작을 한다.
/proc/sys/vm/dirty_background_ratio
RAM의 특정 비율이 dirty-page의 용량이 일치하면 vm.dirty_writeback_centisecs 동작을 하겠다는 파라미터이다.
예를 들어 20이라 되어있고 RAM 용량이 4GB하면, 800MB가 되면 vm.dirty_writeback_centisecs 동작을 하겠다는
의미이다.
/proc/sys/vm/dirty_background_bytes
vm.dirty_writeback_centisecs의 동작을 %가 아닌, Bytes 단위로 하겠다는 것이다.
/proc/sys/vm/dirty_ratio
지정된 비율이 dirty-page 크기와 일치하다면, 프로세스의 모든 I/O를 멈추고 동기화 작업을 수행한다.
/proc/sys/vm/dirty_bytes
dirty_ratio 동작을 비율이 아닌 Bytes단위로 정하는 것이다.
/proc/sys/vm/dirty_expire_centisecs
dirty_writeback_centisecs의 동작시간을 결정하는 파라미터이다.
/proc/sys/vm/dirtytime_expire_seconds
dirty time 만료되는 시간 조정하는 파라미터
/proc/sys/vm/dirtytime_expire_seconds
나중에 알게 되면 적어 놓을 예정이다
dirty_ratio와 dirty_expire_centisecs는 I/O에 직접적인 영향을 끼칠 수 있기에, 사용에 주의하여야 한다.
3. Slab 영역
커널이 사용하는 캐시 영역이다. 이 영역은 디렉터리 구조, 파일의 정보 중 커널이 사용하는 것들을 저장하는 영역이다.
디렉터리 구조를 dentry 라고 하는데, dentry와 inode를 저장한다는 표현이 간결하면서 정확한 표현이다.
SRclaimable
재사용 가능한 slab 영역의 크기이다.
SUnreclaim
메모리가 부족하여도 재할당 되지 않은 영역이다.
메모리의 용량에 따라 커널은 buffer/cache를 조절한다.
buffer/cache를 확장하는 경우: free 공간이 여유롭다고 판단
buffer/cache를 반환하는 경우: 프로세스가 메모리를 많이 사용해서 used를 넓혀갈 경우
=> 이렇게 해도 부족하면 swap을 사용하고, swap마저 모두 사용하면 OOM-Killer의 이해 서버가 shutdown이 된다.
관련 파라미터는 아래와 같다.
/proc/sys/vm/vfs_cache_pressure
inode와 dentry cache가 사용하는 영역 중 cache로 사용된 영역을 메모리로 회수하는 비율을 나타낸 항목이다.
기본 값은 100이고, 절대 0으로 하면 안 된다. OOM-Killer에 의해 shutdown이 될 것이다.
100이상 10,000이하 정도 범위에서 설정이 가능하다.
'SUSE' 카테고리의 다른 글
yast로 본딩 하기 (0) | 2023.03.24 |
---|---|
X.509란? (0) | 2023.03.13 |
리눅스 파일시스템이란 (0) | 2023.02.22 |
/var, 로그 메시지가 생기는 과정 (0) | 2023.02.13 |
/usr 디렉터리 (0) | 2023.02.11 |