In my quest to collect a massive number of vintage and non-x86 machines, I recently picked up two Silicon Graphics workstations. I was pretty excited about this – as a teenager I had always been in awe of SGI and the amazing 3D their machines pumped out. As the originators of OpenGL and creators of some of today’s fastest supercomputers, SGI is one impressive organization.
The Operating System
One of the cool things about SGI stations besides their fast as hell (at the time) MIPS RISC processors is their operating system, IRIX. IRIX is a UNIX designed for the MIPS line and an X custom tailored to the SGI graphics chipset.
Photo of IRIX screen running a demo, GIMP, and a terminal
Another great feature of IRIX is built in clustering using array services. Like all clustering, this allows you share the processing power and memory of multiple IRIX workstations to accomplish tasks more quickly. Being an older OS, I was nervous the process would be difficult, but it wasn’t bad at all.
The following is what I did to create my “Excelsis” cluster, consisting of my two SGI workstations, Metatron and Gabriel:
- Install Array Services – array services can be found on the operating system disks that come with your workstation.
- Configure Your Array – IRIX comes with an arrayconfig script to generate the array configuration file, but chances are you’ll need to tweak it anyway, I find it easier to simply create the file in its entirety. The configuration file can be found at “/usr/lib/array/arrayd.conf”.
Each array this machine participates in must be defined in this file. The first is normally an array labeled “me” which consists only of the localhost. Any further arrays require a name, plus a list of all machines in the array, which each need their own label and IP address or address to contact them at.
array me
machine localhost
array excelsis
machine metatron
hostname "192.168.0.15"
machine gabriel
hostname "192.168.0.16"
According to the documentation, quotations are necessary for hostname. As can be seen, I have defined an array called “excelsis”, with two machines, one named “metatron” and one named “gabriel”. I then specified the IP address of each machine.
The default arrayd.conf file will define a number of array commands that can be run from the terminal. These are all well known UNIX commands such as top, ps, and who, only they can be run on the array as a whole, as opposed to just the local machine. E.g., running “array who” would list all users logged into the array (i.e. any machine connected to the array). Leave these commands where they are and jump to the end of the config file.
The end of the configuration file contains a “local” identifier that contains settings and defaults for array services running on the machine, such as the port array services listens on and the default array for array commands (remember, your machine can participate in more than 1 array. If you run an array command without specifying an array, it will default to the one specified here). You’ll want to change “destination array” to be the name of your default array. In my case, I changed it to “excelsis”. That’s it for this file!
- Configure Array Security – By default, your array will be configured to not allow connections from remote machines. This allows messages to be passed via MPI between programs running on your machine, but doesn’t allow for clustering. Edit the “/usr/lib/array/arrayd.auth” file, and you should see “AUTHENTICATION NOREMOTE”. You’ll want to change this to “AUTHENTICATION NONE” if you want any machine to be able to connect to your array (not secure, but may not be an issue if you’re running behind a firewall), or “AUTHENTICATION SIMPLE” if you’d like to setup private keys for each machine. If you go the simple authentication route, you’ll need to specify “HOSTNAME machine1.domain.com KEY 0x3817382771948” where machine1.domain.com is the address of the machine, and the hex string following KEY is the private key. You’ll need to specify this for all machines. These keys must match per machine on all machines in the array.
- Autostart Array Services – Now that you have your array services configured, you can tell IRIX to start it on bootup by enabling it in chkconfig. If you aren’t familiar with chkconfig, it is a special utility that configures whether various daemons should autostart at bootup or not. You can see a list of which daemons are currently set to start by running “chkconfig” with no arguments. To autostart array services, type “chkconfig array on”.
- Rinse, Repeat – You’ll need perform the above steps on every machine participating in the array. Assuming you have NFS starting before your array, I don’t see any reason why these configurations couldn’t be symbolically linked to one central configuration, but if you ever wanted machine specific settings you’d be out of luck. I simply edited the files on both my SGI workstations.
At this point, you can run an “array who” to see all people logged into your array and “array ps” to see all processes running on all your clustered machines. The fun really begins for programmers at this point, as you can make use of the MPI libraries to share tasks across multiple nodes in your cluster for parallel processing.
While IRIX is on its way out and the chances of needing to setup a cluster is slim, it can be a fun little project if you have a few SGIs kicking around. It would also be interesting to see the compatibility of passing MPI messages between IRIX and non-IRIX clusters. A project for another day!
Sorry for being dense, but is this cluster using ethernet networking or is it done via fibrechannel/NumaLink? I’m interested in hooking my O2, Indigo and other old SGI boxes I can collect into a cluster to run some 3d rendering as well as chugging away at Seti@Home, or protein folding calculations but I am only connecting via an ethernet hub…
Any advice you can give would be great!
Chance
p.s if you know where I can find a Crimson in the UK, I’m eager to find one!
This is all through TCP/IP, so ethernet (or PPP or whatever your stack is running on) will work fine, no need for NumLink (Which I believe is only available for a few SGIs anyway). I also wanted to do a render farm with mine (using Blender), but unfortunately my workstations were too old to run a version of Blender that supported this.
The toughest part is actually getting preexisting software to use the cluster – if you’re programming your own stuff you can use the libraries to share resources, but otherwise you have to have software that supports it. However, something like SETI or Folding at home is almost already clustered since those programs operate on the cloud concept anyway. But I would definitely try it with the 3d render farm if you can, I did find scripts out there that break up animations in Blender into multiple parts, and give different machines in the cluster each a part to do. Good luck!
I found this quite interesting and useful, thank you for the information. I have 4 octanes at home, i plan to get them all clustered in this manner and see wht I can get them to do. Thanks.