IT/OS&Middleware

[os] 서버 OS 모니터링-Memory

Hayley Shim 2023. 10. 29. 00:23

안녕하세요. 서버 OS 모니터링을 공부하기 위해 ‘실무로 배우는 시스템 성능 최적화’ 책 내용을 참고하여 관심있는 내용 위주로 정리했습니다.

 

메모리 사용률은 100%라도 부족하지 않으면 성능 저하가 발생하지 않는다. 그럼 메모리 성능은 어떤 기준으로 판단할까?

운영체제 측면의 메모리 부족 여부와 성능 영향도는 페이징스페이스에 대한 스왑 발생 여부로 판단한다. 그밖의 메모리는 각 소프르웨어 솔루션의 메모리 사용 방식을 이해하고 성능을 분석하는 작업이 필요하다.

  • 자바 기반 솔루션 : 설정한 최대 힙 메모리 이상을 사용하지 않기 때문에 최대 힙 메모리가 운영체제의 메모리를 넘기지 않도록 설정했다면 운영체제의 메모리 부족이 발생할 가능성은 낮다. 하지만 한정된 힙 메모리 내에서 동작하기 때문에 대량으 데이터 처리와 빈번한 GC로 인한 성능 저하가 유발될 가능성이 있다. OS 메모리 용량이 많아 힙 메모리를 과하게 크게 설정한 경우에는 메모리를 청소하는 GC 작업으로 순간 순간 멈추는 시간이 길어져 서비스 안정성이 떨어질 수도 있다.
  • 데이터베이스 : 디스크에서 데이터를 읽어옮으로써 발생하는 성능 저하를 개선하기 위해 메모리에 최근에 사용한 데이터 블록을 캐시해서 재사용하는 알고리즘이 있다. 캐시의 메모리 크기가 너무 작게 설정된 경우 캐시 적중률이 떨어져 디스크에서 데이터 블록을 읽어와야 하는 빈도가 늘어나 성능 저하를 유발할 수 있다.

가상 메모리

설치할 수 있는 메인 메모리에 한계가 있고 예상치 못하게 메모리 사용량이 증가할 수 있기 때문에 디스크의 일정 공간을 할당해 보조 메모리 용도로 사용하는데 이를 페이징스페이스라고 한다.

가상 메모리 구조

메인 메모리(주기억장치)와 디스크의 페이징스페이스(보조 기억장치)를 묶어 하나의 메모리처럼 동작하게 함으로써 메인 메모리 한계를 넘는 메모리 사용을 가능하게 하는 것이다.

[참고] 짧게 개념만 이해하는! 가상 메모리 구조

  • 페이지(Page) : 프로세스가 사용하는 메모리는 정체가 메인 메모리에 있는 것이 아니라 일부는 페이징스페이스에도 있다. 운영체제에서 관리하는 메모리 엑세스 단위를 페이지(Page)라고 하며 통상 4KB 단위이다. 이 페이지 단위로 일부는 메인 메모리에 있을 수도 있고 일부는 페이징스페이스에 있을 수도 있다.
  • 스와핑 : 프로세스 내에서 사용 중인 가상 메모리 주소만 봐서는 해당 페이지가 메인 메모리에 있는지 페이징 스페이스에 있는지 확인할 수 없다. 메인 메모리의 입출력 속도가 디스크와 비교가 안될 정도로 우수하기 때문에 프로세스가 기동되면 기본적으로는 메인 메모리를 사용하다가 부족해지면 페이징스페이스를 사용하게 된다. 이때도 CPU가 페이징스페이스에 있는 데이터를 메인 메모리처럼 바로 사용할 수 있는 것이 아니라 사용 빈도가 낮은 프로세스의 메인 메모리 사용 부분을 페이징스페이스 부분으로 옮겨 여유 메모리를 확보한 후 사용할 페이징스페이스 부분을 메인 메모리로 로드해서 사용하는데 이를 스와핑이라고 한다.

CPU가 직접 접근할 수 있는 메인 메모리를 활성 가상 메모리(Active virtual memory)라 하고 페이징스페이스를 비활성 가상 메모리(Inactive virtual memory)라 한다.

가상 메모리 주소는 프로세스 내에서만 유효한 주소다. 각 프로세스는 가상 메모리 주소와 실제 주소 간의 매핑 테이블을 가지고 있어 가상 메모리 주소로 실제 주소를 찾아갈 수 있게 된다. 실제 주소는 메인 메모리와 페이징스페이스의 주소를 가리킨다.

메모리 관련 주요 용어

페이징스페이스(Pagingspace)

  • 메인 메모리가 부족할 때 사용하는 디스크 공간. 스왑 스페이스(swap space)라고도 함. 운영체제가 메인 메모리 크기 이상의 메모리를 사용할 수 있게 해주는 역할을 함.
  • 그러나 시스템 성능 관점에서 보면 페이징스페이스는 디스크에 프로세스 메모리를 쓰고 읽는 스와핑 작업으로 인해 메모리 접근만으로 처리될 때에 비해 큰 성능 저하가 발생한다. 따라서 스와핑이 발생하지 않도록 메모리 여유율을 유지하는 것이 성능에 중요하다.
# 페이징스페이스 크기 확인
$ swapon -s
$ cat /proc/swaps

페이징(Paging)

  • 가상 메모리 체계에서 운영체제가 인식하는 일정한 크기(4KB, 64KB)의 데이터 기록 단위를 페이지라고 함
  • 메인 메모리로부터 한 페이지의 데이터를 보조 기억장치(디스크)로 복사하거나 보조 기억장치로부터 메인 메모리로 로드하는 것을 페이징이라고 한다.
# 메모리 페이지 크기 확인
$ getconf PAGESIZE

스와핑(Swapping)

  • 메모리에서 페이지 혹은 세그먼트 단위 데이터를 교환하는 것
  • 컴퓨터가 메모리보다 큰 프로그램을 실행하거나 메모리보다 큰 데이터 파일을 다룰 수 있게 한다. 가상 메모리 체계에서는 페이징 기법을 이용해 스와핑을 수행한다. 스와핑은 프로세스가 사용하는 메모리 일부를 페이징스페이스로 옮기거나 페이징스페이스로부터 메모리로 로드하는 것을 가리킨다.

페이지 부재(Page Fault)

  • 페이징 방식의 가상 메모리에서 CPU가 사용하려는 페이지가 메인 메모리에 없는 경우다. 사용하려는 가상 메모리 주소에 해당하는 페이지를 매핑 테이블에서 주소 변환할 때 해당 페이지가 메인 메모리에 없다고 표시돼 있으면 페이지 부재가 발생한다. 이 경우 해당 페이지를 디스크에 있는 파일 또는 페이징스페이스 가져와야 하고 메인 메모리가 부족한 경우에는 다른 페이지와 교체해야 한다.

페이지 인(Page In)

  • 가상 메모리에서 페이지 부재가 일어났을 때 디스크에 있는 프로그램이나 데이터를 메모리로 로드 하는 것

페이지 아웃(Page Out)

  • 가상 메모리에서 페이지 부재가 발생했을 때 메모리가 부족하면 페이지 스틸러(Page Stealer)는 기존 메모리를 디스크로 기록하는 페이지 아웃이라는 작업을 수행한다. 기록 대상 메모리가 프로세스의 작업 세그먼트 영역에 있는 메모리면 페이징스페이스로 기록하고 파일에서 읽어 들인 내용인 경우 페이지의 내용이 변경됐으면 디스크의 해당 파일에 기록하고 그렇지 않으면 소멸시킨다.

[참고] Page-in/out, Swap-in/out

페이지 스캔률(Page Scan Rate)

  • 운영체제는 일정량의 여유 페이지를 확보해서 필요할 경우 즉시 제공하기 위해 페이지 스캔이라는 검색을 통해 해제함으로써 여분으로 확보할 페이지를 찾는다. 여유 페이지 목록 임계치보다 여유 페이지 수가 줄어들면 메모리 관리자는 기존의 페이지 인된 것 중에서 LRU 알고리즘 검색을 통해 페이지 아웃이 가능한 것을 찾아 페이지 아웃시킨 후 여유 페이지로 변경한다. 여기서 페이지 아웃이 가능한 페이지를 탐색하는 빈도를 의미하는 페이지 스캔률이 나오는데 빈도가 높다는 것은 해제할 페이지가 넉넉하지 못하기 때문에 자주 메모리를 탐색해야 한다는 의미로 볼 수 있다.

사용량 분석

서버 메모리는 용도에 따라 파일 캐시, IPC, 프로세스 메모리로 나뉜다.

안정적인 운영을 위한 메모리 판단 기준
1. 메모리 사용률 : 100% 이하
2. 지속적으로 프로세스 스와핑이 발생하면 메모리 부족
(페이지 스캔률이 지속적으로 발생하면서 페이지 아웃이 발생하는 상태)
# CPU와 메모리를 모니터링할 수 있는 명령어
$ vmstat

파일 캐시

  • 운영체제에서 디스크 입출력 성능 개선을 위해 사용한 파일을 메모리 상에 캐시해 디스크 입출력을 줄이는 것
  • 파일 캐시에서 성능상 문제가 생기는 것은 캐시를 전체 운영체제 메모리 대비 너무 많이 사용함으로써 프로세스가 사용할 메모리가 부족한 상황이 발생한 것
  • DB 서버 : 데이터 버퍼라는 내부 캐시가 있어 운영체제 파일 캐시를 크게 설정할 필요가 없고 Raw device를 사용한다면 파일 캐시를 사용하지 않으므로 설정해도 성능 개선이 되지 않는다. 오히려 메모리 부족 현상으로 DB 사용 메모리가 페이징스페이스로 내려가는 상황이 발생하면 급격한 성능 저하가 발생한다.
  • WAS 서버 : 파일 캐시에 의한 성능에 큰 영향을 미치지 않는다. 파일 캐시는 전체 메모리 대비 최대 크기를 30% 이하로 유지하는 것을 권고한다.
# 파일 캐시 확인 명령
$ /proc/sys/vm/buffermem
$ free -m

IPC(Inter Process Communication)

  • 프로세스 간에 데이터를 공유하거나 통신할 때 사용하는 여러 방식을 통칭하는 용어.
  • 프로세스 간 메시지 전송, 동기화, 데이터 공유, 원격 프로시저 호출 용도로 분류해 파일, 파이프, 소켓, 메시지 큐, 세마포어, 공유 메모리, 메모리 맵드 파일 등이 있다. 이 가운데 대표적으로 프로세스 메모리와 분리되어 메모리를 사용하는 대표적인 IPC가 메시지 큐, 세마포어, 공유메모리다.
# 메모리 사용량 확인 명령
$ ipcs -a

프로세스

  • 파일 캐시와 IPC용으로 사용 중인 메모리를 제외하면 대부분은 프로세스가 직접 사용하는 메모리다.
  • 오라클 DB으 경우, IPC인 공유 메모리를 사용하는 SGA(System Global Area)가 가장 많은 메모리를 사용하겠지만 그에 못지 않게 개별 DB 처리 프로세스가 사용하는 PGA(Program Global Area) 메모리 사용량이 많다.
# 프로세스 메모리 사용량 확인
$ ps -euf
$ ps -e -orss=,size=,args=

메모리 확인

# 서버의 메인 메모리 총량을 확인하는 명령어
$ cat /proc/meminfo

 

 

blog migration project

written in 2023.3.11

https://medium.com/techblog-hayleyshim/os-%EC%84%9C%EB%B2%84-os-%EB%AA%A8%EB%8B%88%ED%84%B0%EB%A7%81-memory-4fe78e6d1691

'IT > OS&Middleware' 카테고리의 다른 글

[os] 서버 OS 모니터링-Disk  (0) 2023.10.29
[os] 서버 OS 모니터링-CPU  (0) 2023.10.29
[os] eBPF  (0) 2023.10.29