성능업(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에만 국한된 문제가 아니며
어느방식을 사용하던, 실제로는 꼭 한가지 방식 한정적으로 작동 되지 않습니다.
추가정보
단순한 네트워크 모델을 대입시키면, 동시성은 하나의 장비 성능을 향샹시키는 스케일업,
병렬처리는 여러개의 장비를 활용하는 스케이아웃의 개념으로 확장이 될수 있습니다.
조금더 복잡한 네트워크 모델을 적용을 시키면 다른 해석이 가능합니다.
AKKA의 모듈중 Stream을 대입시키면 , 여러가지의 장치를 이용하여 단순한 병렬처리가 아닌
작업단위를 쪼개어 Flow정의하고 분산환경에서 동시성처리가 가능합니다.( StrameSinkAndFlows ) ,
병렬처리의 경우 Akka에서는 route 와 cluster 를 통해 문제해결이 가능합니다.