free 명령
메모리는 커널이 제공하는 중요한 리소스 중 하나.
CPU 가 프로세스의 연산 과정에 필요한 리소스라면,
메모리는 프로세스가 연산할 수 있는 공간을 제공해 주는 리소스이다.
프로세스는 메모리라는 공간에 자신이 필요한 함수를 넣어 두거나 변수에 값을 저장하거나 하는 방식으로 연산을 위한 공간을 확보하고 작업을 진행한다.
메모리가 부족하다면 프로세스는 더 이상 연산을 위한 공간을 확보할 수 없고, 이는 시스템 응답 불가 현상 또는 큰 성능 저하를 일으킬 수 있다.
1. 메모리 사용량 확인하기
free : 리눅스 시스템에서 메모리의 전체적인 현황을 가장 빠르게 살펴볼 수 있는 명령어
free 명령은 현재 시스템의 메모리 사용량에 관한 종합적인 정보를 보여준다.
전체 메모리 용량과, 사용 중인 용량, 그리고 buffers 와 cached 로 명명되는 캐싱 영역의 용량을 확인하는 데 사용된다.
왼쪽에서 오른쪽으로 차례로,
- 전체 메모리 양.
- 시스템에서 사용하고 있는 메모리 양.
- 아직 사용하고 있지 않는 메모리 양
- 프로세스 사이에 공유되고 있는 메모리 양.
- 버퍼 용도로 사용하고 있는 메모리의 양.
- 프로세스가 사용하는 메모리 영역이 아니고 시스템의 성능 향상을 위해서 커널에서 사용하고 있는 영역.
- 페이지 캐시라고 불리는 캐시 영역에 있는 메모리 양.
- I/O 관련 작업을 빠르게 진행하기 위해 커널에서 사용하고 있는 영역.
2. buffers 와 cached 영역
커널은 블록 디바이스라고 부르는 디스크로부터 데이터를 읽거나 사용자의 데이터를 디스크에 저장한다.
하지만 디스크는 다른 장치들에 비해 매우 느리기 떄문에 디스크에 대한 요청을 기다리는 시간이 상당히 많이 소요되고,
이로 인해 시스템에 부하가 일어나기도 한다.
커널은 이렇게 상대적으로 느린 디스크에 대한 요청을 좀 더 빠르게 하기 위해 메모리의 일부를 디스크 요청에 대한 캐싱 영역에 할당해서 사용한다. 즉, 한 번 읽은 디스크의 내용을 메모리에 저장해 두어서, 동일한 내용을 읽고자 하면 디스크로 요청하지 않고 메모리로 요청하게 된다.
이러한 캐싱 기능을 통해서 커널은 다수의 디스크 요청을 좀 더 빠르게 처리할 수 있다.
그리고 이 때 사용되는 캐싱 영역을 buffers, cached 라고 부른다.
1. buffers 와 cached 의 차이
Page Cache 와 Buffer Cache 가 사용되는 과정
커널은 블록 디바이스에서 데이터를 읽을 때 데이터가 위치한 특정 블록의 주소를 넘겨주고,
블록 디바이스는 해당 블록 주소의 데이터를 커널에 전달한다.
커널이 읽어야 할 데이터가 파일의 내용이라면 커널은 bio 구조체를 만들고 해당 구조체에 Page Cache 용도로 할당한 메모리 영역을 연결해준다. 그리고 bio 구조체는 디바이스 드라이버와 통신해서 디스크로부터 데이터를 읽어서 Page Cache에 파일의 내용을 채운다.
super block, inode block 처럼 파일의 내용이 아닌 파일 시스템을 관리하기 위한 메타 데이터를 읽어올 때는 bio 구조체를 사용하지 않고 _get_blk( ) 와 같은 내부 함수를 통해 블록 디바이스와 직접 통신한다. 그리고 이 때 가져온 블록 디바이스의 특정 블록 내용을 Buffer Cache에 정리해둔다.
정리하자면,
Page Cache 는 파일의 내용을 저장하고 있는 캐시.
Buffer Cache는 파일 시스템의 메타 데이터를 담고 있는 블록을 저장하는 캐시.
그리고 각각이 free 에서 표현하고 있는 cached, buffers 영역 이다.
서버의 운영 기간이 길어질 수록 관리를 재대로하지 않는다는 가정하에 (1), (2), (3), (4) 의 흐름을 거친다.
(1) 서버의 운영 기간이 그기 길지 않을 때.
(2) 시간이 지나면 커널은 가용 영역 중 일부를 Cache 영역으로 사용하게 된다.
(3) 그리고, 시간이 흐를수록 애플리케이션에서 사용하게 되는 영역이 점점 넓어진다.
어느 순간까지는 가용 영역의 메모리를 가져다가 사용하게 될 것이다.
(4) Cache 영역이 충분히 있어야 I/O 성능 향상의 효과를 받을 수 있기 때문이다. 하지만, 사용 영역이 점점 더 커져서 일정 수준 이상이 되면 커널은 Cache 영역으로 사용하던 영역을 애플리케이션이 사용할 수 있도록 메모리 관리 시스템에 반환한다.
- (3)번에 비해 Cache 영역이 줄고 애플리케이션의 사용 영역이 늘어난다. 이런 과정을 거치다 보면 더 이상 반환할 메모리도 없고 가용할 메모리가 없는 순간이 발생하게 되는데, 시스템은 이때부터 swap 이라는 영역을 사용하게 되고 시스템의 줄어든다.
이처럼 buffers 와 cached 영역은 시스템의 I/O 성능 향상을 위해서 커널이 사용하는 영역이다. 메모리가 부족한 상황이 되면 커널은 해당 영역을 자동으로 반환하기 때문에 free 명령에서도 해당 영역을 제외한 영역을 실제 사용 가능한 영역으로 계산하게 된다.
(추가 작성 중)
Reference
- DevOps와 SE를 위한 리눅스 커널 이야기
- 강진우, DevOps와 SE를 위한 리눅스 커널 이야기, 인사이트, 2017, Chapter01
'OS > Linux Server' 카테고리의 다른 글
[Shell Programming] 오래된 로그 삭제 (0) | 2022.11.13 |
---|---|
[리눅스커널이야기] Load Average 와 시스템 부하 (0) | 2022.07.26 |
[리눅스커널이야기] top 을 통해 살펴보는 프로세스 정보들(2) (0) | 2022.07.26 |
[Linux] 01. 운영체제의 구조와 특징 (0) | 2022.05.23 |
[리눅스커널이야기] top 을 통해 살펴보는 프로세스 정보들 (0) | 2022.04.07 |