책소개
소프트웨어 엔지니어라면 누구나 마주할 수 있는 예기치 못한 성능 문제를 발견하고, 평가하며 해결하는 방법을 설명하는 책이다. 저자가 수많은 세월을 걸쳐 겪어온 문제들과 이를 정확히 간파하는 방법을 제시하고 도구들을 설명한다. 4가지 근본이 되는 하드웨어 자원을 설명하고 이들의 상호작용을 이해하며 다양한 도구와 함께 분석한다. 이 책을 끝까지 읽은 후에는 모호했던 문제를 더욱 정확히 이해하고 해결 방법을 스스로 찾을 힘을 얻게 될 것이다.
저자소개
1959년 처음으로 컴퓨터 프로그램을 개발했다. 커리어의 대부분을 하드웨어와 소프트웨어의 극간을 연구하며 보냈으며, 특히 CPU/소프트웨어 성능의 상호작용에 관심을 가졌다. 벡스VAX 마이크로코드, DEC 알파 공동 설계자 그리고 오늘날 거의 모든 프로세서에서 볼 수 있는 성능 카운터를 개발했다. 또한 DEC, 어도비, 구글과 테슬라에서 적은 오버헤드만으로 마이크로코드와 소프트웨어를 추적해왔다. 1974년 스탠포드(Standford)에서 박사 학위를 취득했고 66개의 특허를 보유한 미국 국립 공학 아카데미(US National Academy of Engineering)의 회원이다
목차
1부. 측정1장. 너무 느린 내 프로그램 1.1 데이터 센터의 측면1.2 데이터 센터 하드웨어1.3 데이터 센터 소프트웨어1.4 긴 꼬리 지연시간1.5 프레임워크에 관한 고찰1.6 크기 정도 산정1.7 트랜잭션이 느린 이유1.8 5가지 기본적인 자원들1.9 요약2장. CPU 측정 2.1 과거에서 지금까지의 발자취2.2 지금의 위치2.3 add 명령어의 지연시간 측정2.4 직선형 코드의 실수2.5 간단한 반복문, 반복문 오버헤드 실수, 컴파일러 최적화 실수2.6 사용되지 않는 변수로 인한 실패2.7 향상된 반복문2.8 의존적인 변수들2.9 실제 실행 지연시간2.10 몇 가지 추가 차이점2.11 요약연습3장. 메모리 측정 3.1 메모리 타이밍3.2 메모리3.3 캐시 구조3.4 데이터 정렬3.5 변환 색인 버퍼 구조3.6 측정3.7 캐시 라인 크기 측정3.8 문제: N+1 프리패칭3.9 종속적인 로드3.10 무작위가 아닌 DRAM3.11 캐시 계층별 크기 측정3.12 캐시 계층별 접근도 측정3.13 변환 버퍼 시간3.14 활용도 낮은 캐시3.15 요약연습4장. CPU와 메모리의 상호작용 4.1 캐시 상호작용4.2 간단한 행렬 곱셈의 다양성4.3 예측4.4 초기화, 크로스 체크 그리고 관찰4.5 초기의 결과4.6 더 빠른 행렬 곱셈, 전치 방법4.7 더 빠른 행렬 곱셈과 하위 블록 방법4.8 캐시 인지 계산4.9 요약연습5장. 디스크/SSD 측정5.1 하드 디스크5.2 SSD 5.3 소프트웨어 디스크 접근과 디스크 버퍼링 5.4 디스크를 빠르게 읽는 방법5.5 대략적인 계산5.6 디스크 쓰기는 얼마나 빠른가5.7 결과 5.8 디스크 읽기 5.9 디스크에 쓰기5.10 SSD 읽기5.11 SSD에 쓰기 5.12 다중 전송5.13 요약 연습6장. 네트워크 측정 6.1 이더넷6.2 허브, 스위치, 라우터 6.3 TCP/IP6.4 패킷 6.5 원격 프로시저 호출(RPC) 6.6 슬롭 6.7 네트워크 트래픽 관찰6.8 간단한 RPC 메시지 정의6.9 샘플 로깅 설계 6.10 샘플 RPC를 이용한 클라이언트 서버 시스템6.11 간단한 서버 프로그램6.12 스핀 락 6.13 샘플 클라이언트 프로그램 6.14 하나의 샘플 클라이언트 서버 RPC 측정6.15 RPC 로그 후처리6.16 관찰 6.17 요약 연습7장. 디스크와 네트워크 데이터베이스의 상호작용 7.1 시간 정렬7.2 다중 클라이언트 7.3 스핀 락 7.4 실험 17.5 디스크 기반 데이터베이스7.6 실험 27.7 실험 37.8 로깅 7.9 트랜잭션 지연시간의 다양성 이해7.10 요약 연습2부. 관찰8장. 로깅 8.1 관찰 도구8.2 로깅 8.3 기본적인 로깅8.4 확장된 로깅 8.5 타임스탬프8.6 RPC ID8.7 로그 파일 포맷 8.8 로그 파일 관리 8.9 요약 9장. 측정 결과의 통합 9.1 균일한 속도와 버스트 이벤트9.2 측정 간격9.3 타임라인 9.4 타임라인의 더 많은 요약9.5 시간 규모 히스토그램9.6 이벤트별 측정 집계 9.7 시간에 따른 값의 패턴 9.8 시간 간격 업데이트 9.9 트랜잭션 예제9.10 결론 10장. 대시보드 10.1 샘플 서비스 10.2 샘플 대시보드10.3 마스터 대시보드 10.4 인스턴스별 대시보드 10.5 서버별 대시보드 10.6 정상 상태 검사 10.7 요약 연습11장. 다른 도구들 11.1 관찰 도구의 종류11.2 관찰 데이터 11.3 top 명령어11.4 /proc과 /sys 수도 파일11.5 time 명령어 11.6 perf 명령어 11.7 oprofile, CPU 프로파일러11.8 strace, 시스템 콜 11.9 ltrace, CPU C 라이브러리 호출11.10 ftrace, CPU 추적 11.11 mtrace, 메모리 할당/해제11.12 blktrace, 디스크 추적 11.13 tcpdump와 와이어 샤크, 네트워크 추적11.14 locktrace, 임계 구역 락 11.15 부하, 외부 호출, 그리고 트랜잭션 지연시간11.16 요약 연습12장. 추적 12.1 추적의 장점 12.2 추적의 단점 12.3 시작하며 묻는 세 가지 질문12.4 예제: 초기의 프로그램 카운터 추적12.5 예제 : 함수별 카운트와 시간 12.6 사례 연구 : 지메일의 함수별 추적12.7 요약13장. 관찰 도구 설계 원칙 13.1 관찰의 대상 13.2 관찰의 정도 13.3 오버헤드의 정도 13.4 설계 결과13.5 사례 연구 : 히스토그램 버킷 13.6 데이터 디스플레이 설계 13.7 요약 3부. 커널-사용자 추적14장. KUtrace: 목적, 설계, 구현 14.1 개요 14.2 목표 14.3 설계 14.4 구현 14.5 커널 패치와 모듈14.6 컨트롤 프로그램 14.7 후처리14.8 보안 14.9 요약 15장. KUtrace: 리눅스 커널 패치 15.1 추적 버퍼 데이터 구조 15.2 가공되지 않은 추적 블록 형태 15.3 추적 항목15.4 IPC 추적 항목15.5 타임스탬프15.6 이벤트 번호 15.7 중첩된 추적 항목15.8 코드 15.9 패킷 추적15.10 AMD/인텔 x86-64 패치15.11 요약 연습16장. KUtrace: 리눅스 커널 모듈 16.1 커널 인터페이스 데이터 구조16.2 모듈 로드/언로드16.3 초기화와 추적 제어 16.4 추적 요청 구현 16.5 Insert1 16.6 InsertN 16.7 새로운 커널블록으로 전환 16.8 요약 17장. KUtrace: 사용자 모드 런타임 제어 17.1 추적 제어17.2 홀로 동작하는 kutrace_control 프로그램17.3 kutrace_lib 라이브러리 17.4 커널 모듈을 제어하는 인터페이스 17.5 요약 18장. KUtrace: 후처리 18.1 후처리 상세보기 18.2 rawtoevent 프로그램18.3 eventtospan 프로그램18.4 spantotrim 프로그램 18.5 spantospan 프로그램 18.6 samptoname_k와 samptoname_u 프로그램 18.7 makeself 프로그램 18.8 KUtrace JSON 형태 18.9 요약 19장. KUtrace: 소프트웨어 역동성 디스플레이 19.1 개요 19.2 1구역, 제어 19.3 2구역, Y축19.4 3구역, 타임라인 19.5 4구역, IPC 범례 19.6 5구역, X축19.7 6구역, 저장/복구19.8 보조 제어19.9 요약 4부. 추론20장. 찾고자 하는 것 20.1 개요 21장. 너무 많은 실행 21.1 개요 21.2 프로그램 21.3 미스터리 21.4 탐구 및 추론21.5 미스터리 이해21.6 요약 22장. 느린 실행 22.1 개요 22.2 프로그램 22.3 미스터리 22.4 부동 소수점 방해 프로그램22.5 메모리 방해 프로그램22.6 미스터리의 이해 22.7 요약 23장. CPU 대기 23.1 프로그램 23.2 미스터리 23.3 탐구와 추론 23.4 미스터리2 23.5 미스터리2의 이해23.6 보너스 미스터리 23.7 요약 연습24장. 메모리 대기 24.1 프로그램 24.2 미스터리 24.3 탐구와 추론 24.4 미스터리 2 : 페이지 테이블 접근 24.5 미스터리 2의 이해24.6 요약 연습25장. 디스크 대기25.1 프로그램 25.2 미스터리 25.3 탐구와 추론 25.4 40MB 읽기25.5 순차적 4KB 블록 읽기 25.6 임의의 4KB 블록 읽기 25.7 SSD의 40MB 쓰기와 동기화 25.8 SSD의 40MB 읽기25.9 한 번에 두 파일에 접근하는 두 프로그램25.10 미스터리의 이해25.11 요약 연습26장. 네트워크 대기 26.1 개요 26.2 프로그램 26.3 실험 126.4 실험 1의 미스터리26.5 실험 1 탐구와 추론 26.6 실험 1의 RPC 소요 시간26.7 실험 226.8 실험 326.9 실험 426.10 미스터리의 이해26.11 추가 이상 현상 26.12 요약 27장. 락 대기 27.1 개요 27.2 프로그램 27.3 실험 1 : 오랜 락 유지 시간 27.3.1 간단한 락 27.3.2 락 포화27.4 실험 1의 미스터리27.5 실험 1의 탐구와 추론27.5.1 락 캡처27.5.2 락 기아27.6 실험 2 : 락 캡처 수정27.7 실험 3 : 다중 락에 의한 락 경합 수정 27.8 실험 4 : 더 적은 락을 통한 락 경합 수정 27.9 실험 5 : 대시보드를 위한 RCU를 이용한 락 경합 수정 27.10 요약 28장. 시간 대기 28.1 주기적인 작업28.2 타임아웃 28.3 타임 슬라이싱28.4 인라인 실행 지연28.5 요약 29장. 큐 지연 29.1 개요 29.2 요청 분포29.3 큐 구조 29.4 작업 테스크 29.5 프라이머리 테스크29.6 디큐 29.7 인큐 29.8 스핀 락 29.9 “작업” 루틴 29.10 간단한 예제 29.11 가능성 있는 문제29.12 CPU 빈도수 29.13 복잡한 예제 29.14 CPU 대기 : RPC 로그 29.15 CPU 대기 : KUtrace29.16 PlainSpinLock 결함29.17 근본 원인29.18 PlainSpinLock 수정 : 가시성 29.19 부하 분산29.20 큐 길이 : 가시성 29.21 마지막 스핀 29.22 추가 결함29.23 크로스 체크 29.24 요약 연습30장. 정리 30.1 배운 것 30.2 배우지 못한 것 30.3 다음 단계30.4 전체 책 요약 부록 A. 샘플 서버 A.1 샘플 서버 하드웨어 A.2 서버 연결 부록 B. 추적 항목 B.1 고정 길이의 추적 항목 B.2 가변 길이의 추적 항목 B.3 이벤트 번호 B.3.1 커널 모드 KUtrace 패치로 삽입된 이벤트 B.3.2 유저 모드 코드로 삽입된 이벤트 B.3.3 후처리 코드로 삽입된 이벤트