2014년 11월 14일 금요일

QNX Neutrino APS 사용하기

항상 네트워크 throughput이 10MB/s 이상을 유지해야 하는 장치를 만든다고 가정하자. 테스트 결과 선택된 시스템의 최고 네트워크 throughput은 60MB/s다. 사용자가 네트워크 기능만 사용한다면 througput이 충분하여 별 문제가 없을 것이다.  하지만 시스템이 다른 작업을 동시에  수행하게 되면 네트워크 througput이 10MB/s 이하로 떨어지는 상황이 발생할 수 있다. 이를 해결하기 위한 간단한 방법은 네트워크 througput 관련된 프로그램의 우선 순위를 높이는 것이다. 하지만 이렇게 할 경우 단지 10MB/s 정도만 유지해도 별 문제가 없는 네트워킹 기능에 필요이상의 CPU가 할당되면서 다른 기능이 원활하게 동작하지 못하는 상황이 발생할 수도 있다. 즉  10MB/s 정도의 througput이면 충분한데 네트워킹 쪽 우선순위가 높아 항상 60MB/s의 성능을 내도록 시스템이 동작할 것이다.

위와 같은 경우 10MB/s 정도의 througput을 처리할 수있는 별도의 전용 CPU가 있으면 어떨까?  QNX의 APS(Adaptive Partitioning Scheduler) 는 한개의 CPU를 논리적으로 여러개의 파티션으로 나누어 위와 같이 특정 프로그램를 위한 전용 CPU로 사용할 수 있도록 해준다(Partitioning).

예를들어 CPU의 총 성능 중 20%만 사용하면 네트워크 througput 10MB/s가 달성된다면 CPU를 80:20로 나누어 네트워크 관련 프로그램을 20% 영역에서 실행시키는 것인다.  이 경우 나머지 프로그램은 80%영역에서 실행되며 사용자가 느끼기에는 마치 서로 영역별로 별개의 CPU를 사용하는 것처럼 스케쥴링이 이루어진다.

이 기능이 제공하는 더 좋은 점은, CPU가 100% 풀 로드가 아닌 상황에서는 파티션이 가변적(Adaptive)으로 동작한다는 점이다. 즉 시스템에 네트워크 기능이 동작하지 않을때는 80%영역에 있던 프로그램이 20%영역의 CPU를 사용할 수 있으며, 반대로 80% 영역에 여유가 많을 때에는 네트워크 관련 프로그램이 80%쪽 CPU를 끌어다 사용할 수 있다.

APS 기능을 사용하려면 IFS 이미지 빌드 스크립트에 아래와 같이 [module=aps]를 추가하여 IFS를 빌드하여야 한다.
[module=aps] PATH=/proc/boot:/bin:/usr/bin:/opt/bin  LD_LIBRARY_PATH=/proc/boot:/lib:/usr/lib:/lib/dll:/opt/lib procnto-instr
즉, 만일 현재 사용중인 IFS가 [module=aps]가 없이 빌드된 것이라면 IFS를 바꿔야 한다.

APS 기능은 아래와 같이 실행시킬 수 있다.



위 예제에서는 inetd에 20%의 CPU가 할당되었다. QNX에서 실제로 네트워킹은 io-pkt가 담당하게 되는데, 이 경우에 io-pkt는 서버, inetd는 클라이언트가 된다.  위 예에서 io-pkt가 System쪽에서 실행되었다고 가정하면 inetd의 요청을 받은 io-pkt 서버는 비록 시스템 파티션에서 실행 되었지만 Network partition에서 CPU를 사용하고 inetd 이외의 프로그램이 요청한 네트워크 요청만 System partition에서 수행이 된다.

댓글 없음: