1つのコアに固定されたサーバー

1つのコアに固定されたサーバー

私はJavaでVert.xを使用しているサーバーで作業していますが、Ubuntu 12.04を実行している専用サーバーで実行されているいくつかのパフォーマンスの問題が見つかりました。

サーバーは着信HTTP要求を受信し、HMACを使用していくつかの認証を実行し、要求本文を解析し、いくつかのテキスト処理を実行し、UDPを介して他のサーバーにデータを送信します。ディスクI / Oがなく、比較的少量のメモリ使用量しかありません(スワップよりはるかに少ない)。 GrinderとAWSインスタンスを使用してサーバーをロードテストしていますが、サーバーがうまく装備されている場合でも、1秒あたり10,000を超えるリクエストを受信できません。

私が見たのは、サーバーシステムのコアの1つがほとんどコアに完全に固定されているのに対して、他のコアは20〜25%しか利用されないということです。私の前提は、CPUが着信TCP接続を受信するために使用されるということです。 JMXは私がほとんどの時間をio.netty.channel.nio.NioEventLoop.select()で過ごしたと報告します。ここではカーネルを待つと見なされますが、strace は futex() と epoll_wait() の時間に多くの時間を費やしたようです。サーバーのスループットを上げるためにカーネル設定を試しましたが、成功しませんでした。

アナライザが起動します。

アナライザSS ソースURL:https://i.stack.imgur.com/6wIZA.png

CPU使用量:

使用量 ソースURL:https://i.stack.imgur.com/9mM5u.png

この問題を解決するのに役立つようにカーネルレベルで調整できることを知りたいです。 TCPバッファのサイズ変更、ファイルハンドルの拡大、TCP機能のオフなどを試しましたが、役に立ちませんでした。サーバーオペレーティングシステムは実際にはXenで動作し、Xenは唯一の常駐オペレーティングシステムであるという点で「専用」です。

答え1

ご使用のアプリケーションと使用中のライブラリを再確認します。 Linuxカーネルに関する限り、JVMスレッドは、少なくともSun / Oracle JVM実装からLinuxの基本スレッド(軽量プロセス)として実装されます。

JVMは複数のスレッドを持つ単一のプロセスです。起動されるすべてのスレッドは、使用可能なすべてのコアで実行できます。 Linuxの単一プロセスには複数のスレッドがあります。

次のリソースを確認することもできます。

関連情報