Upload
minchul-jung
View
286
Download
0
Embed Size (px)
Citation preview
텍스트
기본방향▸ 메모리로 인해 일어나는 문제
▸ 프로세스 비정상 종료 : 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 환경변수에 로깅할 파일명 지정▸ 프로그램 시작 / 종료▸ 결과로그로 메모리 누수 확인