상세 컨텐츠

본문 제목

대규모 데이터 부하 분산 위한 계측 방법 (병목 현상, Load Average, vmstat)

기록 - 프로그래밍/Data

by wjjun 2024. 1. 14. 00:22

본문

 

대규모 데이터 다루기 어려운 이유

어려운 잉유는 메모리 내에서 모든 계산을 할 수 없기 때문입니다. 메모리에 올리지 않으면 기본적으로 디스크를 계속 읽고 검색하여 문제를 발견할 수 없는 상태가 됩니다.

 

데이터 건수가 많을수록 입력된 데이터 계산량도 많아지게 됩니다. 문제는 디스크를 읽고 있다는 점입니다.

메모리 내에서 계산할 수 없다면 디스크 공간을 사용하고 I/O 시간이 길어지게 됩니다.

 

 

메모리와 디스크의 속도차

메모리는 디스크보다 10^5~10^6 배 이상 빠릅니다

 

디스크가 느린 이유는 디스크는 물리적으로 회전하며 동작합니다. 원하는 데이터를 찾기 위해 매번 물리적으로 (1) 헤드의 이동 (2) 원반의 회전 동작이 수행되며 이 구조는 탐색 속도에 영향을 주고 있습니다. 디스크 원반 내에서도 원하는 데이터가 흩어져 있다면 각각 찾기 위한 헤드와 원반의 움직임이 필요하게 되어 시간을 상당히 소요하게 됩니다.

 

반면, 메모리의 경우 위와 같은 물리적 동작이 필요하지 않기 때문에 탐색 시 오버헤드가 거의 발생하지 않습니다.

 

전송속도 차이는 메모리, 디스크 모두 CPU와 버스로 연결되어 있습니다.

CPU : 프로그램 명령어를 해석하여 읽고 쓰기가 가능합니다. CPU 속도와 성능이 컴퓨터 전체에 성능에 중요한 영향을 미칩니다.

버스 : 컴퓨터 내에서 데이터와 제어 신호를 전송하는 통로입니다. 데이터버스는 데이터의 이동을 담당하며 CPU와 메모리, 입출력 장치 간 데이터를 전송합니다. 주소 버스는 메모리나 입출력 장치를 선택하거나 주소를 지정하는데 사용합니다. 제어 버스는 하드웨어간 상호작용에서 명령과 제어신호를 담당합니다.

 

버스 속도에서 메모리와 디스크는 전송속도 차이가 있습니다.

데이터를 탐색할 때 발생하는 디스크 > 메모리, 메모리 > CPU로 보내는 전송속도 입니다.

 

hdparam 라는 Linux 툴을 사용하여 위 속도차를 확인할 수 있습니다. 

Timing cached reads 메모리에 있는 캐시 데이터의 전송속도로 실제 메모리 전송속도

Timing buffered disk reads 디스크의 전송속도입니다. 

 

전송속도 확인 방법

sudo /sbin/hdparam -tT /dev/sda

메모리가 디스크보다 100배 이상은 빠릅니다.

 

 

Linux 단일 호스트 부하

서버 한대에서 처리할 수 있는 일을 서버 10대로 분산하는 말에서 전도 되었으며 단일 서버의 성능을 충분히 끌어낼 수 있는 것을 시작으로 복수 서버로의 부하분산 하는 것을 의미합니다.

 

추측하지 말고, 계측하라. 단일 호스트의 성능을 끌어내기 

단일 호스트 성능을 끌어내는데 서버 리소스의 이용현황을 정확하게 파악할 필요가 있습니다. 계측을 통해 시스템의 병목을 규명하고 집중적으로 제거하여 성능을 이끌 낼 수 있습니다.

 

병목 규명작업의 기본 흐름

(1) Load Average 확인

top, uptiome 등의 명령으로 Load Average를 확인합니다. Load Average는 시스템 전체 부하상황을 나타내는 지표입니다. 다만 Load Average 만으로 어느 곳이 병목 원인인지는 판단할 수 없습니다. Load Average 값을 시초로 병목 지점 조사를 시작해야 합니다.

Load Average는 낮은데 시스템 전송량이 오르지 않는 경우 소프트웨어 설정이나 오류, 네트워크, 원격 호스트 측에 원인이 없는지 살펴봐야 합니다.

 

uptime 해석

load average 0.18, 0.08, 0.22

1분동안 부하 0.18, 5분 동안 부하 0.08, 15분 동안 부하 0.22 를 의미합니다. 이 값들은 CPU 코어 수에 비례하여 측정됩니다. 만약 1분 도안 1.0 이라면 CPU를 100% 사용하고 있다는 것을 의미합니다.

 

load average가 일정 기간 동안 높다면 시스템이 현재 부하게 어려움을 겪을 수 있는 성능 문제를 해결하기 위해 추가 조치가 필요할 수 있습니다.

 

(2) CPU, I/O 중 병목 원인 조사

Load Average가 높은 경우 다음으로는 CPU와 I/O 중 어느 곳에 원인이 있는지 조사합니다.

sar, vmstat로 시간 경과에 따라 CPU 사용률이나 I/O 대기율 흐름을 확인할 수 있습니다.

 

사용자 프로그램의 처리가 병목인지 시스템 프로그램이 원인인지 확인합니다. top, sar 사용합니다. ps 로 볼 수 있는 프로세스 상태나 CPU 사용시간 등을 보고 원인이 되는 프로세스를 찾습니다. 프로세스를 찾은 후 보다 상세한 조사를 하는 경우 strace로 추적하거나 oprofile 로 프로파일링을 하여 병목 지점을 좁힐 수 있습니다.

 

일반적으로 CPU 부하가 걸리고 있다면 아래 상황 중 하나입니다.

디스크나 메모리 용량 등 그 밖ㅇ의 부분에서 병목이 되지 않는 이상적인 상태, 프로그램이 폭주해서 CPU에 필요이상의 부하가 걸리는 경우이다.

 

I/O 부하가 높은 경우 프로그램으로부터 입출력이 많아 부하가 높거나 스왑이 발생해서 디스크 접근이 발생하고 있는 상황 중 하나인 경우가 대부분입니다. Sar, vmstat로 스왑 상황을 확인해서 문제를 가려내야 합니다.

 

특정 프로세스가 극단적으로 메모리 소비중인지 ps로 확인할 수 있습니다.

프로그램 오류로 메모리를 지치게 사용한다면 프로그램을 개선해야 합니다.

탑재된 메모리가 부족하다면 증성해야 합니다.

 

I/O 성능을 개선하기 위해서는 아래 내용들을 고려해 볼 수 있습니다.

메모리를 증설하여 캐시 영역을 확보할 수 있는지

원래 데이터량이 너무 많은 것이 아닌지

애플리케이션 I/O 알고리즘 변경 필요성이 있는지

 

vmstat 해석

vmstat [옵션] [시간간격] [횟수] 로 입력합니다

시간간격은 명령어를 실행한 후 각 행을 표시하는 간격(초)을 지정합니다.

횟수는 출력할 횟수를 지정합니다. 이 값을 지정하지 않으면 vmstat은 무한히 실행됩니다.

 

명령어 : vmstat 1 5

1초 간격으로 vmstat을 실행하며 5번이 출력됩니다.

 

출력된 데이터 설명

bi (Block In) : 블록인은 디스크에서 메모리로 데이터를 읽어올 때 발생한 블록 인(블록 스왑 인) 횟수 입니다. 블록인은 스왑 영역에서 데이터를 메모리로 가져올 때 작업을 의미합니다. 이 값이 높을 경우 디스크 I/O 부하가 높아질 수 있습니다.

 

bo (Block Out) : 블록 아웃은 메모리에서 디스크로 데이터를 쓸 때 발생한 블록 아웃(블록 스왑 아웃) 횟수 입니다. 블록 아웃은 메모리에 있는 데이터를 스왑 영역으로 내보낼 때의 작업의 의미합니다. 이 값이 높다면 메모리가 부족한 상태가 나타날 수 있습니다.

 

in (Interrupts) : 인터럽트는 초당 발생한 인터럽트 숫자를 의미합니다. 인터럽트는 하드웨어 장치나 소프트웨어 이벤트로부터 발생되는 중요한 이벤트로 시스템 리소스 사용 영향을 주고 있습니다.

 

cs (Context Switches) : 컨텍스트 스위치는 초당 발생된 컨텍스트 스위치 수를 의미합니다. 컨텍스트 스위치는 CPU가 다른 프로세스나 스레드로 전환될 때 발생하는 작업을 의미하며 다중 작업 환경에서 중요한 지표입니다.

 

us (User) : 사용자 모드 CPU 사용률은 CPU가 사용자 모드에서 작업을 처리하는데 소비한 시간 비율을 의미합니다. 사용자 모드에서 실행 중인 프로세스가 CPU를 얼마나 사용하느지를 나타내며 높은 값은 시스템 자원 관리에 시간이 많이 소요된다는 것을 의미합니다

 

id (idle) : 아이돌 상태는 CPU가 아이돌 상태일 때 사용하는 시간 비율을 의미합니다. 이 값은 CPU가 얼마나 여유롭게 대기하고 있는지 보여주며 높은 값은 CPU 자원이 더 여유롭게 사용 가능하다는 것을 의미합니다.

 

wa (Wait) : 대기상태는 CPU가 입출력 작업을 기다리며 대기하는 시간 비율을 의밉합니다. 이 값은 디스크나 다른 입출력 장치로부터 데이터를 기다리는 시간을 나타내며 높은 값은 입출력 병목이 발생할 수 있습니다.

 

st (Stolen) : 스톨 CPU 시간은 가상화 환경에서 사용되며 호스트 시스템에서 가상 머신을 위해 CPU 자원을 뺏길 시간 비율을 의미합니다. 스톨 CPU 시간은 가상 머신이 호스트와 CPU 자원을 공유할 때 발생하며 이 값이 높다면 가상 머신 성능이 저하될 수 있습니다.

 

(3) OS 튜닝이란 부하 원인을 알고 제거하는 것입니다

부하 계측 방법을 알았다면 OS 성능을 높이기 위해 튜닝을 살펴봐야 합니다.

관련글 더보기

댓글 영역