Load Average에 대하여

    Load Average에 대하여



    Load 

    Load Average는 말 그대로 Load 값의 평균을 나타낸 수치를 의미한다.

    이를 이해하기 위해서는 먼저 Load가 무엇인지에 대해 알아야 한다

    Load는 우리말로 부하로 표현 된다


    Process

    프로세스는 흔히 작업(Task)으로도 불리운다.

    어떠한 명령을 수행하기 위해 코드와 거기에 필요한 데이터 값의 덩어리를 객체로 표현한 것이 프로세스이다

    프로세스가 시스템에서 처리되기 위해서는 CPU(Processor) 연산을 필요로 한다.

    하지만, Cpu는 물리적으로 한정적인 자원이기 때문에 이를 특정 프로세서가 독점하지 못하다록 OS(Linux)는 프로세스 스케줄러를 통해서 조절하게 된다.

    멀티(MuLTI)프로세서는 CPU 자원이 1개 이상일 뿐이지 근본적으로 한정적 자원이라는 점에서는 변함이 없다.


    - 프로세스 스케줄러는 프로세서에 대한 디스크립터(기술자 - Descriptor)를 두고 관리를 하는데 프로세스 스케줄러에 의해서 관리되는 프로세서는 디스크립터에 아래와 같은 상태값을 갖게 된다


     상태값

    의미

    TASK_RUNNING

    실행가능 상태로 언제든지 CPU에 의해서 처리가 가능한 상태이다.

    즉 CPU에 의해서 실행 중(RUNNING)일 수도 있고 가능한 상태(RUNNABLE)일 수도 있다

    TASK_INTERRUPTIBLE 

    인터럽트(Interrupt)에 의해서 언제든지 상태가 변할 수 있는 대기 상태이다.

    일반적인 대기상태를 의미한다

    TASK_UNINTERRUPTIBLE 

    인터럽트에 의해서 상태가 변경되지 않는 대기 상태이다. 

    즉, 현재 대기의 대상이 끝날때 까지 방해 받지 않고 대기하는  상태이다.

    보통 I/O 처리에 대해서 대기 중인 상태이다

    TASK_STOPPED

    동작이 중단 된 상태이다

    일시 정지 된 상태로 재개 시그널을 받을 때 까지 멈춰있게 된다

    터미널에서 전면(Foreground)에 실행 중인 프로그램에 대해서 컨트롤 Z를 입력하면 이러한 상태로 진입하게 된다



    보다 더 많은 상태 값이 존재하지만 여기서는 생략하도록 한다. 

    커널 소스의 include/linux/sched.h 파일을 참조하지. 프로세스의 상태 값은 보통 아래와 같은 과정에 의해서 상태가 변경된다.



    Process Scheduler

    좀 더 구체적인 프로세스의 상태 변화를 살펴보도록 하자.

    먼저 4개의 프로세스 A,BC가 있고 각각의 프로세스는 아래와 같다


    A : 복잡한 수식을 계산하는 프로세스 (우선순위가 보통)

    B : 사용자가 SSH를 통해서 접속한 Bash 프로세스 (우선순위 보통)

    C : 네트워크로부터 받은 데이터를 로그파일에 기록하는 프로세스(우선순위가 가장 높음)



    스케줄러에 의해서 A,B,C프로세스는 순서대로 큐에 준비된다 

    프로세스는 막 실행되었기 때문에 TASK_RUNNING 상태를 갖고 있다 (1)


    먼저 스케줄러가 A 프로세스를 CPU에 할당하여 처리하도록 한다.

    이 상황에서 여전히 프로세스 A는 B,C와 똑같은 RUNNING 상태이다. 차이점은 스케줄러에게 선택받아서 CPU 자원을 사용 중에 있다는 점이다 (2)


    일정 시간이 지나면 스케줄러는 타이머(timer)를 통해 A 프로세스를 중단시키고 다시 큐에 넣게 된다

    이제 B가 CPU를 사용할 차례가 온 것이다.(3)


    하지만. B는 사용자가 터미널에 아무런 입력을 하고 있지 않기에 이내 곧 TASK_INTERRUPTIBLE 상태로 바뀌고

    대기하게 되며 바로 C에게 CPU 사용 차례를 넘기게 된다(3)


    프로세스 C는 받은 데이터를 로그파일에 기록하기 위해서 파일 디스크립터에 데이터를 쓰게된다.

    이 과정에서 디스크로 부터 응답을 기다리게 되며(실제로는 캐시 등에 의해서 바로 Write 작업에 대해 응답을 받기 때문에 대기하지는 않지만 본 예시는 이해를 돕기 위함이므로) TASK_UNINTERRUPTIBLE 상태로 바뀌게 된다.(4)



    프로세스 스케줄러는 디스크 응답을 기다리고 있는 프로세스 C에서 프로세스 A에게 다시금 CPU 사용권한을 주게 된다.(5)


    프로세스는 A가 CPU를 통해서 연산작업을 수행하고 있는 중에 프로세스 C가 디스크로부터 응답을 받고 TASK_RUNNING 상태로 바뀌며 스케줄러에 의해서 프로세스 C가 CPU 상ㅇ권한을 획득하게 된다.(6)



    실제 프로세스 스케줄러는 이보다 훨씬 복잡한 방식을 통해서 수행되지만 이해를 위한 간단한 예시라고 보면 된다.

    이제 위의 과정에서 CPU 자원을 사용하기 위해서 각 프로세스가 기다렸던 시점을 생각해 보자

    프로세스A가 CPU를 처음 사용 중일 때 B,C는 TASK_RUNNING 상태에서 자기 차례를 기다리고 있으며,

    프로세서 B는 스케줄러에 의해 자기 차례가 왔지만 이내 사용자 입력을 기다리는 상태로 바로 차례를 넘기게 되었다. 이 때에도 프로세스 A, C는 차례를 기다리고 있었다.

    프로세스 C 차례에서는 디스크에 기록한 데이터처리가 끝나기를 기다리게 되었고 이내 A에서 차례를 양보하게 되었다


    위의 예시를 보면 TASK_RUNNING 상태(CPU 사용주인 프로세스 제외)와 TASK_UNINTERRUPTIBLE 상태가 실질적으로 자기 차례가 되기를 기다리는 상태라고 볼 수 있는데 Load 값은 이 TASK_RUNNING과 TASK_UNINTERRUPTIBLE 상태에 있는 프로세스를 수치로 표현 한 값 이다


    정리하면 처리를 위해서 기다리는 상태의 프로세스를 Load로 표한 한 것이다

    '용어' 카테고리의 다른 글

    아파치(apache)와 톰캣이란?  (0) 2017.01.16
    웹 동작방식  (0) 2017.01.15
    MYSQL이란?  (0) 2017.01.15
    데이터베이스  (0) 2017.01.12
    개체-관계 모델(ER 모델)  (0) 2017.01.12
    Posted by 서버이야기