반응형
Notice
Recent Posts
Recent Comments
Link
«   2024/12   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31
Archives
Today
Total
관리 메뉴

/var/log/messages

/proc/meminfo의 Active와 Inactive, 그리고 kswapd 본문

카테고리 없음

/proc/meminfo의 Active와 Inactive, 그리고 kswapd

로만로만 2023. 3. 5. 15:21
반응형

메모리를 평소에 50~60%를 사용 중이었다가 갑자기 80, 90%를 사용 중인 로그가 발견 되었다면, 조치를 취해야 한다.

왜냐면 OOM_Killer에 의해 서버가 강제로 종료가 될 수도 있기 때문이다.

이때 볼 수 있는 건 sar와 /proc/meminfo라는 수단이 있다.

sar는 10분 단위로 로그를 찍기 때문에 사용률을 볼 수 있는 장점이 있다.

그러나 분석 하기에는 /proc/meminfo를 이용하면 더 좋을 수 도 있다.

 

/proc/meminfo에는 active와 inactive란 옵션이 있다.

Active, Active(anon), Active(file) 필요하거나 명시적인 요청이 없으면 회수되지 않는 최근에 사용된 메모리입니다. 
Active(anon)와 Active(file)의 합입니다
Active(anon) 스왑 지원 메모리를 추적합니다.
여기에는 개인 및 공유 익명 매핑과 쓰기 시 복사 후 개인 파일 페이지가 포함됩니다.
Active(file) 다른 파일 시스템 백업 메모리를 추적합니다.
Inactive, Inactive(anon), Inactive(file) 일반적으로 가장 먼저 회수되는 최근에 덜 사용된 메모리입니다.
Inactive(anon)와 Inactive(file)의 합계입니다.
Inactive(anon) 스왑 지원 메모리를 추적합니다.
여기에는 개인 및 공유 익명 매핑과 쓰기 시 복사 후 개인 파일 페이지가 포함됩니다.
Inactive(file) 다른 파일 시스템 백업 메모리를 추적합니다.

여기서 주목해야 될 것은 '최근에' 이다. 그 기준은 어떻게 될까?

 

그건 바로 LRU, Least Recently Used Algorithm을 이용해 관리 된다.

가장 오랫동안 참조 되지 않은 페이지를 교체하는 기법이다.

프로세스가 RAM에 접근할 때 마다 참조된 페이지에 대한 시간을 기록한다.

그렇다 보니 큰 오버헤드가 발생한다.

LRU를 보다 자세히 알아보고 싶으면 아래의 글을 참조하길 바란다.
https://dailylifeofdeveloper.tistory.com/355
https://j2wooooo.tistory.com/121

이 글을 읽다보면, Active와 Inactive는 시간이 아닌 호출을 기준으로 페이지 캐시를 없애는 작업을 한다고 생각할 수 있을 것이다.

 

그럼 active와 inactive는 사용된 메모리라는 기준으로 나뉘어진다.

그 기준을 보다 체감되게 말해보자면, 바로 메모리 부족현상이 일어나서, kswapd라는 커널 데몬이 동작할 때를 말한다.

kswapd는 시스템에 충분한 프리 페이지가 남아 있게 동작하는 데몬이다.
kswapd는 커널 스왑 타이머가 주기적으로 만료될 때를 기다리고 있다. 
타이머가 만료될 때마다, 스왑 데몬은 시스템의 프리 페이지 수가 너무 적지 않은지 확인한다.


그걸 판단하는 기준은 바로 free_pages_high라는 변수와 free_pages_low라는 변수를 이용해서 확인을 한다.
현재 스왑에 있는 페이지 수를 고려해서, 프리 페이지가 free_pages_high보다 크면 동작을 하지 않지만
그 반대인 경우( 심지어 free_pages_low 보다 작아지면), 아래와 같은 동작을 한다.
  • 버퍼 캐시와 페이지 캐시의 크기를 줄인다.
  • System V 공유 메모리 페이지를 스왑 아웃한다.
  • 페이지를 스왑 아웃하고 폐기한다.
현재 페이지의 개수는 nr_async_pages라는 카운트 값으로 유지된다.
이 값은 어떤 페이지가 스왑 파일에 씌어지기 위해 큐에 들어 갈 때마다 증가하고, 
스왑 장치에 완전히 씌어질 때마다 감소한다. 
https://wiki.kldp.org/Translations/html/The_Linux_Kernel-KLDP/tlk3.html

 

kswapd의 동작을 LRU와 엮어보자면, tail 부분에 있던 메모리가 해제가 되거나

swap 공간으로 이동을 하면서 메모리 확보를 한다.  

 

그리고 kswapd의 기능 중 하나는 free의 최소 영역을 확보하게 해준다.

커널 변수 중 vm.min_free_kbytes라는 것이 최소 유지해야 할 free 영역을 나타낸다.