최근에는 엔지니어가 병렬 처리를 접할 기회가 이전에 비해 상당히 늘어난 것을 체감할 수 있다. 서버는 물론 PC에도 여러 개의 CPU가 탑재돼 있다. 이렇게 CPU 수가 늘어난 배경에는 소비 전력과 발열 문제가 있다. CPU 제조사가 클럭(Clock) 속도를 올리는 대신에 코어 수를 늘려서 이 문제를 해결하려고 방침을 전환했지 때문이다.
CPU라는 미시적인 관점에서 시스템 전체라는 거시적인 관점으로 눈을 돌리면, 대규모 웹 서비스에서는 방대한 수의 사용자 요청을 처리해야 하므로 수많은 서버를 배치해서 병렬로 처리하고 있음을 알 수 있다. 이처럼 주변에는 병렬 처리가 넘쳐나고 있지만, 무조건 병렬화한다고 해서 성능이 향상되는 것은 아니다. 예를 들어, CPU 코어나 서버를 병렬화할 때는 병렬화한 하드웨어를 늘리지 않고 어떻게 효율적으로 활용할지가 중요해진다.
여러 개의 물건이 일직선으로 나열돼 있는 것을 직렬, 두 줄 이상으로 나열돼 있는 것을 병렬이라고 한다. 예를 들면, 1차선 도로는 직렬, 2차선 이상의 도로는 병렬이다. 도로는 1차선이 여러 차선으로 분기하거나 여러 차선이 1차선으로 합류하기도 한다. 예를 들어, 고속도로 요금소에서 통과하는 차량의 속도가 떨어지고 혼잡해지기 쉬워서 하나 이상의 창구를 만들어서 병렬도를 높이고 있다.
합류점부터 시작되는 1차선 구간은 혼잡해지기 쉽고 합류점이나 분기점에서는 사고가 발생하기 쉽다. 1차선 구간은 전체 흐름을 느리게 만드는 원인으로 이른바 ‘병목 지점(Bottleneck)’이 된다.
어떻게 하면 혼잡 상황을 해결할 수 있을까? 3차선 구간을 4차선으로 만들어도 문제가 해결되지 않는다. 1차선 구간의 제한 속도를 3차선 구간의 세 배로 늘리면 혼잡도가 줄어들 수도 있다. 예를 들어 3차선 구간의 제한 속도가 60km/h라고 하면, 그 세 배는 180km/h이기 때문에 법정 제한 속도를 초과한다. 또, 만약 5차선이 합류한다고 하면 다섯 배 속도인 300km/h가 필요하지만, 이는 시판 중인 차량이 낼 수 있는 최대 속도를 초과한다. 결국, 해결책은 1차선 구간을 3차선으로 만드는 것이다.
이것은 컴퓨터 세계에서도 마찬가지다. CPU나 HDD 등이 하드웨어 성능은 제품에 따라 차이가 나지만, 성능이 아무리 좋은 하드웨어라도 혼자서 처리할 수 있는 양이 정해져 있다.
특정 기간 내에 하나의 CPU로 처리할 수 있는 양에는 한계가 있지만, 여러 개의 CPU를 배치하면 처리량을 늘릴 수 있다. 단, 다수의 CPU를 이용할 수 있는 처리여야 한다는 전제 조건이 있다. 분담해서 병렬화할 수 없는 처리는 CPU 코어를 아무리 늘려도 효과가 없다. 이때는 CPU 클럭 주파수를 올리는 방법, 즉 직렬 처리 속도를 올리면 고속 처리가 가능하다.
또한, 도로와 마찬가지로 처리 특성에 따라선 병렬화할 수 있는 것과 없는 것이 있다. 따라서 직렬 처리가 분기해서 병렬로 되거나, 다시 합류에서 직렬로 되기도 한다. 이 합류점, 직렬화 위치, 분기점이 병목 현상이나 문제가 발생하기 쉬운 지점이 된다. 병렬 처리를 할 때는 가능한 한 병렬화해서 직렬 부분을 줄이고, 어쩔 수 없이 직렬화해야 하는 경우에는 효율성을 높이는 것이 중요하다. 또한, 병렬화에서는 분담해서 일을 진행한 것을 다시 한곳에 모으는 데 오버헤드가 걸린다. 무리해서 병렬화하면 직렬 처리에 의해 속도가 느려지는 경우가 있다. 병렬화할 때는 오버헤드를 예상해서 어떤 부분을 병렬화할지 파악하는 것이 중요하다.
직렬/병렬의 중요 사항을 정리하면 다음과 같다.
웹 서버와 AP 서버에서의 병렬화
아래 그림은 웹 서버와 AP 서버 내부 처리를 간략화해서 표시한 것이다. 웹 서버에는 다수의 이용자가 접속하기 때문에 복수의 프로세스가 분담해서 병렬 처리를 하고 있다. AP 서버에서는 JVM 프로세스가 하나이지만 복수의 스레드가 병렬로 처리하고 있다.
Apache HTTP Server(이후 아파치)에서는 이번에 소개한 멀티 프로세스 모델 외에도 멀티 프로세스와 멀티 스레드를 모두 이용하는 하이브리드형도 있다. JVM 프로세스를 복수 가동하면 멀티 프로세스와 멀티 스레드를 이용할 수 있다.