다음 이전 차례

3. 구조 개요

3.1 무엇 처럼 보이는가?

내 생각에는 베오울프 슈퍼컴퓨터 구조를 기술하기위한 가장 좋은 방법은 실제 베오울프와 매우 비슷한 예를 드는 것이다. 그러나, 대부분의 시스템 관리자들에게 익숙한 것이어야 한다. 그 예로, 베오울프 시스템과 가장 근접한 것이 하나의 서버와 여러개의 클라언트들로 구성된 유닉스 컴퓨터 연구실 이다. 좀 더 구체적으로 말하면, 예를 들어 나는 USQ의 Faculty of Sciences에 컴퓨터 연구실에 재학중에 DEC Alpah을 사용하려한다고 하자. 이 서버 컴퓨터는 beldin이라 하고 클라이언트 머신들은 scilab01, scilab02, scilab03에서 scilab20까지 있다고 하자. 모든 클라이언트들은 Digital Unix 4.0 운영체제의 지역 카피본으로 설치되어있지만, 사용자 파일 공간 (/home)과 /usr/local은 NFS (Network File System)를 통해서 공유되어 진다. 각각의 클라이언트 각 /etc/hosts.equiv 파일에 서버나 다른 모든 클라이언트들 에대한 엔트리가 포함되어 있어서, 모든 클라이언트는 다른 곳으로 원격 쉘 (rsh)를 수행할 수 있다. 서버 머신은 모든 연구실에 대한 NIS 서버로서, 다른 머신들을 끼리 계정 정보를 공유한다. 어떤 사람이 scilab02 콘솔에 앉아서, 로그인하면, 그가 서버나 scilab15에 접속한다 해도 같은 환경을 가지게 된다. 이러한 이유로 모든 클라이언트는 똑같은 관점과 느낌을 가진다. 이 이유는 모든 머신에 같은 방법으로 운영체제가 설치되었고 설정 되었있고, 사용자의 /home과 /usr/local 영역 둘다 물리적으로는 서버에 있지만 클라이언트는 NFS를 거쳐서 엑세스 할 수 있기 때문이다. NIS나 NFS에 대한 더 많은 정보를 원하면 NIS와 NFS HOWTO를 읽어보기 바란다.

3.2 다른 노드를 어떻게 이용할 것인가?

지금부터 우리는 시스템 구조에 대한 어떤 생각을 가지고 있고, 컴퓨터 연구실에 있는 머신의 사용가능한 CPU 사이클들을 사용할 수 있는 방법을 찾아보기로 하자. 어떤 사람이 임의의 머신에 로그인 할 수 있고, 그들의 홈 디렉토리에서 프로그램을 실행할 수도 있지만, 같은 일을 원격 쉘을 가지고 여러 개를 실행 할수도 있다. 예를 들어, 우리가 1에서 10을 포함한 모든 정수 값의 평방근의 합을 계산할려고 한다. 이를 완벽히 실행할 sigmasqrt("소스 코드" 부분을 보아라)라는 간단한 프로그램을 작성을 한다. 1에서 10까지의 평방근 의 합을 계산하는 것을 실행하면:

[jacek@beldin sigmasqrt]$ time ./sigmasqrt 1 10
  22.468278
real    0m0.029s
  user    0m0.001s
  sys     0m0.024s
time 명령어는 이 작업 실행하는 wall-clock(끝마치는 시간)을 확인할 수 있다. 위에 보이듯이, 이 예제는 실행하데 작은 비율의 시간(0.029초)만 걸린다. 그러나, 1에서 1 000 000 000까지의 정수값의 평방근 합을 구할려고 하다면 어떻게 될까? 이것을 가지고 wall-clock 시간을 다시 구해보자.
[jacek@beldin sigmasqrt"]$ time ./sigmasqrt 1 1000000000
  21081851083600.559000
real    16m45.937s
  user    16m43.527s
  sys     0m0.108s
이 프로그램의 실행 시간은 꽤 길어졌다. 그러면, 어떻게 하면 일을 수행 하는 시간을 좀 더 빨리 할 수 없는가하는 질문을 하게될 것이다. 일을 어떻게 바꾸어야 wall-clock 시간이 최소로 될까? 확실한 대답은 일을 여러 개의 하위 일들로 나누어서 각각의 하위 일들을 모든 컴퓨터들에서 병렬로 수행하는 것이다. 우리는 작업을 크게 20개 부분으로 나누어서, 평방근의 한 범위를 계산해서 각각의 노드에 이 값을 더하게 했다. 모든 노드가 작업을 마치고 값을 반환할때, 20개의 결과를 모두 더해서 마지막 해를 얻게된다. 일을 수행하기 전에 모든 프로세스가 값들을 기록할 명명 파이프(named pipe)를 생성켰다.
[jacek@beldin sigmasqrt"]$ mkfifo output
  [jacek@beldin sigmasqrt"]$ ./prun.sh & time cat output | ./sum
  [1] 5085
  21081851083600.941000
  [1]+  Done                    ./prun.sh
real    0m58.539s
  user    0m0.061s
  sys     0m0.206s

약 58.5 초의 시간을 얻었다. 이 시간은 일이 시작할때 부터 모든 노드들가 계산을 마치고 각 결과를 파이프에 기록하는 시간까지를 말한다. 이 시간은 마지막 20개의 덧셈은 포함하지 않았지만, 매우 작은 시간이므로 무시할 수 있다. 우리는 병렬로 일을 수행함에서 의미심장한 향상이 있어음을 볼 수 있을 것이다. 위의 예제의 목적은 가장 간단한 병렬화되는 병행 코드의 방법을 보여주자는데 있다. 실제로 이와 같은 예는 매우 드물고 다른 기술 (PVM과 PMI API들)이 병행성을 이루는데 사용되지곤 한다.

3.3 베오울프가 COW와 어떻게 다른가?

앞에서 기술한 컴퓨터 연구실은 Cluster of Workstations(COW)의 완벽한 예이다. 그래서, 베오울프의 특징이 무엇이고 COW와 어떻게 다른가?를 알아 보자. 그렇게 다를 것은 없지만, 베오울프트는 약간의 독특한 특징들을 가진다. 먼저, 베오울프 클러스터에서 모든 클라이언트 노드들의 경우에는 키보드, 마우스, 비디오 카드, 그리고 모니터 조차 없다. 서버 노드, 콘솔 전용 노드, 또는 시리얼 콘솔에서의 클라이언트 노들의 모든 엑세스는 원격 접속을 통해서 이루어진다. 클라이언트 노드가 클러스터 외부의 머신을 엑세스하거나, 클러스터 외부의 머신이 클라이언트 노드를 직접 엑세스할 필요가 없기 때문에, 클라이언트 노드는 10.0.0.0/8 이나 192.168.0.0/13 주소 범위 ((RFC 1918 www.alternic.net/rfcs/1900/rfc1918.txt.html)와 같은 사설 IP 주소들이 일반적으로 많이 사용한다. 보통 두 번째 네트워크 카드로 외부로 연결되는 머신은 서버 노드만이 할 수 있다. 시스템을 사용하는 가장 일반적인 방법은 서버 콘솔에서 직접 엑세스하거나, 개인 워크스템이션에서 텔넷이나 원격 로그인으로 서버 노드를 엑세스한다. 서버 노드 상에서 사용자가 코드를 편집하고 컴파일 하고, 클러스터에 있는 모든 노드들에게 일을 시키게 된다. 대부분의 경우 COW은 밤에 병렬 계산하는데 사용되곤하고, 사람들이 사용하지않은 주말에 사용되기도 한다. 그러므로, 사용하지 않은 CPU 시간을 이용하는 것이다. 다른 관점에서 베오울프는 일반적으로 병렬 계산을 하기 위한 전용 머신이고 이러한 목적에 맞게 최적화되었다. 또한, 베오울프는 off-the-shelf 요소들로 이루어지고 주로 공개 소프트웨어를 사용하기 대문에 가격/성능 비가 매우 좋다. 여러 시스템을 가지고 있는 베오울프는 사용자가 베오울프 클러스터을 바라볼때 하나의 계산 워크스테이션 으로 보이는 특징을 가지고 있다.


다음 이전 차례