12
9 부 . 부부부부부 부부부 부부 1~2 부 < 부부부 부부부 부부부 부부 부부부 > 부부부 부부부 - 부부부

Ch9 프로세스의 메모리 구조

Embed Size (px)

Citation preview

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 환경변수에 로깅할 파일명 지정▸ 프로그램 시작 / 종료▸ 결과로그로 메모리 누수 확인

텍스트

텍스트