You are viewing an old version of this page. View the current version.

Compare with Current View Page History

« Previous Version 19 Next »

성능업(ScaleUP)  VS 분산처리(ScaleOUT)

ScaleUP


 노드1의 장비 성능을 높이기위해 사용되는 여러가지 행위임

최종적으로 전체 장비의 개수를 줄이는 데 목적이 있으며,

장비의 고효율 IO처리, 효율적메모리관리및 CPU사용 최적화등의 튜닝 기술등이 이용될수 있으며

외적으로는 고성능 장비 도입역시 같은 의미가 될수 있습니다.

ScaleOut


 측정된 노드1의 성능을 베이스로, 대용량처리를 위해 노드를 수평적으로 확장해 나갈수 있는 행위이며

다른 서비스 의존성으로인한 병목현상으로 실제는 확장수만큼 성능이 올라가지는 않습니다. 

이러한 손실을 줄이고 확장을 통한 성능향상을 위해 여러가지 클러스터및 분산저장 기술등이  이용됩니다.

외적으로는 장비를 병렬적으로 늘리고 효율적으로 관리하는 방법도 포함될수 있습니다.


동시성(Concurrency)  VS 병렬처리(Parallelism)

동일시간(성능적차이를 제거하고)에 여러가지 작업을 동시에 처리한다란 점은 동일하지만

작동방식에는 약간의 차이가 있습니다.

쉬운 이해를 위해, 네트워크 모델을 제거하고 단일 PC에서의 차이를 살펴보겠습니다.


concurrency



동시성의 경우,  본질적으로 작업이 동일시간(나노세컨)에 동시에 실행되지는 않습니다. 작업이 작은 단위로 조각이 난상태로 

context 스위칭이 일어나면서 일시정지, 실행을 반복하게 됩니다. 하나의 코어에서 다중 쓰레드 형태로

작업단위가 쪼개져서  반복되면서 상태를 복구하면서 작동하게되는 케이스입니다. 

하나의 Task에대한 성능을 높이기보다,제한된 자원으로 전체적인 총량에 대한 처리에대해 효율을 높이는데 의미가 있습니다.

Task task1;
Task task2;
Task task3;


task1.Start();
task2.Start();
task3.Start();
//물론 이 코드는, 실행 최적화에의해 다중코어로 병렬처리가 될수 있습니다. 
//Task의 개수가 코어개수를 초과했을시 동시성 설명이 가능합니다.
//Core와 Task의 개수가 같다고 해도, 한가지 Task가 특정 Core에만 작동되어야하는 룰은 없음 ( 개발로직은 신경쓰지 않은체 OS 실행 최적화에 따름 )


Parallelism



병렬처리의 경우 작업을 명시적으로 여러개의 물리(코어)적 연산 장치에의하여 동시에 처리하는 방식입니다.

가용한(풍부한) 자원을 바탕으로, 여러가지 작업을 한꺼번에 수행할수가 있습니다.

//병렬처리를 위한 멀티 코어 프로그래밍 예 

Thread[] threads = new Thread[NumOfThread];

Process currentProcess = Process.GetCurrentProcess();
foreach (ProcessThread processThread in currentProcess.Threads) 
{ 
processThread.ProcessorAffinity = currentProcess.ProcessorAffinity;
}


for (int i = 0; i < NumOfThread; i++) 
{ 
threads[i].Join(); 
}
}
//명시적으로 특정 Task를 독립적인 물리적으로 처리가능한 단위(CPU Core)에게 명시적 작업을 위임했을때 완전한 형태의 병렬처리임 ( Task수는 Core개수를 넘지 않는 조건)


 주어진 시간에 작업을 나눠 동시에 처리하느냐(동시성)?  자원을 바탕으로 한꺼번에 처리하느냐(병렬)? 의 문제는 CPU에만 국한된 문제가 아니며

어느방식을 사용하던, 실제로는 꼭 한가지 방식 한정적으로 작동 되지 않습니다. 


추가정보

단순하게 네트워크 모델을 대입시키면,

하나의 장비에 어떻게 여러가지 일을 효율적으로 시킬것인가? (동시성)

여러가지 장비에 어떻게 단일 작업을 배분하여 시킬것인가? ( 병렬처리)


조금더 복잡한 네트워크 모델을 적용을 시키면 새로운 해석이 가능합니다.

여러가지 장비에 ,여러가지 작업에대한 서브Task를 어떻게 나눠서 동시에 시킬것인가? ( 동시성과 병렬처리)

Akka에서는 StrameSinkAndFlows+Cluster 조합으로 이러한 문제를 풀려고 하고있습니다.



Synchronous vs. Asynchronous

Synchronous(동기)


메서드 호출후 값이 반환되거나, 예외가 throw될때까지 호출자가 진행할수 없는 경우

Asynchronous(비동기)


메서드 호출후  호출자는 몇가지 메카니즘(완료및 진행 등록된 콜백)을 통해 알수있으며

진행이가능 합니다. 동기구현을 목적으로 블로킹(Result)기능을 사용할수 있지만

일반적으로 비동기 API로 설계하는것은 시스템이 진보할수 있음을 보장함으로 선호됩니다.

액터는 본질적으로 비동기입니다.


Non-blocking vs. Blocking


한 스레드의 지연이 다른 스레드를 무기한 지연 시킬수 있을때 블록킹되었다라고 표현함

예를 들면 상호배제(mutual exclusion)을 사용하여 하나의 스레드가 독점할시 자원을 공유하고있는

다른 스레드가 진행될수 없는경우 

논블록킹은 이와 반대되는 개념으로, 어떠한 스레드도 다른것들을 무기한 연기할수 없다란것을 의미합니다.

블록킹 작업포함시 전반적인 작업진행이 쉽게 보장이 되지 않기때문에, 논블록킹 작업방식으로의 설계가 추천됩니다.

Deadlock vs. Starvation vs. Live-lock




Race Condition



Non-blocking Guarantees (Progress Conditions)



Wait-freedom


Lock-freedom


Obstruction-freedom







  • No labels