서버의 대수를 늘리는 스케일아웃과 하드웨어성능을 높이는 스케일업방식이 있다.저가의 하드웨어어수를 늘리는 스케일아웃이 비용이 저렴할 수 있지만 몇가지 문제가 발생할것이다.사용자의 요청을 로드밸런서를 이용하여 분산해야 하며 DB를 분산시켰을시 데이터동기화를 하여 여러DB가 상태를 공유해야 한다.또한 지연시간(latency)를 고려해야한다.단 밀리초라도 마이크르초단위로 작동하는 컴퓨터에는 긴 시간이다.
시스템은 특정 서버가 고장나도 서비스가 중단되면 안된다.스케일아웃시 몇대의 서버가 고장나도 나머지 시스템이 부하를 견딜 수 있어야 한다.웹서비스는 언제라도 장애에 대해 견고해야 한다.
서버가 수백대라면 각 서버가 어떤 역할을 수행하는지,어떤 상황에 있는지 파악하는거 조차 어렵다.부하,고장,여분의 디스크용량,보안등 고려해야 할 사항이 매우 많다.이런 경우 모니터링툴을 사용하여 자동화해야하며 사람의 조작없이 대규모 시스템을 오랫동안 유지해야 한다.
개발자 수가 늘어나면 개발표준화는 어떻게 할지 고민해야 한다.언어,라이브러리,프레임워크,코딩 컨벤션,버전관리등이 통일되고 올바르게 수행되야 생산성이 늘어난다.이를 수행하기 누군가는 표준화가 잘 지켜지는지,기술자능력차이로 효율이 나쁜부분이 생기는지,어떻게 교육할지에 대해 관리해야 한다.
컴퓨터는 디스크에서 데이터를 로드하여 메모리에 저장,메모리로부터 cpu가 fetch하여 처리수행,메모리로부터 fetch된 명령은 cache메모리에 캐싱등 디스크=>메모리=>캐시 메모리=>cpu
의 단계를 거친다.
디스크와 메모리차이는 매우 커서 이를 완화하기 위해 디스크로 부터 읽은 데이터는 메모리에 캐싱한다.하지만 대규모 데이터에서는 cache miss
가 발생하여 disk I/O
가 느려져 전체 시스템속도 저하를 발생시킨다.이를 해결하기위해 어떻게 하면 데이터를 적게 가져갈지,여러 서버로 분산시킬지,데이터를 최소로 읽을지 등에한 고민이 필요하다.
대규모 데이터는 메모리내에서 계산할 수 없기에 디스크를 계속 읽어야 한다.메모리는 디스크보다 10만~100만배의 탐색속도차이가 난다.또한 메모리는 디스크보다 전송속도또한 100배이상의 차이가 난다.이와 같이 메모리와 디스크의 속도차를 생각하여 어플리케이션을 만들어야한다.이는 확장성을 생각할때 어려운 부분이다.
top
,uptime
등의 명령으로 Load Average(시스템전체 부하 상황)을 확인한다.하지만 Load Average만으로 시스템 전체 병목을 확인할 수 없다.이를 시초로 병목을 조사해야 한다.Load Average는 낮아도 소프트웨어설정,오류,네트워크,원격 호스트측에 원인이 있을 수 있다.
sar
,vmstat
으로 시간경과에 따라 cpu사용률,I/O대기율을 확인한다.cpu부하가 높은경우 다음을 확인한다.
top
,sar
로 확인ps
로 프로세스상태,cpu사용시간을 보며 원인프로세스를 찾는다.strace
,oprofile
로 프로파일링한다.일반적인 cpu부하원인은 다음과 같다
cpu부하에 전송량문제까지 있다면 서버증설이나 프로그램로직,알고리즘을 개선한다.
프로그램의 입출력이 많거나 스왑이 발생하여 디스크 엑세스가 발생하는 상황이 대부분이다.sar
,vmstat
으로 스왑 발생을 체크한다.스왑이 발생할 경우 다음을 확인한다.
ps
로 확인한다.스왑이 발생하지 않고 입출력이 빈번할경우 캐시메모리가 부족할 수 있다.서버의 데이터용량과 증설메모리양을 비교하여 다음을 검토한다.