タンデムコンピューターズ
タンデムコンピューターズ (Tandem Computers, Inc.) は、ATMネットワーク、銀行、株式市場その他のトランザクション処理を主とする用途向けに無停止コンピュータ(フォールトトレラント・コンピュータ)を製造していた企業である。無停止コンピュータは稼働時間をなるべく長くし、データ損失をゼロにすることを要求される用途で活躍する。1974年創業で、1997年まで独立企業として存続していた。現在はヒューレット・パッカードのサーバ部門に吸収されている。
タンデムの NonStop システムは独立した同一のプロセッサを複数使い、冗長な記憶装置群とコントローラ群を使い、ハードウェアの故障やソフトウェアの誤作動が起きた場合に自動的で高速な「フェイルオーバー」を提供する。
故障やデータが壊れることを考慮し全体に共有される部品がないような設計になっており、それは主記憶装置でも同様である。通常のマルチコンピュータシステムは共有メモリを使い、データを共有して動作している。しかし NonStop のプロセッサは高信頼の配線を経由してメッセージを相互に交換することで協調動作し、ソフトウェアは定期的なスナップショットをとって、メモリ状態のロールバックに備えている。
故障にうまく対処できるだけでなく、この何も共有しない (shared-nothing) メッセージングシステムはスケーラビリティが非常によく、巨大な負荷にも対応できる。プロセッサ数が倍になればシステムのスループットも倍になり、最大4000プロセッサを構成可能である。対照的に一般のマルチプロセッサシステムは共有メモリやバスやスイッチの性能で全体の性能が制限される。4から8プロセッサが一般的な限界であり、それ以上プロセッサを増やしてもシステム全体としての性能向上は見込めない。NonStop システムは、フォールトトレラント性よりもスケーラビリティが評価されて購入されることが多かった。より単純なミニコンピュータの技術で構築されていながら、IBMの大型メインフレームとも互角に競合できた。
フォールトトレラント性とスケーラビリティに加え、NonStop には業界最先端のSQL関係データベースが実装されており、ネットワークや地理的に分散したシステム群のための業界最先端のサポートが存在した。
タンデムコンピューターズは1974年、テキサス州出身のジェームズ・トレイビッグが創業した。トレイビッグはまずヒューレット・パッカードの HP 3000 コンピュータの部門のためにマーケティングチームを立ち上げ、オンライントランザクション処理 (OLTP) システムにおけるフォールトトレラント性の市場ニーズがあることを見つけた。しかし、HPはそのようなニッチのための開発には興味を持たなかった。次に彼はベンチャーキャピタルの1つクライナー&パーキンスに加わり、そこでタンデムの事業計画を作成した。トレイビッグは HP 3000 部門からマイク・グリーン、ジム・カッツマン、ジャック・ラストノといった中心的技術者チームを引き抜いた。彼らの事業計画は、停止することなくデータを決して失ったり壊したりしない極めて信頼性の高いシステムを構築することだった。あらゆる「単一障害点 (single point of failure)」を排除した新しいモジュール方式であり、フォールトトレラントでない通常のシステムに比べてそれほど大きなコスト増加にはならない。通常使われない待機系で冗長性を確保するフェイルオーバー型のホットスタンバイシステムよりも安価であり、スループット(処理能力)も高くなる。
それぞれの技術者はこのトリッキーな新設計の担当部分を迅速に進めていったが、他人の担当領域で進展があるとは思っていなかった。ハードウェアもソフトウェアも元になっているのは HP 3000 の設計であり、それを徐々に改良していく形で成り立っていた。HPからはさらに続々と技術者やプログラマがやってきた。カリフォルニア州クパチーノにあるタンデム本社は、HP 3000 部門のオフィスから400メートルほどしか離れていなかった。タンデムコンピューターズに最初に資金を提供したトム・パーキンスは、かつて HP 3000 部門のゼネラルマネージャを務めていた。
事業計画には、トレイビッグの価値観を反映した独特の企業文化についての考え方の詳細も含まれていた。
最初の設計である Tandem/16 のハードウェアは1975年に完成し、1976年5月、1号機がシティバンクに出荷された。
タンデムは1983年まで右肩上がりで成長を続けた。Inc. 誌は、タンデムをアメリカで最も急成長している公開会社と評したことがある。
35年以上に渡り、タンデムの主力製品である NonStop シリーズは、最初の T/16 フォールトトレラントシステムから互換性を保ちつつ発展し続けた。その間に、モジュラー・アーキテクチャやプログラミングレベルの命令セットアーキテクチャの面で3回の大きな変更がなされている。各シリーズの中で、半導体集積回路技術の進歩に対応して何度か大きな再実装が行われている。
メインフレームなどの当時の一般のシステムでは平均故障間隔 (MTBF) は数日のオーダーだったが、NonStop システムはその100倍の故障間隔で設計され、連続稼働時間は年単位となっている。それにもかかわらず、NonStop は一般のシステムと価格の上で競合可能な価格設定がなされた。当時のフォールトトレラントシステムが1CPUのメインフレームの4倍以上の価格設定だったのに対して、最小構成の 2CPUシステムは1CPUのメインフレームのほぼ2倍の価格であった。
最初のシステム Tandem/16 または T/16 は、後に NonStop I へと改称。2 から 16個のプロセッサで構成され、全体としてフォールトトレラントなクラスターを構成したものが1つのラックに収まっている。各CPUには共有されないローカルメモリとI/Oプロセッサがあり、CPU専用のI/OバスにI/Oコントローラ群が接続されていて、独自の二重化されたCPU間バス Dynabus で相互接続されている。ディスクコントローラやネットワークコントローラも二重化されており、CPUから2つのコントローラに接続すると同時に、コントローラからも2つのCPUに接続している。個々のディスクはミラーリングされており、2つの独立したディスクコントローラそれぞれに接続されている。あるディスクが故障しても、中身はミラーリングされたコピーによってアクセス可能である。CPU、コントローラ、バスなどが故障した場合、多重化されたもう一方のCPU/コントローラ/バスを通してディスクにアクセスし続けることができる。電源も多重化しており、一方が故障してもシステムはそのまま稼動し続ける。顧客のシステムの巨大な部品構成とそれらの複雑な相互接続は「マッキー図」と呼ばれる形で文書化された。これはタンデムの営業部門のデイヴィッド・マッキーが発明した記法である。多重化された各部品はいずれも待機系として無駄になることはなく、通常運用時のスループット向上に寄与するようになっている。
障害からの復旧だけでなく、T/16 は考えられるあらゆる間欠障害を素早く検出するよう設計されており、これを "fail fast" と称した。すなわち、データが壊れたとき、それが恒久的にデータベースやディスク上のファイルに書き込まれる前に検出して隔離する。T/16では誤り検出用に特別な回路が追加されており、若干コストを押し上げている。誤り検出のために主要部品を多重化するという方式(多数決方式など)は採用していない。
T/16のCPUは独自設計である。HP 3000 ミニコンピュータの影響を強く受けている。どちらもマイクロプログラム方式で16ビットのスタックマシンであり、セグメント方式の16ビット仮想アドレッシングを採用している。高水準言語でプログラミングすることを意図した設計で、アセンブリ言語は基本的に使わない。どちらも当初は低集積度のTTLチップで、1チップあたり4ビット幅のALUを4つ連結して16ビットのALUを構成していた(ビットスライス)。スタックのトップ部分がレジスタとして実装されており、他にメモリ上のスタックにアクセスするためのアドレスレジスタなどを備えている。どちらもオペランドのアドレスオフセットにハフマン符号を使い、多種多様なアドレスモードやオフセットを16ビットの命令フォーマットに稠密に収めるようになっている。命令フォーマットの短さをカバーするため、どちらも間接アドレス参照を多用する。どちらもALUを複数回反復使用して32ビットや64ビットのオペランドの計算をサポートしており、メモリ間の文字列操作もサポートしている。どちらもビッグエンディアンである。これらの特徴は、同じくスタックマシンだった バロース B5500-B6800 メインフレームを手本としていた。
T/16の命令セットは HP 3000 からは若干変更されている。T/16は当初からページ化仮想記憶をサポートしている。HP 3000 シリーズは、10年後にPA-RISCを採用するまでページング方式を追加しなかった。タンデムは2代目のマシンで32ビット・アドレッシングを追加サポートしたが、HP 3000 ではそれもPA-RISCまでサポートしなかった。ページング方式と大きなアドレス空間は、複雑で大規模なソフトウェアやアプリケーションにとって重要である。T/16ではスタックトップを表しているレジスタ群の扱いが HP 3000 とは異なっていた。HP 3000 ではスタックが深くなったときのレジスタからメモリへの転送、あるいはスタックが浅くなったときのメモリからレジスタへの転送はマイクロコードが行っており、全命令で余計なマイクロコード処理が必要だった。T/16ではそれをコンパイラに任せている。HP 3000 はCOBOLサポートのためにBCD演算を実装していた。T/16ではBCDと64ビット整数との変換命令のみを用意し、BCDを直接扱わないようにして単純化している。
T/16の各CPUは、TTL論理回路とSRAMを搭載した2枚の基板で構成されており、約0.7MIPSで動作する。同時にアクセスできるのは4つの仮想記憶セグメント(システムデータ、システムコード、ユーザーデータ、ユーザーコード)で、それぞれ最大128kBとなっている。16ビットのアドレス空間は出荷時点には主なアプリケーションでは既に小さすぎた。
T/16には当初 Tandem Application Language (TAL) という1つのプログラミング言語しかなかった。ハードウェアに依存した高効率のプログラミング言語で、オペレーティングシステムやコンパイラだけでなく、アプリケーションにも使われた。これは HP 3000 の System Programming Language (SPL) が元になっている。意味論的にはC言語に似ているが、文法はバロースのALGOLに基づいている。その後 COBOL74、FORTRAN、MUMPS をサポートした。
NonStop シリーズでは、システムのフェイルオーバモード実現の鍵であった独自オペレーティングシステム Guardian を搭載していた。他社はフェイルオーバーを実現する際に他のCPUでプログラムを再始動させていたが、Guardian では全ての処理はメッセージパッシングを使い、全ての操作でチェックポイントが設定された。結果として Guardian ではプログラム中の任意の位置から処理を再開することができる。これにはスタックベースのプロセッサがほとんど内部状態を持っていないために、プロセスをCPUからCPUに移動しやすいという点も影響している。全ての命令はスタックからデータを取り出し、演算結果をスタックに戻す。演算中に障害が発生したら、スタックを他のCPUにコピーして失敗した命令から処理を再開することができる。
NonStopシリーズのオペレーティングシステム (OS) は、UNIXや HP 3000 のMPEとは大きく異なる。当初 T/TOS (Tandem Transactional Operating System) と呼ばれていたが、間もなく Guardian と改称。ハードウェアの故障やソフトウェアの障害からあらゆるデータを守るという意味がこめられている。当時の一般的な商用OSとは異なり、Guardian はメッセージパッシングを基本としたプロセス間通信を採用しており、共有メモリは使わない。したがってプロセスがどのCPU上で動作していても同じ方式でやり取りできる。この方式は容易に大型のコンピュータ・クラスターにも拡張可能で、壊れたデータの影響が広がらないよう隔離するのにも役立つ。
プロセスや全てのトランザクション処理を行うアプリケーションプロセスは、マスタースレーブ構成になっていて、異なるCPU上でマスタープロセスとスレーブプロセスが動作する。スレーブプロセスは、マスタープロセスのメモリ状態を一定間隔でスナップショットしており、マスタープロセスで障害が発生した場合に作業を肩代わりして続行する。これにより、アプリケーションはCPUや周辺デバイスなどで障害が起きても、データを失うことなく処理を続行可能である。これにより、間欠的なソフトウェア障害からの復旧も可能となる。通常運用時、スレーブプロセスによる監視が若干のオーバーヘッドを伴うが、他のシステムでの100%の複写をとる方式よりもオーバーヘッドは少ない。初期の主なアプリケーションはこのようなチェックポイント型のコードを直接書いていたが、多くの場合タンデムが提供する抽象化ソフトウェア層を使い、詳細を隠蔽した形で書かれていた。
1981年、T/16 CPU は全て NonStop II に置き換えられた。T/16からの主な違いは、「拡張データセグメント」をユーザーが切り替えられるようにして特別な32ビット・アドレッシングをサポートした点である。これにより、その後10年間のソフトウェアの成長に備えることができ、T/16や HP 3000 に対して大きな優位に立つことになった。しかしレジスタは16ビットのままであり、アドレス空間を拡張したことで他の32ビットのミニコンピュータよりも通常のメモリ参照にかかる命令数が多くなってしまった。その後のNonStopは、この不十分な命令セットに悩まされることになる。また、NonStop II は内部データパスも拡幅しておらず、32ビットアドレスを扱うのに余分なマイクロコードの処理が必要だった。NonStop II CPUは3枚の基板で構成され、使用しているチップや設計はT/16とよく似ている。NonStop II はまた、磁気コアメモリからバッテリーでバックアップされたDRAMへと切り換えている。
1983年に登場した NonStop TXP CPU は、TNS命令セットアーキテクチャの全く新しい実装である。標準TTLチップとPLAで構成されており、CPUモジュールを4枚の基板で構成している。タンデムとしては初めてキャッシュメモリを採用した。32ビット・アドレッシングをより直接的に実装しているが、内部機構は依然として16ビットのままである。マイクロコードの改良で命令当たりにかかるサイクル数を減らしており、性能は2.0MIPSとなった。これまでと同じくラック型筐体で、コントローラ、バックプレーン、バス等も同じである。DynabusとI/Oバス群はT/16にはオーバースペックだったため、この新世代モデルでもそのまま利用できた。
TXP と同時期に新たに光ファイバーバスシステム FOX が導入された。FOX は複数の TXP や NonStop II を相互接続し、最大14ノードを分散配置したシステムを構築することができ、全体で最大224CPUとなる。これにより、大型メインフレーム並みの用途にも対応可能となった。Guardian はこのネットワーク上でもフェイルオーバーを行う機能を備えていた。また、従来からある長距離ネットワークリンクを経由して最大4000CPUの世界規模のクラスターを構成することもできる。
1986年、第3世代のCPU NonStop VLX がリリースされた。データパスを32ビット化し、クロック周波数を12MHzとして、性能を向上させている。ECLゲートアレイを採用し、3枚の基板でCPUを構成している。Dynabus も改良し、従来 13Mbit/sだった性能を40Mbit/sにした(2本合計の性能であり、ひとつのバスは20Mbit/s)。また、総延長を 1km から 4km に伸ばした FOX II もリリース。従来の FOX で VLX を従来機種(TXP や NonStop II)と混在させることができたが、FOX II は従来機種をサポートしていない。
タンデムが当初サポートしていたのは Enscribe という階層型データベースで、関係データベースではなかった。これを関係データベースへと発展させたのが ENCOMPASS である。1986年、タンデムは最初のフォールトトレラントSQLデータベース、NonStop SQL を導入した。NonStop SQL は全くの独自開発で、Guardian の機能を取り込んでノード間のデータ整合をとる機能を持っていた。NonStop SQL はシステムにノードを追加してもリニアに性能向上することで有名であった。当時の多くのデータベースの性能は 2CPU程度で飽和状態となることが多かったのである。1989年にリリースされたバージョンでは、トランザクションを複数ノードに分散展開する機能(2相コミット)が追加された。当時、概念としては確立していたが、実用システムとしては珍しい機能であった。現在は、この機能は主だったデータベースシステムでは標準となっている。後にタンデムのSQLデータベース部門はマイクロソフトに売却され、マイクロソフトがクラスタシステム技術を発展させるのに寄与した。
1987年、VLXのミニコンピュータクラスの小型マシン NonStop CLX もリリースされた。無停止コンピュータをローエンド市場にも広めることを目的とし、タンデムの大規模システムの遠隔サイトなどでの利用を意図していた。CLX は初期の TXP とほぼ同等の性能だがより小型で低価格化している。CLX は最終的には性能を向上させて1991年には VLX の 80% の性能を示した。VLX と CLX の違いは大きさと拡張性だけとなった。CLXのCPUはEDAで設計された6個のASICチップ(CMOS)で構成されている。CPUの中核となるチップは二重化されていて、ロックステップ実行によって誤りを早期に検出するようになっている。このようなチップ構成はピン数が最大の課題だった。マイクロコード、キャッシュ、TLBなどはCPU中核チップに外付けされるため、1つのバスをこれらで共有し、SRAMのメモリバンクもそのバスに接続する形となった。結果としてCLXは1命令に最低でも2クロックサイクルかかるようになった。
1989年、タンデムはメインフレームクラスの高性能だが高価なシステム NonStop Cyclone をリリース。CPUは自身でチェックを行う方式で、ECLゲートアレイを搭載した3枚の基板とメモリ基板で構成されている。マイクロプログラム方式だが、スーパースケーラであり、1サイクルで最大2個の命令を実行できる。2つの命令の組み合わせごとにマイクロコードのルーチンを用意することで実現している。非常に高速化したが、システムの基本設計は従来機種と変わっていない(16ビット・アーキテクチャである)。そのため同時に実行する2命令で、通常の32ビット・ミニコンピュータの1命令相当の仕事をする。Cycloneの筐体1つには4CPUが搭載され、筐体間を Dynabus の光ファイバー版で相互接続する。タンデムが実施したベンチマークによれば、Cyclone は CLX 800 の約4倍の性能であった。
ちなみに Cyclone が発表されたのは10月17日で、この日はロマ・プリータ地震があり、サンフランシスコが被害を受けた。タンデム本社も大きく揺れたが、人的被害はなかった。
1980年から1983年にかけて、タンデムは HP 3000 の影響から脱却すべく、ハードウェアとソフトウェアの全体を再設計することを試みた。コード名 Rainbow と名付けられたハードウェアは、32ビットのレジスタファイルを採用し、VAXより優れたものになることを目指している。主なプログラミング言語としては、Adaのサブセット TPL を採用。そのころ、Adaのコンパイラは最適化されていないものがかろうじて存在するだけだった。また、既存のTALで書かれたコードをTPLに移行させるための手段も全くなかった。OSとデータベースとCOBOLは全く新たに設計された。顧客から見れば全く無関係の新製品であり、ソフトウェア的にも互換性がない。ソフトウェア側の再設計は当初の計画よりも時間がかかった。ソフトウェアが完成したころには、NonStop TXP が Rainbow の性能を上回っていたため、Rainbowプロジェクトは破棄されることになった。その後タンデムは互換性と容易な移行経路の準備を重視するようになる。
Rainbowプロジェクトの一環で、クライアントサーバモデルのアプリケーション開発フレームワーク "Crystal" が開発されており、これが後に Cooperative Systems Inc から "Ellipse" の名で製品化されている。
タンデムは急成長するパーソナルコンピュータ市場に参入するため、1985年 MS-DOSベースの Dynamite というPC(ワークステーション)をリリースした。しかし、設計が独特でIBMのPCとは互換性がなかったため、単なる端末としてしか使い道がなく、早々に市場から撤退することとなった。
NonStop シリーズのOSはスケーラビリティ、信頼性、スペアのリソースを効率的に利用する能力で優れていた。しかし、小型でそれなりの信頼性のシステムを要望する顧客も多く、そのような顧客は慣れたUnix系OSと業界標準のプログラムを使いたがった。他社はそれに対してハードウェアのみで冗長性を持たせる多重化システムを提供していた。中でもそのようなシステムで成功していたのがストラタステクノロジーであり、同社のシステムはIBMの System/88 としても販売されていた。
そのようなシステムでは、予備のプロセッサは通常運用時のスループット向上に寄与せず、単にアクティブなプロセッサと全く同じ処理を「ロックステップ」方式で実行している。両方のプロセッサの結果に差異が生じると、障害が発生したことがわかる。したがって、アクティブなプロセッサ1個に対して、物理的に同一なプロセッサを2個用意して論理プロセッサを構成する必要があり、さらに自動フェイルオーバーで復旧するには論理プロセッサを3つか4つの物理プロセッサで構成する必要がある。このような方式はコストが3倍から4倍かかるが、CPUとして量産されているマイクロプロセッサを使えるため、コスト的に見合うようになっていた。
1989年、タンデムはこの市場向けに Integrity シリーズを投入した。CPUにはMIPSプロセッサを採用し、OSにはUnix系の "NonStop UX" を採用した。1991年、同じデータスレッドを3個の MIPS R2000 で実行させて1つの論理プロセッサを構成する Integrity S2 をリリース。3つのプロセッサの多数決で故障部品を検出する。クロック周波数が高すぎて正確にロックステップを同期させることができないため、多数決は割り込みの際に毎回行う方式だった。また、2個のプロセッサを1組としてさらにスペアの1組を持たせる方式の機種もある。2つのプロセッサがロックステップ実行を行い、結果に相違が生じるとそのペアが故障したと判断してスペアのペアに切り替える。1995年の Integrity S4000 は ServerNet(後述)を採用し、周辺機器なども NonStop シリーズと共通化するようになっていった。Integrity シリーズはNTTのCTRONプロジェクトに採用された。
1995年から1997年にかけて、タンデムはマイクロソフトと共同で Windows NT を使ったクラスターでのSQLの高可用化プロジェクトを行っている。このプロジェクトは "Wolfpack" と呼ばれ、1997年に成果として Microsoft Cluster Server が登場した。マイクロソフトはこの共同開発で大いに恩恵を被ったが、タンデムには何の利益もなかった。これに対応したタンデム製サーバは 2台分のパーツを1筐体に収納し、ハートビート用のネットワークをバスで直結し、障害検知が素早いのが謳い文句であった。しかし、内容は家庭用PC程度のパーツを納めていたに過ぎず、蓋を開けると、Micro-ATXマザーボードが2枚入っており、家庭用PCと大差ないのがありありと分かる。従って、性能も信頼性も低く、特にメモリに起因する障害が頻発した。
タンデムが1974年に創業した当時、コンピュータ企業は自前でCPUを設計して構築し、独自の命令セットや独自のコンパイラなどを使用するのが一般的だった。半導体集積回路はムーアの法則に従って年々発展し、CPUをワンチップに収められるようになり、結果としてさらに高速化・低価格化が進んだ。しかしコンピュータ企業にとっては、自前でCPUを設計し製造しようとすると、莫大な費用がかかるようになっていった。1991年には、他社と競合できるだけの性能のCPUを設計・生産できるのは、ごく一部の大企業だけとなった。タンデムはそれほどの大企業ではなく、NonStop シリーズのCPUを他社製マイクロプロセッサに切り替える必要に迫られていた。
HP の HP 3000 およびそのOSであるMPEの部門も同様な問題を抱えていたが、1986年に賢い手段を見出した。HPの研究所でRISC設計のCPUが設計され、必須でない部分を全てそぎとってワンチップに収めた。命令パイプラインを効率よく動作するよう設計しており、ECLを使った当時のメインフレーム並みの性能を発揮した。HP 3000 が使っていたマイクロプログラム方式のスタックマシンの何倍も高速に動作した。
しかし問題は、既存製品のベンダー、顧客、サードパーティー製ソフトウェアをどうやって移行させるかである。一部ソフトウェアは移植性を考慮して書かれており、単に再コンパイルすればよい。他のソフトウェアは再コンパイルだけでは移行できない。HPの研究所は、エミュレータやオブジェクトコードの自動変換で古いバイナリを新しいマシンで実行する方法を考案し、それを広く公開した。同様の技法はAppleがMC68000系からPowerPCへと移行する際や、DECがVAXからAlphaへ移行する際にも用いられた。
HP 3000 の移行計画での問題として、プロセッサの移行と同時にOSを新たな言語で書き直そうとしていた点がある。これについてはエミュレーションを使おうとはしなかった。しかし、この書き換えは予想していたよりも何年も長くかかった。そのため、HPのRISCプロセッサはMPEがリリース可能となる前に古くなってしまった。タンデムはこの間違いから学んだ。
ビジネス上の理由から、タンデムはHPのPA-RISCやサンのSPARCを採用できなかった。そこでミップスと提携し、R3000とその最適化コンパイラを採用することにした。その後、NonStop シリーズはMIPSアーキテクチャを採用し続けることになった。