시스템 최적화 전문가의 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 대상 업무와 성능 개선
      •  
  • [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장: 개선 방향성
      •  
  • [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
      •  
    • ▣ 5장: 웹 서버 모니터링
      • 5.1 웹 요청 응답시간 모니터링
      • 5.2 웹 서버 성능 모니터링
      •  
    • ▣ 6장: HTTPS
      •  
  • [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 프로세스의 수행 환경 확인
      •  
  • [5부] 소스코드 최적화
    • ▣ 1장: 기본 방향
      •  
    • ▣ 2장: 불필요한 작업 제거
      • 2.1 로깅
        • 2.1.1 잘못 사용된 로깅 수준
        • 2.1.2 로깅을 위한 불필요한 메시지 생성
        • 2.1.3 로깅을 효율적으로 하기 위한 개선
        • 2.1.4 트랜잭션 저널 로그
      • 2.2 불필요한 로직
      • 2.3 반복 로직
      •  
    • ▣ 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 코드 성능 측정
      •  
    • ▣ 4장: 적극적인 캐시 사용
      •  
    • ▣ 5장: 효율적인 아키텍처 구성
      • 5.1 병렬 처리
      • 5.2 통신전문
      • 5.3 고객정보 조회 이력 로깅과 마스킹
      • 5.4 대량 조회 프레임워크 구성
      • 5.5 내부 연계시스템
      • 5.6 수직확장과 수평확장
      •  
  • [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 테이블 통계 보기
      •  
    • ▣ 5장: SQL 성능 개선
      • 5.1 힌트 사용
      • 5.2 SQL 성능 개선
        • 5.2.1 인덱스 부재
        • 5.2.2 인덱스 항목 순서
        • 5.2.3 LIKE에 의한 성능 저하
        • 5.2.4 테이블 조인 이상
        • 5.2.5 실행 횟수와 조인
      •  
  • [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 캐시 적용
      •  
    • ▣ 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 스카우터
      •  
  • [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
      •  
  • [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 주요 메뉴
      •  
  • [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 명령
      •  
    • ▣ 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 와이어샤크를 이용한 성능 분석
  • 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열

    원도우의 정확한 --> 윈도우의 정확한

관련 글