포스트

[Linux] 메모리 관리

메모리 조회

메모리 정보를 알아보기 위해 free 명령어를 입력했을 때 출력되는 정보의 의미는 다음과 같습니다.

1
2
3
4
[root@localhost ~]# free -h
              total        used        free      shared  buff/cache   available
Mem:          7.6Gi       3.8Gi       1.3Gi        34Mi       2.5Gi       3.4Gi
Swap:            0B          0B          0B
  • Total: 시스템에 탑재된 전체메모리 용량입니다.
  • free: 표기 상 이용하지 않는 메모리입니다.
  • buff/cache: 버퍼 캐시또는 페이지 캐시를 이용하는 메모리로, free의 값이 부족해지면 커널에서 자동으로 해제합니다.
  • available: 실질적으로 사용가능한 메모리를 나타냅니다.

    • free 값의 공간이 부족해질 경우를 가정했을 때, buff/cache 메모리를 해제 후 사용가능한 메모리의 전체 양을 나타냅니다.

정리하면 buff/cache 메모리는 커널이 메모리가 남는 공간을 활용하여 캐시데이터로 사용하는 공간입니다. 일시적으로 사용하는 메모리 공간이기 때문에, 사용할 메모리가 부족해질 경우에는 커널에서 해당 메모리를 없애서 메모리 공간을 새로 할당하게됩니다.

free 명령어를 입력했을 때 출력되는 내용을 그림으로 나타내면 아래와 같습니다.

메모리 사용량이 증가하면 아래와 같이 메모리 사용량이 줄어들게 됩니다.

메모리 관리시스템은 메모리를 확보하기위해 커널 내부의 해제 가능한 메모리 영역을 해제합니다.

만약 확보할 메모리 영역이 없어 메모리 부족 현상이 나타날 경우(Out Of Memory), 시스템은 OOM Killer기능을 통해 프로세스를 강제로 종료하고 메모리를 확보합니다.

다만, 업무용 서버에서는 어떤 프로세스가 종료될지 모르기 때문에 OOM Killer 기능이 작동한다는 것은 큰 문제가 될 수 있습니다. 이를 방지하기위해 `sysctl`의 `vm.panic_on_oom` 파라미터를 변경하여 OOM Killer를 작동하지않고 시스템을 강제종료하도록 하는 경우도 있습니다.

가상 메모리

여러 OS에서 가상 메모리 기능을 사용하고 있습니다. 가상 메모리는 시스템에 탑재된 메모리를 프로세스가 직접 접근하지않고 가상 주소를 사용하여 간접적으로 접근하도록 하는 방식입니다. 가상 메모리를 사용할 경우 아래와 같은 이점을 얻을 수 있습니다.

  1. 메모리 단편화 해결
  • 프로세스를 생성, 삭제하는 과정에서 메모리 생성, 회수가 반복되면 메모리 사이사이에 빈 공간이 여러 개 생성되게됩니다. 이를 메모리 단편화라고 합니다. 이 빈 공간을 하나처럼 사용할 수 있을거라 생각할 수 있으나, 프로그램이 메모리를 획득할 때마다 메모리가 몇 개의 영역에 나누어져 있는지 확인해야하기 때문에 비효율적입니다. 가상주소를 사용하게되면 메모리를 어떤 구역에 생성하든, 메모리 정보를 읽기 위한 주소만 찾아가면 되기 때문에 메모리 단편화를 해결할 수 있습니다.
  1. 다른 프로세스의 메모리에 접근하지 못하도록 함
  • 가상 주소를 사용하지않고 단순하게 메모리 주소를 직접 지정하면 커널이나 다른 프로세스에서 사용하는 주소를 참조하는 상황이 발생할 수 있습니다. 이 방식은 데이터가 오염되거나 파괴될 위험성이 있고, 시스템이 정상적으로 동작할 수 없게될 수 있습니다. 가상 주소를 통해 다른 프로세스나 커널 메모리에 접근할 수 없도록 하여 안정성을 확보합니다.
  1. 여러 프로세스 관리 용이
  • 동일한 프로그램 2개를 동시에 구동한다고 가정하겠습니다, 해당 프로그램은 코드가 300번지, 데이터가 400번지에 배치되지 않으면 정상적으로 동작하지 않는 프로그램입니다. 만약 이 프로그램을 2개 가동하게된다면 두 프로그램 모두 300번지와 400번지의 주소를 참조하게되므로 두 프로그램이 다른 동작을 할 때 문제가 생기게 될 것입니다.
    단순한 메모리 할당 방식으로는 각 프로그램이 각자 동작할 주소가 겹치지 않도록 프로그래밍 할 때마다 주의해서 만들어야하기 때문에 번거롭고 비효율적입니다. 가상 주소를 사용하면 이러한 문제를 해결할 수 있습니다.
이 포스트는 저작권자의 CC BY 4.0 라이센스를 따릅니다.