9부. 프로세스의 메모리
구조
1~2장
<실무로 배우는 시스템 성능 최적화>
아꿈사 스터디 - 정민철
텍스트
기본방향
▸메모리로 인해 일어나는 문제
▸프로세스 비정상 종료: segment fault, 메모리 부족
▸성능저하: GC 자주 발생, 캐시적중률 저하, 자주 메모리 Swap 발생
▸프로세스 메모리 확인 시 중점 체크 항목
▸사용량: 대량 메모리 사용 프로세스, 영역별 메모리 사용 구조
▸메모리 누수 여부: 시간에 따른 지속적인 증가, Full GC 후 힙 메모리
사용 지속적 증가
▸코어덤프 발생 여부: 코어덤프 발생 여부 및 이유
텍스트
프로세스 메모리 구조
▸가상 메모리 체계
▸동일 메모리 주소 범위 사용
▸다른 프로세스 메모리 침범 예방
▸Kernel Spece
▸kernel 기본 기능, 확장기능, device driver memory
▸모든 프로세스가 공유해서 사용
▸User Space
▸사용자 모드의 프로그램이 동작하는 영역
텍스트
프로세스 메모리 영역 분
류
▸ TEXT (R) : 실행코드
▸ DATA (R, R/W): 전역변수, 정적변수
▸ BSS: 초기화되지 않은 전역변수, 정
적변수
▸ HEAP (R/W): 동적 메모리 할당
▸ STACK (R/W): 함수호출 정보
텍스트
프로세스 영역별 메모리 사용량 확인
▸AIX: svmon -p [pid]
▸HP-UX: pmap [pid]
▸Solaris: pmap -x [pid]
▸Linux: cat /proc/[pid]/status
▸Windows: vmmap.exe
텍스트
LINUX PROCESS
MEMORY▸ VmPeak: 할당된 가상 메모리 최대값
▸ VmSize: 할당된 전체 가상 메모리 크기
▸ VmLck: 락된 메모리 크기
▸ VmPIN: 고정 메모리 크기(스왑 불가)
▸ VmHWM: 물리메모리 최대 할당 크기
▸ VmData: 힙 영역 크기
▸ VmRSS: 물리메모리 할당 크기
▸ VmStk: 스택 메모리 크기
▸ VmExe: 전역 변수와 실행코드 메모리 크기
▸ VmLib: 공유 라이브러리 메모리 크기
▸ VmPTE: 페이지 테이블 엔트리 크기
▸ VmSwap: 사용된 페이징 스페이스 크기
텍스트
메모리 누수 조사
▸메모리누수: 프로세스 메모리 사용량이 지속적 증가하는 현상
▸급격한 성능저하 및 다운 원인: 물리 메모리 부족으로 인한 스와핑
▸정기적으로 프로세스를 재기동해 메모리 사용량 초기화
▸원인
▸할당한 힙 메모리 미해제: malloc / new => free / delete
▸내부 캐시영역에 데이터 지속적 증가
▸free시 즉시 메모리 해제하지 않음 => 할당한 메모리 재활용 위함
▸메모리 누수는 지속적으로 증가하는 패턴을 가지고 있는지 확인 필요
텍스트
메모리 누수 조사방법
▸Windows: umdh.exe(User Mode Dump Heap) 활용
▸AIX: 메모리 디버거, probevue(메모리 추적도구) 사용
▸Solaris: 메모리 디버거, dtrace(메모리 추적도구) 사용
▸HP-UX: WDB 도구 이용
▸Linux: valgrid, heap checker 도구 이용
▸정적분석도구를 이용한 소스코드 체크
텍스트
LINUX - VALGRIND
▸에뮬레이션 환경에서 프로세스 수행해서 메모리 누수 체크
▸성능이 현저히 저하됨
▸체크방법
▸valgrind 환경에서 체크대상 프로그램 실행
$ valgrind —leak-check=full —trace-children=yes
—log-file=m%p.log [process cmd]
▸대상 프로그램 종료 => 메모리 누수 요약정보 로그 생성
텍스트
LINUX - TCMALLOC (HEAP CHECKER)
▸malloc/free function을 hooking해서 메모리 누수 모니터링
▸홈페이지: https://github.com/gperftools/gperftools
▸수행 방법
▸라이브러리 설정
1. compile 시 tcmalloc lib.을 linking해서 수행
2. compile안한 binary 실행 시 LD_PRELOAD에서 libtcmalloc.so 지정
▸HEAPPROFILE 환경변수에 로깅할 파일명 지정
▸프로그램 시작/종료
▸결과로그로 메모리 누수 확인
텍스트
텍스트

Ch9 프로세스의 메모리 구조

  • 1.
    9부. 프로세스의 메모리 구조 1~2장 <실무로배우는 시스템 성능 최적화> 아꿈사 스터디 - 정민철
  • 2.
    텍스트 기본방향 ▸메모리로 인해 일어나는문제 ▸프로세스 비정상 종료: segment fault, 메모리 부족 ▸성능저하: GC 자주 발생, 캐시적중률 저하, 자주 메모리 Swap 발생 ▸프로세스 메모리 확인 시 중점 체크 항목 ▸사용량: 대량 메모리 사용 프로세스, 영역별 메모리 사용 구조 ▸메모리 누수 여부: 시간에 따른 지속적인 증가, Full GC 후 힙 메모리 사용 지속적 증가 ▸코어덤프 발생 여부: 코어덤프 발생 여부 및 이유
  • 3.
    텍스트 프로세스 메모리 구조 ▸가상메모리 체계 ▸동일 메모리 주소 범위 사용 ▸다른 프로세스 메모리 침범 예방 ▸Kernel Spece ▸kernel 기본 기능, 확장기능, device driver memory ▸모든 프로세스가 공유해서 사용 ▸User Space ▸사용자 모드의 프로그램이 동작하는 영역
  • 4.
    텍스트 프로세스 메모리 영역분 류 ▸ TEXT (R) : 실행코드 ▸ DATA (R, R/W): 전역변수, 정적변수 ▸ BSS: 초기화되지 않은 전역변수, 정 적변수 ▸ HEAP (R/W): 동적 메모리 할당 ▸ STACK (R/W): 함수호출 정보
  • 5.
    텍스트 프로세스 영역별 메모리사용량 확인 ▸AIX: svmon -p [pid] ▸HP-UX: pmap [pid] ▸Solaris: pmap -x [pid] ▸Linux: cat /proc/[pid]/status ▸Windows: vmmap.exe
  • 6.
    텍스트 LINUX PROCESS MEMORY▸ VmPeak:할당된 가상 메모리 최대값 ▸ VmSize: 할당된 전체 가상 메모리 크기 ▸ VmLck: 락된 메모리 크기 ▸ VmPIN: 고정 메모리 크기(스왑 불가) ▸ VmHWM: 물리메모리 최대 할당 크기 ▸ VmData: 힙 영역 크기 ▸ VmRSS: 물리메모리 할당 크기 ▸ VmStk: 스택 메모리 크기 ▸ VmExe: 전역 변수와 실행코드 메모리 크기 ▸ VmLib: 공유 라이브러리 메모리 크기 ▸ VmPTE: 페이지 테이블 엔트리 크기 ▸ VmSwap: 사용된 페이징 스페이스 크기
  • 7.
    텍스트 메모리 누수 조사 ▸메모리누수:프로세스 메모리 사용량이 지속적 증가하는 현상 ▸급격한 성능저하 및 다운 원인: 물리 메모리 부족으로 인한 스와핑 ▸정기적으로 프로세스를 재기동해 메모리 사용량 초기화 ▸원인 ▸할당한 힙 메모리 미해제: malloc / new => free / delete ▸내부 캐시영역에 데이터 지속적 증가 ▸free시 즉시 메모리 해제하지 않음 => 할당한 메모리 재활용 위함 ▸메모리 누수는 지속적으로 증가하는 패턴을 가지고 있는지 확인 필요
  • 8.
    텍스트 메모리 누수 조사방법 ▸Windows:umdh.exe(User Mode Dump Heap) 활용 ▸AIX: 메모리 디버거, probevue(메모리 추적도구) 사용 ▸Solaris: 메모리 디버거, dtrace(메모리 추적도구) 사용 ▸HP-UX: WDB 도구 이용 ▸Linux: valgrid, heap checker 도구 이용 ▸정적분석도구를 이용한 소스코드 체크
  • 9.
    텍스트 LINUX - VALGRIND ▸에뮬레이션환경에서 프로세스 수행해서 메모리 누수 체크 ▸성능이 현저히 저하됨 ▸체크방법 ▸valgrind 환경에서 체크대상 프로그램 실행 $ valgrind —leak-check=full —trace-children=yes —log-file=m%p.log [process cmd] ▸대상 프로그램 종료 => 메모리 누수 요약정보 로그 생성
  • 10.
    텍스트 LINUX - TCMALLOC(HEAP CHECKER) ▸malloc/free function을 hooking해서 메모리 누수 모니터링 ▸홈페이지: https://github.com/gperftools/gperftools ▸수행 방법 ▸라이브러리 설정 1. compile 시 tcmalloc lib.을 linking해서 수행 2. compile안한 binary 실행 시 LD_PRELOAD에서 libtcmalloc.so 지정 ▸HEAPPROFILE 환경변수에 로깅할 파일명 지정 ▸프로그램 시작/종료 ▸결과로그로 메모리 누수 확인
  • 11.
  • 12.