책이 길어 많이 생략될 예정입니다
- 주관적인 성능 목표는 목표치를 설정함으로써 객관화가 가능하다
- 성능 튜닝은 작업이 이루어지는 가장 가까운 지점에서 하는 것이 효과적이다
- 포화지점: 시스템의 특정 구성 요소의 사용률이 100%인 지점으로 성능의 병목인 경우가 많다
- 성능 최적화의 순서 지침
- 그것을 하지 않는 방법을 선택하세요 → 작업 제거
- 해야 한다면 반복하지 마세요 → 캐싱
- 작업을 덜 하도록 만드세요 → 빈도 줄이기
- 작업을 나중에 하세요 → Write-back 과 같은 캐싱 방법 사용
- 눈에 띄지 않는 시간에 작업 하세요 → 피크 시간대에서 작업을 이동
- 동시에 작업하세요 → 병렬로 처리
- 성능이 좋은 장비를 구입하세요 → 방법이 없다…
- 일반적인 관측 도구
- vmstat: 시스템 전반의 가상 및 물리 메모리 통계
- mpstat: CPU 별 사용률
- iostat: 디스크별 I/O 사용률
- nstat: TCP/IP 스택 통계
- sar: 다양한 통계 제공, 과거 기록을 저장할 수도 있음
- ps: 프로세스 상태
- top: 통계값을 기준으로 정렬된 프로세스 목록
- tcpdump: 네트워크 패킷 트레이싱
- 리눅스
- /proc 폴더는 프로세스별 통계를 제공하는 여러 파일 존재
- perf: 리눅스 공식 프로파일링 도구
- 운영 체제
- 인터럽트: 이벤트 처리를 위해 신호를 발생시키고 현재 스레드의 상태를 저장한 후 인터럽트 서비스 루틴을 실행하는 것
- idle thread: 수행할 작업이 없을 때 사용되는 대기용 임시 스레드
- 스케쥴러: 프로세스를 스케쥴링하기 위한 커널의 핵심 요소
- Inter-Processor-Interrupt: Cpu가 다른 CPU 에게 즉시 작업을 수행하도록 요청하는 인터럽트
- 어플리케이션
- I/O 크기 변경: 처리량을 늘리기 위한 가장 일반적인 전략
- 캐싱: 파일 시스템 읽기 성능과 메모리 할당 성능을 높이기 위한 전략
- 버퍼링: 쓰기 성능을 향상시키기 위해 병합하여 처리하는 전략
- 파이버: 사용자 모드에서 동작하는 경량 스레드로 어플리케이션이 자체적인 스케쥴링 로직으로 관리가 가능하며 OS 스레드보다 오버헤드가 적음
- 코루틴: 사용자 모드 어플리케이션이 스케쥴링 가능한 서브 루틴으로 파이버보다 더 경량
- 해시 테이블은 이론적으로 버킷수가 CPU 수와 같거나 그보다 많아야 최대 병렬성을 가질 수 있다
- 메인 메모리가 부족하면 스와핑 현상이 심할 수 있으니 확인해야 한다
- CPU
- 실행 시간 큐 지연시간: 스레드가 CPU 실행 큐에서 기다리는데 소모되는 시간
- 멀티프로세서에서는 각 CPU마다 큐를 별도로 두어 메모리 지역성을 높이기 위해 가능한 같은 CPU에서 수행하려고 노력함
- IPC: 사이클 당 명령어 수. 낮은 IPC는 다른 이유가 CPU가 지연된다는 의미
- 캐시 라인: 메모리에서 한 번에 저장되거나 전송되는 단위. CPU의 스루풋을 향상 시키기 위해 사용됨
- 인터커넥트: CPU 및 주변 장치간 고속 통신을 위한 연결 구조 및 규격
- CPU 튜닝은 IPC 가 높은 방향으로 튜닝되어야 한다
- 메모리
- 가상 메모리: 페이지 기반의 실제 메모리 맵핑
- 세그먼트: 스레드 스택, 실행 파일, 라이브러리, 힙 등을 저장하는 위해 구분된 영역
- 페이징: 메인 메모리로 페이지를 가져오거나 내보내는 행위
- 스와핑: 리눅스에서 데이터를 물리적 스왑 장치(디스크)나 파일로 옮기는 행위
- 페이지 폴트: 가상 - 물리 메모리 맵핑이 없어 조회에 실패하는 현상
- 마이너: 메모리에 존재하는 다른 페이지로부터 해결 가능한 실패
- 메이저: 저장 장치에 액세스해야하는 실패
- 워킹셋: 프로세스가 작업을 수행할 때 자주 사용하는 메모리의 크기
- CPU 캐시 크기보다 작거나 일치한다면 성능이 크게 향상됨
- MMU: 가상 주소를 물리 주소로 변환하는 역할을 담당하는 메모리 관리 유닛
- TLB: 변환 색인 버퍼. 주소 변환을 위한 첫 번째 캐시
- 메모리 튜닝은 페이징이나 스와핑이 자주 일어나지 않아야 좋은 효과가 있다
- 파일 시스템
- 데이터를 파일과 디렉토리로 조직화하고 기반 인터페이스를 통해 접근할 수 있도록 구성된 시스템
- inode: 파일 시스템 객체의 메타데이터를 저장
- 페이지 캐시: 가상 메모리 페이지를 캐시하여 파일 및 디렉토리 I/O 성능을 향상 시킴
- 플러싱: 캐시에는 반영되었으나 디스크에 반영되지 않는 데이터를 디스크에 쓰는 행위
- 메모리 맵핑(mmap): 파일 데이터 버퍼를 프로세스 주소 공간에 직접 맵핑
- 디스크 → 사용자 공간으로 직접 복사되기 때문에 커널 공간 복사를 건너뛰게 된다
- 윈도우는 NTFS, 리눅스는 EXT4 또는 **XFS(AWS)**가 기본이다
- 디스크
- Host Bus Adaptor: Cpu I/O 트랜스 포트와 연결되는 디스크 컨트롤러
- 읽기 비율이 높다면 캐시, 쓰기 비율이 높다면 디스크가 많은 것이 유리
- I/O Wait 는 Cpu 큐에서 대기하는 I/O 작업이 대기하는 시간을 의미
- 쓰기 증폭: 플래시 메모리 블록 크기보다 작은 쓰기 작업이 매우 많을 경우 발생
- 네트워크
- NIC(네트워크 인터페이스 카드): 네트워크 포트와 시스템 I/O 트랜스포트 사이에 패킷을 전달하는 역할을 하는 네트워크 컨트롤러를 가진 장비
- 라우팅: 패킷이 네트워크를 거쳐 목적지에 도달 할 수 있도록 하는 것을 의미
- 라우터: 네트워크 프로토콜과 라우팅 테이블을 사용해 최적의 전달 경로를 결정
- 버퍼링은 중간 노드가 아닌 양 끝단이 수행하는 것이 더 적합하다
- TCP 슬라이딩 윈도우: 송신 측은 ACK 패킷이 아직 도착하지 않더라도 미리 정한 윈도우 크기 만큼은 네트워크로 먼저 전송 가능하다
- TCP_LINGER: TIME_WAIT 지연 시간을 줄이기 위해 사용되는 옵션
- TCP_NODELAY: 네이글 알고리즘을 비활성화하여 패킷을 많이 쓰는 대신 지연을 줄이는 옵션
- SO_REUSEPORT: 여러 프로세스와 스레드가 동일 포트에 소켓 바인딩이 가능하게 하여 커널의 부하 분산을 통해 확장성을 높일 수 있는 옵션
- SO_REUSEADDRESS: 이미 사용 중인 TIME_WAIT 상태의 포트를 재사용하여 소켓을 바인딩 가능하게하는 옵션
- 리눅스 netstat 명령어의 결과 중 DRP(드롭 패킷), OVR(오버런 패킷) 값은 네트워크 포화의 징후이다
- 클라우드 컴퓨팅
- 멀티 테넌시: 여러 테넌트가 동일한 물리 호스트를 공유하는 환경
- 하드웨어 가상화에서 오버헤드를 유발하는 가장 큰 요인은 I/O 변환 작업이었다
- 컨테이너 성능 분석에서 가장 큰 노이즈는 호스트에서 구동되는 다른 컨테이너의 사용량으로 인한 혼선 가능성이다
- 리눅스에서의 컨테이너 식별
- namespace: 시스템 자원의 가시성을 제한하는 매커니즘.
- cgroups: 자원 사용량을 제한하는 매커니즘
- 마이크로 VM: 경량 가상 머신. 경량 하이퍼바이저를 기반으로 컨테이너 효율성과 하드웨어 가상화의 보안의 2 장점을 취하도록 설계됨
- 기타