[대규모 서비스를 지탱하는 기술]#1

코드깎는 노인·2021년 8월 8일
0
post-thumbnail
post-custom-banner

대규모 서비스와 소규모 서비스

대규모 서비스와 소규모 서비스의 차이

확장성,부하분산

서버의 대수를 늘리는 스케일아웃과 하드웨어성능을 높이는 스케일업방식이 있다.저가의 하드웨어어수를 늘리는 스케일아웃이 비용이 저렴할 수 있지만 몇가지 문제가 발생할것이다.사용자의 요청을 로드밸런서를 이용하여 분산해야 하며 DB를 분산시켰을시 데이터동기화를 하여 여러DB가 상태를 공유해야 한다.또한 지연시간(latency)를 고려해야한다.단 밀리초라도 마이크르초단위로 작동하는 컴퓨터에는 긴 시간이다.

다중성 확보

시스템은 특정 서버가 고장나도 서비스가 중단되면 안된다.스케일아웃시 몇대의 서버가 고장나도 나머지 시스템이 부하를 견딜 수 있어야 한다.웹서비스는 언제라도 장애에 대해 견고해야 한다.

효율적 운용

서버가 수백대라면 각 서버가 어떤 역할을 수행하는지,어떤 상황에 있는지 파악하는거 조차 어렵다.부하,고장,여분의 디스크용량,보안등 고려해야 할 사항이 매우 많다.이런 경우 모니터링툴을 사용하여 자동화해야하며 사람의 조작없이 대규모 시스템을 오랫동안 유지해야 한다.

개발자수,개발방법

개발자 수가 늘어나면 개발표준화는 어떻게 할지 고민해야 한다.언어,라이브러리,프레임워크,코딩 컨벤션,버전관리등이 통일되고 올바르게 수행되야 생산성이 늘어난다.이를 수행하기 누군가는 표준화가 잘 지켜지는지,기술자능력차이로 효율이 나쁜부분이 생기는지,어떻게 교육할지에 대해 관리해야 한다.

대규모 데이터에 대한 대처

컴퓨터는 디스크에서 데이터를 로드하여 메모리에 저장,메모리로부터 cpu가 fetch하여 처리수행,메모리로부터 fetch된 명령은 cache메모리에 캐싱등 디스크=>메모리=>캐시 메모리=>cpu의 단계를 거친다.
디스크와 메모리차이는 매우 커서 이를 완화하기 위해 디스크로 부터 읽은 데이터는 메모리에 캐싱한다.하지만 대규모 데이터에서는 cache miss가 발생하여 disk I/O가 느려져 전체 시스템속도 저하를 발생시킨다.이를 해결하기위해 어떻게 하면 데이터를 적게 가져갈지,여러 서버로 분산시킬지,데이터를 최소로 읽을지 등에한 고민이 필요하다.

대규모 데이터 처리가 어려운 이유

대규모 데이터는 어떤점이 어려운가

대규모 데이터는 메모리내에서 계산할 수 없기에 디스크를 계속 읽어야 한다.메모리는 디스크보다 10만~100만배의 탐색속도차이가 난다.또한 메모리는 디스크보다 전송속도또한 100배이상의 차이가 난다.이와 같이 메모리와 디스크의 속도차를 생각하여 어플리케이션을 만들어야한다.이는 확장성을 생각할때 어려운 부분이다.

성능을 끌어올리기 위한 Linux단일 호스트 부하측정

Load Average 확인

top,uptime등의 명령으로 Load Average(시스템전체 부하 상황)을 확인한다.하지만 Load Average만으로 시스템 전체 병목을 확인할 수 없다.이를 시초로 병목을 조사해야 한다.Load Average는 낮아도 소프트웨어설정,오류,네트워크,원격 호스트측에 원인이 있을 수 있다.

CPU,I/O병목 조사

cpu병목

sar,vmstat으로 시간경과에 따라 cpu사용률,I/O대기율을 확인한다.cpu부하가 높은경우 다음을 확인한다.

  • 사용자 프로그램이 병목인지,시스템프로그램이 병목인지 top,sar로 확인
  • ps로 프로세스상태,cpu사용시간을 보며 원인프로세스를 찾는다.
  • 원인 프로세스를 찾은 후 보다 상세히 조사할 경우strace,oprofile로 프로파일링한다.

일반적인 cpu부하원인은 다음과 같다

  • 디스크,메모리용량에서 병목이 안걸리는 상태
  • 프로그램폭주로 cpu에 부하가 걸리는 경우

cpu부하에 전송량문제까지 있다면 서버증설이나 프로그램로직,알고리즘을 개선한다.

I/O병목

프로그램의 입출력이 많거나 스왑이 발생하여 디스크 엑세스가 발생하는 상황이 대부분이다.sar,vmstat으로 스왑 발생을 체크한다.스왑이 발생할 경우 다음을 확인한다.

  • 특정 프로세스에서 극단적으로 메모리를 사용하고 있는지 ps로 확인한다.
  • 프로그램오류로 메모리를 많이 사용하는지
  • 메모리가 부족한 경우 메모리를 증설한다.증설이 되지 않으면 분산을 고려한다.

스왑이 발생하지 않고 입출력이 빈번할경우 캐시메모리가 부족할 수 있다.서버의 데이터용량과 증설메모리양을 비교하여 다음을 검토한다.

  • 메모리 증설로 캐시영역을 확대할 수 있는경우 메모리증설
  • 메모리 증설로 대응할 수 없는 경우 데이터 분산이나 캐시서버 도입을 검토한다.프로그램의 I/O빈도를 낮추는 방법도 고려한다.
profile
내가 볼려고 만든 블로그
post-custom-banner

0개의 댓글