이 글은 절판도서 "웹 개발자를 위한 대규모 서비스를 지탱하는 기술" 을 개인적인 용도로 정리한 글입니다. 모든 내용을 정리한 것이 아니라 필요한 부분만 정리했다는 점 양해 부탁드립니다
문제/오류가 있을 시 댓글로 알려주면 감사하겠습니다
| 하테나 서비스의 규모
| 소규모 서비스와 대규모 서비스의 차이
확장성 확보, 부하분산 필요
스케일업 : 하드웨어의 처리 성능을 높여 처리 능력을 높인다(하나에 CPU, RAM 등을 몰빵)
스케일아웃 : 서버의 역할을 분담하거나 대수를 늘림으로써 시스템의 전체적인 처리 능력을 높여 부하를 분산(서버를 횡으로 늘림)
데이터 동기화, 네트워크 통신 지연시간(이더넷 이용 시 지연 시간 발생) 등 고려
다중성 확보 필요 : 스케일 아웃으로 서버가 여러대이면 고장 확률 높아짐, 시스템 고장 시 다른 시스템이 자동적으로 처리를 인계받는 구축 필요
효율적 운용 필요 : 서버 대수가 사람이 관리하기 어려운 수준으로 많아지면, 감시용 소프트웨어 등을 이용해 자동화 필요
개발자 간 개발 표준화, 팀 매니지먼트, 버전관리 등 필요
대규모 데이터량에 대한 대처 : 데이터는 디스크 -> 메모리 -> 캐시 메모리 -> CPU와 같은 단계를 경유해 처리가 나는데 하드웨어간 속도 차이가 많이 난다. 데이터가 많아지면 캐시 미스가 많이 발생하고 디스크 I/O가 많이 발생한다. 이에 대한 고려 필요
| 하테나의 성장에 따른 시스템 확장
기존 Linux 박스의 저가의 라우터, 아파치 mod_rewrite로 http 분산, MYSQL 레플리케이션으로 DB 분산(서버 추가도 불가)
->
병목 지점 측정 후 I/O 부하 높은 서버는 메모리 중시, CPU 부하기 높은 서버는 CPU 중시 형태로 서버를 교체 + OS 가상화를 이용한 유지보수성 높임 + 로직/ DB 스키마 재검토
처음부터 완벽한 부하 분산 시스템을 구축하면 돈이 많이 들기 때문에 불완전하게 시작하는 것이 나을 수도 있다
어느 정도 수용 능력 관리나 서비스 설계 시에 필요 이상으로 데이터를 증가시키지 않는 설계를 포함하는 것이 좋다
| 대규모 데이터 예시
select count(*) from relword;
| 대규모 데이터 처리의 어려운 점
메모리 내에서 계산할 수 없다
1) 탐색 속도 차
2) 전송 속도, 버스의 속도 차
| Linux 단일 호스트의 부하
1) Load Average
2) CPU, IO 병목 원인 조사
CPU 부하 조사
- 사용자 프로그램 처리 병목 여부 or 시스템 프로그램 원인 확인(top, sar 명령어)
- ps로 프로그램 상태, CPU 사용시간을 보면서 원인인 프로세스 확인
- 프로세스를 찾은 후 strace나 oprofile로 추적/프로파일링 해 병목 지점을 좁혀감
원인 & 대처
- 디스크, 메모리 용량 등 그밖의 부분에서는 병목이 되지 않은 이상적 형태 -> 서버 증설, 프로그램 로직/ 알고리즘 개선
- 혹은 프로그램이 폭주해서 CPU 에 필요 이상의 부하가 걸리는 것 -> 오류를 제거해서 프로그램이 폭주하지 않도록 함
IO 부하 조사
- 프로그램 입출력이 많거나 스왑이 발생해서 디스크 엑세스가 발생하는 상황
- ps로 특정 프로세스가 극단적 메모리 소비를 하는지 확인
- 프로그램 오류로 메모리를 지나치게 먹는 프로그램이 있는지 확인
- 탑재된 메모리가 부족한 경우 메모리 증설, 메모리 증설 불가능할 경우 분산 검토
- 스왑이 발생하지 않고 디스크로의 입출력이 빈번하게 발생하는 상황은 캐시에 필요 메모리가 부족한지 확인
- 메모리 증설로 캐시 영역을 확대시킬 수 있는 경우 메모리 증설
- 메모리 증설로 대응할 수 없는 경우는 데이터의 분산이나 캐시 서버 등을 검토
- 프로그램을 개선해서 I/O 빈도를 줄이는 것 검토
| 규모 조정의 요소
| 웹 어플리케이션과 부하
| DB 확장성 확보의 어려움
| 두종류의 부하와 웹 애플리케이션
| 프로그램 작성 요령
| 프로그램 개발 한층 아래 기초
| Load Average 다음은 CPU 사용률과 IO 대기율
sar로 CPU 사용률, IO 대기율 확인 : 시스템 상황 리포트 도구
Load Average가 높고 CPU 사용률 수치가 높다면 대기하고 있는 프로세스의 부하 원인은 CPU 리소스 부족이라고 판단할 수 있음
반대로 IO 사용률 수치가 높다면 부하의 원인은 IO
메모리 사용률이나 스왑 발생 상황등을 참조하도록 한다
수치와 프로세스 상태까지 top-down 중심으로 살펴보자
sar -P를 이용하면 멀티 CPU에 대한 값을 볼 수 있다
멀티 CPU여도 디스크가 하나면 IO 부하는 분산되지 않는다
멀티코어 환경에서는 CPU 상태를 개별적으로 확인해야한다