그림 3과 그림 4는 각각 프로세스-코어 친화도에 따른 네트워크 I/O 성능과 인터럽트-코어 친화도에 따른 네트워크 I/O 성능을 나타낸다.
먼저 프로세스-코어 친화도의 경우 NC로 설정 하였을 때 가장 높은 성능을 보이고 있다. 그 원인으로는 데이터 지역성과 응용 프로세스 병렬성을 모두 보장해 주었기 때문인 것으로 예상된다. 반면 NS는 가장 낮은 성능을 보이고 있는데 역시 연구 배경에서 언급한 바와 같이 문맥 교환에 따른 오버헤드에 의한 것으로 예상된다. NZ는 NC에 비해 20% 정도 낮은 성능을 보이며 NS에 비해 30% 정도 높은 성능을 보이고 있는데 NZ의 결과를 통해 네트워크 I/O 성능을 위해서는 인터럽트 처리와 응용 프로세스의 병렬성을 우선하되 가능하다면 데이터 지역성을 함께 보장해 주어야 할 것으로 판단된다.
인터럽트-코어 친화도의 경우 NIC과 가까운 프로세서 패키지에서 인터럽트를 처리 하였을 때 더 나은 성능을 보이고 있는데 거리가 먼 프로세서 패키지(Package 1)의 경우 정상적인 결과로 판단하기 어려워(1.3Gbps, 40Gbps 속도의 3.3%) 계속해서 확인을 진행할 예정이다.
시스템 호출 수준의 네트워크 입출력 성능 개선은 응용 수준에서 socket() 이 호출될 때마다 Syscall Thread라고 불리는 독립적인 쓰레드를 생성하고 이 쓰레드가 네트워크 관련 시스템 호출을 전담하도록 하여 시스템 호출이 수행되는 코어와 응용 쓰레드가 수행되는 코어를 분리하고 이를 통해 사용자-커널 문맥 교환 과정에서 발생하는 캐시 오염을 줄인다. 또한, Syscall Thread를 네트워크 디바이스에 가까운 프로세서 패키지에서 수행되도록 하여 패키지 간 캐시 일관성 오버헤드를 감소시킨다. 시스템 호출 수준의 네트워크 입출력 성능 개선은 시스템 호출 라이브러리를 재정의 하여 기존의 커널이나 응용을 변경하지 않고 사용할 수 있도록 구현하였다.
제안된 구조는 응용과 시스템 호출 문맥을 분리하고 시스템 호출 문맥이 수행되는 코어를 네트워크 디바이스가 연결된 프로세서 패키지로 고정하여 문맥 전환 시 발생하는 오버헤드를 줄이고, 프로세서 패키지 간 캐시 일관성 오버헤드를 줄이고자 한다. 그러나, 제안된 디자인은 응용 쓰레드와 Syscall Thread 간의 메시지 통신으로 인한 오버헤드가 존재할 수 있다. 이러한 부작용의 영향을 분석하기 위해 마이크로 벤치마크를 통해 네트워크 대역폭과 지연시간을 측정해보았다. 마이크로 벤치마크는 시스템 호출을 집중적으로 사용하기 때문에 실제 응용 동작 패턴과 비교했을 때 많은 메시지 통신이 발생된다. 따라서 마이크로 벤치마크를 이용한 성능 실험에서 기존의 리눅스와 비교하여 성능 향상을 보이기보다는 비슷한 수준의 성능을 기대하여 메시지 통신으로 이한 부작용을 점검한다.
마이크로 벤치마크를 통한 부작용 점검에서 성능 차이가 기존 리눅스와 비교하여 최대 약 4%의 성능 저하를 보였다. 이를 통해 부작용이 미미하다고 판단할 수 있다.
아래는 응용 수준의 벤치마크를 통해서 시스템 호출 수준의 네트워크 입출력 성능 구조와 기존 리눅스의 성능을 비교하고 성능 차이의 원인을 분석하기 위해 성능 측정 시간동안 프로세서 내장된 Performance Monitoring Unit 을 이용해 패키지 간 캐시 일관성 활동 수를 수집한 결과이다.
Apache와 Memcached를 통한 성능 실험에서 시스템 호출 수준의 네트워크 입출력 성능 향상 구조가 최대 약 30% 정도의 성능 향상을 보였으며, 이 때 패키지 간 캐시 일관성 활동 수 또한, 70% 수준으로 감소하였다. 제안된 구조를 적용하였을 때 패키지 간 캐시 활동 수가 감소한 이유는 시스템 호출 문맥들을 같은 프로세서 패키지에서 수행시켰기 때문인다. 향후에는 Syscall Thread를 위해 더 나은 친화도 정책을 연구할 예정이다.
코어 파티셔닝에서는 앞서 연구했던 응용프로세스 수준의 코어 친화도, 인터럽트 수준의 코어 친화도, 그리고 시스템 호출 수준의 코어 친화도를 통합하여 실제 네트워크I/O를 수행할 코어를 지정한다. 네트워크 장치가 연결된 I/O 버스를 소유한 프로세서 소켓에 포함된 코어에서 네트워크 I/O 인터럽트를 처리하고, 인터럽트를 처리하는 코어와 마지막 수준의 캐시를 공유하는 코어에서 응용과 분리된 시스템 호출을 처리하도록 한다. 또한 동일한 네트워크 연결에 대한 네트워크 장치의 이벤트 핸들러(Bottom half)와 시스템 호출을 같은 코어에서 실행하도록 하여 데이터 지역성을 높이고 캐시 일관성 오버헤드를 낮추었다.
네트워크 장치와 가까운 Package1의 0번 코어에서 인터럽트를 처리하도록 한다. 인터럽트를 처리하는 코어와 LLC를 공유하는 1~9 번 코어에서 시스템 호출 및 이벤트 핸들러(Bottom halves)를 처리하도록 한다. 그리고 부하가 적은 나머지 코어에서 응용스레드를 처리하도록 코어파티셔닝을 적용한 후에, Apache Web Server와 Hadoop MapReduce를 이용해 코어파티셔닝의 성능을 측정하였다.