먼저 free 명령어 결과가 아래 사진과 다르다면 이 글이 아니라 2021.06.12 - [CentOS 7] 메모리 사용률 계산 을 보기를 추천한다. 이 글 내의 OS나 free 버전보다 최신 버전을 사용하고 있을 수 있다.
free 실행 결과를 이용해서 메모리 사용 비율을 계산하는데 이상한 점을 발견했다. 메모리를 크게 사용하는 프로세스가 없는데 메모리 사용률이 90%를 넘은 것이다.
이유를 몰라 원인을 찾던 중에 리눅스는 성능 향상을 위해 사용하지 않는 메모리 일부를 캐시 영역으로 할당해둔다는 것을 알았다. Mem 행의 used 값은 캐시 영역을 포함한 메모리 사용량을 나타낸 것이었다.
Mem 행에서 각 속성이 의미하는 바를 정리하면 다음과 같다.
total | 현재 시스템에 설치되어 있는 전체 메모리 용량 total = used + free |
used | 캐시 영역을 포함하여 사용 중인 메모리 용량 |
free | 사용하지 않는 메모리 용량 |
shared | 프로세스 간 통신에 사용되는 메모리 옹량 |
buffers | buffer cache로 할당된 메모리 용량 |
cached | page cache로 할당된 메모리 용량 |
그러면 여기서 남은 메모리 양인 free 용량이 앞으로 사용할 수 있는 메모리 용량인가?
그건 또 아니다.
프로세스가 메모리를 필요로 하는 경우, 시스템이 캐시 영역으로 할당된 메모리 용량을 줄이기 때문이다.
그래서 일반적으로 used 용량은 명목 메모리 사용량이라고 보고, 캐시 영역으로 할당된 용량을 제외한 나머지를 실제 메모리 사용량이라고 본다.
그리고 실제 메모리 사용량과 사용 가능한 메모리 양은 -/+ buffers/cache 행의 used와 free에 표시되어 있다. (물론 Mem 행 값을 이용해 계산할 수도 있다.)
즉, 아래 사진처럼 정리할 수 있다.
이 정보를 바탕으로 메모리 사용비율을 계산해본다.
명목 메모리 사용률
명목 메모리 사용량
실질 메모리 사용량과 캐시 영역을 포함한 메모리 사용량을 더한 양
공식
$$ \mbox{nominal_usage} = \frac{\mbox{used}}{\mbox{total}} * 100(\%) $$
계산 명령어
free | grep ^Mem | awk '{printf "nominal_usage=%s, total=%s, nominal_usage_ratio=%.2f%% \n", $3, $2, ($3)*100/$2}'
실질 메모리 사용률
실질 메모리 사용량
캐시 영역을 제외한 메모리 사용량
공식
- Mem 행을 이용해 계산
$$ \mbox{actual_usage} = \frac{\mbox{used - buffers - cached}}{\mbox{total}} * 100(\%) $$
- -/+ buffers/cache 행을 이용해 계산
$$ \mbox{actual_usage} = \frac{\mbox{used}}{\mbox{used+free}} * 100(\%) $$
계산 명령어
# Mem 행을 이용해 계산
free | grep ^Mem | awk '{printf "actual_usage=%s, total=%s, actual_usage_ratio=%.2f%% \n", $3-$6-$7, $2, ($3-$6-$7)*100/$2}'
# -/+ buffers/cache 행을 이용해 계산
free | grep ^-/+ | awk '{printf "actual_usage=%s, total=%s, actual_usage_ratio=%.2f%% \n", $3, $3+$4, $3*100/($3+$4)}'