시스템 최적화 전문가의 15년 노하우를 4년간 정리!
이 책은 시스템 최적화 전문가가 15년간의 실무 경험을 바탕으로 4년간의 노력 끝에 완성한, 시스템 운영자와 애플리케이션 개발자를 대상으로 한 성능 개선에 대한 종합적이고 체계적인 가이드이다. 저자가 실제 경험한 성능 개선 사례를 통해 프로젝트에서 발생하는 성능 저하 유형과 분석 기법을 설명한다.
★ 이 책에서 다루는 내용 ★
- 프로젝트에서 발생하는 성능 저하 유형과 분석 기법
- 성능 개선 분석 기법과 다양한 프리웨어 및 오픈소스 지원 도구를 소개
- 다양한 기반 인프라에 대한 지식
- 시스템 이해를 위한 HTTP, 프로세스, 운영체제, 네트워크 등에 대한 기본 지식
- SDPA, MAT, Scouter, Wireshark 등 각종 도구에 대한 설명
권문수
부산대학교를 졸업하고 1996년부터 LG CNS에 근무하면서 15년간 시스템 문제해결 및 성능 개선 전문가로 활동하고 있다. 카드, 보험, 은행 등 다수의 금융 차세대 구축 프로젝트에서 성능 개선을 담당했으며, 공공 서비스, 국방, 공장 자동화, 교통, 통신, 물류 등 다양한 분야에 대한 성능 개선 경험을 보유하고 있다. 성능 개선 노하우를 바탕으로 오픈소스 APM 도구인 스카우터(Scouter)의 개발자로도 참여하고 있다.
- [1부] 성능 기초
- ▣ 1장: 성능이란?
- 1.1 동시 사용자
- 1.2 처리량
- 1.3 응답시간
- 1.4 자원
- 1.4.1 적정성
- 1.4.2 효율성
- 1.4.3 안정성
- 1.4.4 가용성
- 1.4.5 확장성
- ▣ 2장: 성능 특성
- 2.1 성능 곡선
- 2.2 성능에 대한 이해
- ▣ 3장: 성능 이론
- 3.1 기초 성능 이론
- 3.2 사용률 이론
- 3.3 비율 분석
- ▣ 4장: 성능 테스트
- 4.1 성능 테스트 유형
- 4.2 성능 테스트 구성 요소
- 4.3 성능 테스트 시 주의사항
- 4.3.1 테스트 데이터
- 4.3.2 화면 처리시간
- 4.3.3 네트워크
- 4.3.4 가상 사용자 특성
- 4.3.5 업무 시나리오
- 4.3.6 대상 업무와 성능 개선
- ▣ 1장: 성능이란?
- [2부] 성능 개선
- ▣ 1장: 기본 자세
- ▣ 2장: 성능 분석 시작하기
- 2.1 애플리케이션 서버 응답시간 분석
- 2.2 클라이언트 응답시간 분석
- ▣ 3장: 상황별 분석 단계
- 3.1 화면 응답시간 저하
- 3.2 시스템 내 응답시간 저하
- 3.3 서비스 멈춤 현상
- 3.4 시스템 전반에 걸친 성능 개선
- 3.5 서버 자원 사용량 확인
- 3.6 CPU 과다 사용 분석
- 3.7 메모리 과다 사용 분석
- 3.8 디스크 과다 사용 분석
- ▣ 4장: 개선 방향성
- ▣ 1장: 기본 자세
- [3부] 화면 응답시간 분석
- ▣ 1장: 기본 방향
- ▣ 2장: HTTP의 이해
- 2.1 프로토콜 구조
- 2.2 HTTP 요청
- 2.3 HTTP 응답
- 2.4 데이터 송수신
- ▣ 3장: 화면 응답시간 모니터링
- 3.1 화면 응답시간 모니터링 도구
- 3.2 인터넷 익스플로러 프로파일링
- 3.3 피들러
- 3.4 HTTP 분석 접근
- ▣ 4장: 웹 기반 시스템 성능 개선
- 4.1 화면 콘텐츠 구성
- 4.1.1 콘텐츠 수 축소
- 4.1.2 크기별 이미지 준비
- 4.1.3 이미지 콘텐츠 파일의 크기 축소
- 4.1.4 CDN 사용
- 4.1.5 텍스트 콘텐츠의 크기 축소
- 4.1.6 압축 적용
- 4.1.7 웹 가속기
- 4.2 캐시 동작
- 4.2.1 브라우저 캐시
- 4.3 병렬/비동기 처리
- 4.3.1 네트워크 연결 증가
- 4.3.2 AJAX와 DOM을 이용한 비동기 처리
- 4.4 기타 성능 개선
- 4.5 웹 서버 설정
- 4.5.1 최대 병렬 처리 수
- 4.5.2 Keepalive
- 4.1 화면 콘텐츠 구성
- ▣ 5장: 웹 서버 모니터링
- 5.1 웹 요청 응답시간 모니터링
- 5.2 웹 서버 성능 모니터링
- ▣ 6장: HTTPS
- ▣ 1장: 기본 방향
- [4부] 프로세스 이해하기
- ▣ 1장: 기본 방향
- ▣ 2장: 수행 중인 코드
- 2.1 스택에 대한 이해
- 2.2 스택 정보를 이용한 성능 분석
- 2.2.1 스택 대기 분석
- 2.2.2 교착상태
- 2.2.3 스택 성능 분석
- 2.3 스택 수집
- 2.4 프로세스 스택 분석 도구
- 2.4.1 환경설정
- 2.4.2 주요 기능 설명
- 2.4.3 SDPA를 이용한 성능 분석
- ▣ 3장: 통신/파일 상태
- 3.1 파일 지시자의 이해
- 3.2 연계 통신/파일 상태 정보를 수집하는 방법
- ▣ 4장: 통신/파일 간 동작
- 4.1 시스템 콜에 대한 이해
- 4.2 통신/파일 상태와 동작 연계 분석
- 4.3 스택 정보와 통신/파일 간 동작 연계 분석
- 4.4 통신/파일 간 동작 모니터링 방법
- ▣ 5장: 기타
- 5.1 프로그램 소스코드 보기
- 5.2 바이너리 코어 덤프에서 자바 스택이나 힙 정보를 추출하는 방법
- 5.3 프로세스의 현재 작업 디렉터리를 확인하는 법
- 5.4 프로그램에서 사용하는 공유 라이브러리 확인
- 5.5 프로세스 생성 관계 보기
- 5.6 프로세스의 수행 환경 확인
- ▣ 1장: 기본 방향
- [5부] 소스코드 최적화
- ▣ 1장: 기본 방향
- ▣ 2장: 불필요한 작업 제거
- 2.1 로깅
- 2.1.1 잘못 사용된 로깅 수준
- 2.1.2 로깅을 위한 불필요한 메시지 생성
- 2.1.3 로깅을 효율적으로 하기 위한 개선
- 2.1.4 트랜잭션 저널 로그
- 2.2 불필요한 로직
- 2.3 반복 로직
- 2.1 로깅
- ▣ 3장: 로직 최적화
- 3.1 락 최소화
- 3.1.1 락 범위 최소화
- 3.1.2 락 제거
- 3.2 문자열 처리 개선
- 3.2.1 String.format 메서드
- 3.2.2 String.replaceAll 메서드
- 3.2.3 문자열 합치기
- 3.3 리플렉션 호출 제거
- 3.4 채번
- 3.5 날짜 연산
- 3.6 시간 문자열 처리
- 3.7 순차 검색 제거
- 3.8 파일 입출력 단위
- 3.9 SQL
- 3.10 BigDecimal
- 3.11 비대기 입출력 사용
- 3.12 기타 성능 개선
- 3.13 코드 성능 측정
- 3.1 락 최소화
- ▣ 4장: 적극적인 캐시 사용
- ▣ 5장: 효율적인 아키텍처 구성
- 5.1 병렬 처리
- 5.2 통신전문
- 5.3 고객정보 조회 이력 로깅과 마스킹
- 5.4 대량 조회 프레임워크 구성
- 5.5 내부 연계시스템
- 5.6 수직확장과 수평확장
- ▣ 1장: 기본 방향
- [6부] SQL 튜닝
- ▣ 1장: 기본 방향
- ▣ 2장: SQL 튜닝을 위한 지본 지식
- 2.1 데이터베이스의 기본 구조
- 2.2 블록 단위 처리
- 2.3 캐시 IO 대 물리 IO
- ▣ 3장: 성능 개선 대상 식별
- 3.1 SQL 수행 통계
- 3.2 실행 중인 세션 상태
- 3.3 수행 중인 SQL의 수행 상태 확인
- 3.4 락 대기
- 3.5 AWR 보고서
- 3.6 StatsPack
- ▣ 4장: SQL 실행계획
- 4.1 SQL 실행계획과 수행 결과
- 4.1.1 SQL 실행계획 보기
- 4.1.2 SQL 수행 결과 확인
- 4.2 실행계획의 이해
- 4.2.1 조인
- 4.2.2 SQL 실행계획의 동작
- 4.3 인덱스
- 4.3.1 인덱스 구조
- 4.3.2 인덱스 종류
- 4.3.3 인덱스 사용 원칙
- 4.3.4 인덱스 탐색 방식
- 4.3.5 인덱스 수와 성능
- 4.4 테이블
- 4.4.1 Direct-Path와 Conventional-Path
- 4.4.2 파티션 테이블
- 4.3 테이블 통계 보기
- 4.1 SQL 실행계획과 수행 결과
- ▣ 5장: SQL 성능 개선
- 5.1 힌트 사용
- 5.2 SQL 성능 개선
- 5.2.1 인덱스 부재
- 5.2.2 인덱스 항목 순서
- 5.2.3 LIKE에 의한 성능 저하
- 5.2.4 테이블 조인 이상
- 5.2.5 실행 횟수와 조인
- ▣ 1장: 기본 방향
- [7부] 애플리케이션 입장에서의 SQL 튜닝
- ▣ 1장: 기본 방향
- ▣ 2장: 중복 SQL 수행 제거
- 2.1 애플리케이션 캐시의 종류
- 2.1.1 블록 캐시
- 2.1.2 요청 캐시
- 2.1.3 사용자 세션 캐시
- 2.1.4 프로세스 캐시
- 2.1.5 프로세스간 공유 캐시
- 2.1.6 캐시 특성 분류
- 2.2 요청 캐시 구현 코드
- 2.3 캐시 적용
- 2.1 애플리케이션 캐시의 종류
- ▣ 3장: 불필요한 SQL 수행 제거
- ▣ 4장: 최적 수행
- 4.1 Rownum 추가
- 4.2 파티션 키 추가
- 4.3 조회 항목 사용 여부(테이블 조인 제거)
- ▣ 5장: 쿼리 통합
- 5.1 메인/서브 쿼리
- 5.2 병렬 쿼리 통합
- ▣ 6장: DB 집합 처리
- ▣ 7장: 트랜잭션 처리
- ▣ 8장: 기타
- 8.1 복합적인 기능을 수행하는 쿼리 제거
- 8.2 스칼라 서브 쿼리 사용 시 주의사항
- 8.3 페이징 처리
- ▣ 9장: 배치 성능 개선
- 9.1 전체 테이블 탐색
- 9.2 파티션
- 9.3 해시 조인
- 9.4 병렬 처리
- 9.5 쿼리 통합
- 9.5.1 메인리더와 건별 처리 쿼리 통합
- 9.5.2 메인리더와 Insert 통합
- 9.5.3 Select / Insert / Update 통합
- 9.6 자바 배치 모니터링 방안
- ▣ 10장: APM 활용
- 10.1 스카우터
- ▣ 1장: 기본 방향
- [8부] 서버 OS 모니터링
- ▣ 1장: 기본 방향
- ▣ 2장: CPU
- 2.1 사용량 분석
- 2.2 CPU 확인
- 2.3 동시 다중 스레딩
- 2.4 CPU를 많이 사용하는 스레드 식별하기
- 2.5 프로세스의 누적 CPU 사용량 확인하기
- 2.6 CPU를 많이 사용하는 모듈(코드) 식별하기
- ▣ 3장: 메모리
- 3.1 가상 메모리
- 3.2 메모리 관련 주요 용어
- 3.3 사용량 분석
- 3.4 메모리 확인
- ▣ 4장: 디스크
- 4.1 사용량 분석
- 4.2 유닉스/리눅스 디스크 관리
- 4.3 파일시스템의 입출력 방식
- 4.3.1 비동기 입출력
- 4.3.2 직접 입출력
- 4.3.3 동시 입출력
- 4.4 스토리지
- 4.5 레이드
- 4.5.1 레이드 0 - 스트라이핑
- 4.5.2 레이드 1 - 미러링
- 4.5.3 레이드 0+1 - 스트라이핑과 미러링
- 4.5.4 레이드 4 - 스트라이핑과 전용 패리티
- 4.5.5 레이드 5 - 스트라이핑과 분산 패리티
- ▣ 5장: 통합 모니터링 도구
- 5.1 nmon
- 5.2 topas
- 5.3 GlancePlus
- 5.4 top
- ▣ 1장: 기본 방향
- [9부] 프로세스의 메모리 구조
- ▣ 1장: 기본 방향
- ▣ 2장: 바이너리 메모리 관리
- 2.1 프로세스 메모리 구조
- 2.2 메모리 누수 조사
- 2.2.1 윈도우
- 2.2.2 AIX
- 2.2.3 솔라리스
- 2.2.4 HPUX
- 2.2.5 리눅스
- 2.2.6 기타
- ▣ 3장: 자바 메모리 관리
- 3.1 JVM 메모리 구조
- 3.2 가비지 컬렉션
- 3.3 오라클/HP JVM의 힙 메모리 구조
- 3.4 오라클/HP JVM의 GC 방식
- 3.4.1 Serial GC
- 3.4.2 Incremental GC
- 3.4.3 Parallel GC
- 3.4.4 Parallel Old GC
- 3.4.5 Concurrent Mark and Sweep(CMS) GC GC
- 3.4.6 Garbage First(G1) GC
- 3.4.7 GC 선정 기준
- 3.5 IBM JVM의 메모리 구조
- 3.5.1 단일 공간 메모리 구조
- 3.5.2 Generation space 메모리 구조
- 3.6 IBM JVM의 GC 방식
- 3.7 자바 힙 메모리 누수
- 3.8 자바 힙 메모리 모니터링
- 3.8.1 jstat
- 3.8.2 모니터링 콘솔
- 3.8.3 GC 로깅
- 3.9 자바 힙 덤프 수집
- 3.9.1 jmap
- 3.9.2 이벤트 설정
- 3.9.3 HPROF
- 3.10 메모리 분석(이클립스 MAT 1.2.1 버전)
- 3.10.1 시작하기
- 3.10.2 화면 구성
- 3.10.3 주요 용어 설명
- 3.10.4 주요 메뉴
- ▣ 1장: 기본 방향
- [10부] 네트워크 모니터링
- ▣ 1장: 기본 방향
- ▣ 2장: 네트워크 기초
- 2.1 OSI 7 계층
- 2.2 TCP/IP와 UDP/IP
- 2.3 스위치
- 2.4 운영체제별 네트워크 설정 확인
- ▣ 3장: IP
- 3.1 기본 개념
- 3.1.1 IP 주소
- 3.1.2 IP 주소의 클래스
- 3.1.3 IP 주소의 사이더
- 3.1.4 서브넷 마스크
- 3.1.5 게이트웨이
- 3.1.6 점보 프레임
- 3.2 IPv6
- 3.3 IP 프로토콜 네트워크 체크 명령
- 3.3.1 호스트 IP 설정 확인
- 3.3.2 Ping 명령
- 3.3.3 호스트의 라우팅 테이블 확인
- 3.3.4 Trace route 명령
- 3.3.5 nbtstat 명령
- 3.1 기본 개념
- ▣ 4장: TCP
- 4.1 기본 개념
- 4.2 TCP 전송 보장
- 4.2.1 전송 보장 알고리즘
- 4.2.2 선별적인 ACK
- 4.3 전송 제어
- 4.3.1 수신 윈도우
- 4.3.2 송신 윈도우
- 4.3.3 슬라이딩 윈도우
- 4.4 네이글 알고리즘
- 4.5 TCP KeepAlive
- 4.6 TCP 프로토콜 네트워크 체크
- 4.6.1 telnet [IP address] [port] 명령
- 4.6.2 netstat -an 명령
- 4.6.3 netstat -s -p [protocol] 명령
- ▣ 5장: UDP
- ▣ 6장: 기타 프로토콜
- 6.1 DNS
- 6.2 FTP
- ▣ 7장: 네트워크 데이터 수집 방법
- 7.1 유닉스/리눅스 공통
- 7.2 HP-UX
- 7.3 IBM AIX
- 7.4 오라클 솔라리스
- 7.5 윈도우
- ▣ 8장: 네트워크 패킷 분석 (와이어샤크 1.10.6 버전)
- 8.1 화면 구성
- 8.1.1 패킷 목록
- 8.1.2 패킷 프로토콜 정보
- 8.2 필터링
- 8.3 기초 분석 메뉴
- 8.4 응답시간 분석
- 8.4.1 네트워크 시간
- 8.4.2 서버 시간
- 8.4.3 클라이언트 시간
- 8.5 전문 분석
- 8.6 재전송 분석
- 8.7 와이어샤크를 이용한 성능 분석
- 8.1 화면 구성
- ▣ 1장: 기본 방향
26쪽
시나라오 --> 시나리오
143쪽, 149쪽
jsatck --> jstack
145쪽, 머리말
2장. 수행 중인 코드
2.1 스택에 대한 이해
==> 2장. 수행 중인 코드176쪽 표 4-4 셋째줄 3번째 항목
SPA --> SDPA
220쪽 목차 5.2 내용중에
스택 정보를 보는
jstat
과 --> 스택 정보를 보는jstack
과308쪽 중간
545블록 --> 454블록
508쪽, 첫 번째 줄
원도우
7과 8에서는 -->윈도우
7과 8에서는691쪽, 표 6번째 행, 2열
0이면
원도우
크기가 --> 0이면윈도우
크기가691쪽, 표 6번째 행, 2열
원도우
의 정확한 -->윈도우
의 정확한733쪽, 그림 10-18을 다음 그림으로 교체