16GB RAM を搭載した 8 コア マシンで実験的なシステム セットアップのパフォーマンスを評価しています。私は 2 つのメイン メモリ Java RDBMS (hsqldb) を実行しており、これらのそれぞれに対して (jTPCC/BenchmarkSQL から派生した) TPCC クライアントを実行しています。
私は物事を起動するためのスクリプトを持っているので、例えば hsqldb インスタンスは以下で開始されます:
./hsqld.bash 0 &
./hsqld.bash 1 &
ほぼ同時にクライアントを起動した場合:
./hsql-tpcc.bash 0 &
./hsql-tpcc.bash 1 &
次に、これらの各クライアントの初期レートが約 500 ~ 1000 tpmC (基本的には 1 分あたりのトランザクション数) で急上昇し、その後すぐに (1 秒以内に) 約 200 ~ 250 tpmC のレートに落ち着きます。OTOH、2 番目のクライアントを開始する前に 1 ~ 2 秒待つと、次のようになります。
./hsql-tpcc.bash 0 &
sleep 1
./hsql-tpcc.bash 1 &
次に、各クライアントは 2500+ tpmC で実行されます。1 秒以上待っても、それ以上の違いはありません。
クライアント 0 はサーバー 0 と通信し、クライアント 1 はサーバー 1 と通信するだけなので、これは奇妙です。なぜこのような劇的なパフォーマンスの干渉があるのかは不明です。
これはクライアントの CPU スケジューラ アフィニティによるのではないかと考えましたが、低速で実行するとシングル コアの約 1 ~ 3% しか使用しません (高速で実行すると 20 ~ 25%)。別の疑いは、クライアントの NUMA バインディング (同じメモリ ノードでのメモリ競合) にありましたが、マシンにはメモリ ノードが 1 つしかなく (/sys/devices/system/node/node0 しかありません)、さらに各クライアントはわずか 0.8% しか使用していません。メモリの。
また、hsqldb インスタンスの CPU バインディングが原因であるとは思われません。クライアントを再起動するだけで (そして 1 秒間待機する/待機しない)、高速と低速の両方の動作が見られ、両方で同じ hsqldb インスタンスが実行されたままになるためです (つまり、 hsqldb を再起動する必要はありません)。hsqldb は、低速の場合は 4 ~ 8% の CPU、高速の場合は 80% の CPU、および 4.3% のメモリを消費します。
なぜこれが起こっているのか、他のアイデアはありますか?ディスク IO は関係なく、システムのメモリを使い果たすことはほとんどありません。前もって感謝します。その他の関連情報は次のとおりです。
$ uname -a
Linux hammer.csail.mit.edu 2.6.27.35-170.2.94.fc10.x86_64 #1 SMP Thu Oct 1 14:41:38 EDT 2009 x86_64 x86_64 x86_64 GNU/Linux