3

Ubuntu 12.04 LTS

java -version
java バージョン "1.6.0_38"
Java(TM) SE ランタイム環境 (ビルド 1.6.0_38-b05)
Java HotSpot(TM) 64 ビット サーバー VM (ビルド 20.13-b02、混合モード)

4 コア CPU - 一部の Dell サーバー ハードウェア

10 個のスレッドが、「重い」ジョブを数分間にわたって実行することがあります。他の時期には、彼らは何もしていません。
1 つのスレッドが 5 秒 (またはその程度) ごとにウェイクアップし、ネットワークを介して別のプロセスにクイック ping を送信することになっています。これは、他の 10 個のスレッドが何もしない限りうまく機能しますが、他の 10 個のスレッドが「重い」ジョブを実行している場合、実行されず、ping が送信されることはほとんどありません。

この「重い」ジョブが CPU を集中的に使用する場合、これは理解できます。しかし、そのような「重い」ジョブの間、top は 50-100% の IO 待機のようなものを言いますが、CPU 使用率は約 1% です。プロファイリングによると、10 個のスレッドで費やされた時間のほとんどが NIO 呼び出しに費やされています (おそらく待機中です)。これはすべて合計され、ディスクからファイルを読み取ることが仕事の多くの重さであるため、ちょっと期待されています。

私が理解していないのは、そのような「重い」ジョブ中に、ping を実行している 1 つのスレッドが実行されないことです。top が 1% の CPU 使用率を示し、(プロファイリングと top) 10 個のスレッドがほとんどの時間を IO の待機に費やしているように見える場合、それはどのように説明できますか。他のスレッドが IO を待機しているときに、1 つの ping スレッドが実行時間を取得するはずではありませんか?

Java スレッドの優先順位は、11 個のスレッドすべてで同じです。

10 個のスレッドのあちこちにいくつかの利回りを分散させると問題が解決 (または低下) するようですが、他のスレッドがあまり処理を行わずに待機している場合に、利回りがないと ping スレッドが実行されない理由がわかりません。 IO用。

追加情報 05.03.2014

単純な設定で問題を再現しました - まだそれほど単純ではありません (Apache Zookeeper サーバーのインストール方法を見つける必要がありますが、かなり単純です - 後で情報を提供できます)。

ここで Eclipse Kepler プロジェクトを見つけます (maven - "mvn package" でビルド): https://dl.dropboxusercontent.com/u/25718039/io-test.zip
ここでバイナリを見つけます: https://dl.dropboxusercontent.com/u /25718039/io-test-1.0-SNAPSHOT-jar-with-dependencies.jar

マシンで Apache ZooKeeper 3.4.5 (ポート 2181) サーバーを起動します。別の別のマシン(これは、上記のようにUbuntu 12.04 LTSなどがある場所です)で、次のようにバイナリを実行します(最初にフォルダーio-test-filesを作成します-50GBのスペースが必要です)

nohup java -cp io-test-1.0-SNAPSHOT-jar-with-dependencies.jar dk.designware.io_test.ZKIOTest ./io-test-files 10 1024 5000000 IP-of-ZooKeeper-server:2181 > ./io-test-files/stdouterr.txt 2>&1 &

最初に 10 個の 5GB ファイルを作成し (50GB はマシンの RAM よりもはるかに大きいため、OS ファイルキャッシュはあまり役に立ちません)、次に ZooKeeper クライアントを開始します (ping/ハートビートを定期的に送信して ZooKeeper サーバーとの接続を維持することになっています)。 、次に10個のファイルにランダムアクセスを行う10個のスレッドを作成し、多くのディスクIOを作成しますが、実際にはCPUの実際の使用はありません。ZooKeeper クライアントが最終的に接続を失うことがわかります (「Zk 状態」-stdouterr.txt で「接続済み」と表示されなくなります)。これは基本的に私が理解していないことです。ZooKeeper クライアント スレッドは、数秒間隔で小さなハートビートを送信するだけで、20 秒以内に送信できない場合にのみ、接続が失われます。CPUに簡単にアクセスできると思いますが、

テスト中に、「top」を使用して次のように表示されます

  • 非常に高い「負荷平均」。基本的に何かを実行しているスレッドは 10 個しかないため、10 を超えるとわかりません。また、「負荷平均」は実際にCPUで実際に処理したいスレッドのみをカウントすると考えました(IOの待機は含まれません)が、http://en.wikipedia.org/wiki/Load_%28computing%29 Linuxによるとまた、IO を待機しているスレッドを含む「中断できないスリープ」もカウントします。しかし、実際にやるべきことを持っている他のスレッドがCPUを手に入れるのを妨げるとは本当に望んでいない/考えていません
  • 非常に高い %wa ですが、CPU の %sy と %us はほとんどありません

これが私の実行の1つからの出力です: https://dl.dropboxusercontent.com/u/25718039/io-test-output.txt

4

0 に答える 0