21

私の Web サーバーは、通常の Java I/O と接続メカニズムごとのスレッドを使用しています。現在、彼らはユーザーの増加 (ロングポーリング接続) にひざまずいています。ただし、接続はほとんどアイドル状態です。これは Web サーバーを追加することで解決できますが、私はNIOの実装についていくつかの調査を試みています。

私はそれについて複雑な印象を受けました。Linux の新しいNPTLライブラリを使用した通常の I/Oが NIO より優れているというベンチマークについて読んだことがあります。

Java I/O で Linux 用の最新の NPTL を構成して使用する実際の経験は何ですか? パフォーマンスの向上はありますか?

そして、より大きな範囲の質問について:

標準サーバー クラスのマシン (クアッドコア プロセッサを搭載した Dell) で (Linux NPTL ライブラリを使用して) 正常に実行されると予想されるI/O およびブロック スレッド ( Tomcatスレッド プールで構成する) の最大数はいくつですか? スレッドプールが非常に大きくなった場合、たとえば 1000 スレッドを超えると、どのような影響がありますか?

参考文献やポインタは非常に高く評価されます。

4

3 に答える 3

17

挑発的なブログ投稿、「NIO を回避し、スループットを向上させます。」 Paul Tyma (2008) のブログでは、問題なく 5000 スレッドまであると主張しています。私は人々がもっと主張するのを聞いた:

  1. NPTL をオンにすると、Sun と Blackwidow の JVM 1.4.2 は 5000 以上のスレッドに簡単に拡張できます。ブロッキング モデルは、NIO セレクターを使用するよりも一貫して 25 ~ 35% 高速でした。EmberIO 関係者によって提案された多くの手法が採用されました。複数のセレクターを使用し、最初の読み取りが Java で同等の EAGAIN を返した場合に複数 (2) の読み取りを行います。それでも、Linux NPTL を使用した接続モデルごとのプレーン スレッドを打ち負かすことはできませんでした。

ここで重要なのは、オーバーヘッドとパフォーマンスを測定し、必要性があり、改善を示すことができる場合にのみ、ノンブロッキング I/O に移行することだと思います。ノンブロッキング コードを作成して維持するための追加の作業は、決定の際に考慮する必要があります。私の見解は、同期/ブロッキング I/O を使用してアプリケーションをきれいに表現できる場合は、 DO THATです。アプリケーションがノンブロッキング I/O に適していて、アプリケーション空間でブロッキング I/O をひどく再発明するだけではない場合は、測定されたパフォーマンスのニーズに基づいて nio に移行することを検討してください。これについてGoogleの結果を調べてみると、実際に(最近の)数字を引用しているリソースはほとんどないことに驚いています

また、Paul Tyma のプレゼンテーション スライドも参照してください。古い方法が再び新しくなりました。Google での彼の研究に基づいて、具体的な数字は同期スレッド I/O が Linux で非常にスケーラブルであることを示唆しており、「NIO の方が速い」という神話はしばらくの間真実でしたが、もはやそうではないと考えています。コメット デイリーにいくつかの良い追加解説があります。彼は、NPTL に関する次の結果を引用しています (事例、ベンチマークへの確実なリンクなどはまだありません...)。

テストでは、NPTL は IA-32 で 2 秒で 100,000 スレッドを開始することに成功しました。比較すると、NPTL を使用しないカーネルでのこのテストには、約 15 分かかります。

スケーラビリティの問題が実際に発生している場合は、 を使用してスレッド スタック サイズを調整するXX:ThreadStackSizeことをお勧めします。あなたがTomcatに言及しているので、ここを参照してください。

最後に、どうしてもノンブロッキング I/O を使用することに決めた場合は、自分が何をしているかを知っている人が既存のフレームワークを基に構築するようあらゆる努力をしてください。私は複雑なノンブロッキング I/O ソリューションを正しく作ろうとして (間違った理由で) あまりにも多くの時間を無駄にしてきました。

関連する SOも参照してください。

于 2010-10-30T12:09:52.447 に答える
4

役立つリンク:

http://nodejs.org/もご覧ください。これは JVM テクノロジではありませんが、何千もの接続を完全に処理します (そして、私が間違っていなければ、舞台裏で NPTL を使用しています)。

JVM での優れた実績のある NIO Web フレームワーク:

于 2010-10-30T09:02:23.240 に答える
2

Sajid、Comet (ロング ポーリング) を行っているようです。

NIO で Comet イベントのユーザー コードを実行する際の問題について話す人はほとんどいません。Comet イベントをディスパッチする NIO スレッドはコードを呼び出します。コードが十分でない場合は、この重要なスレッドをブロックし、他の Comet 接続を待機する必要があります。これは、NIO スレッドが SO のスレッド スケジューラと同様の作業を行っているためです。スレッドは Comet イベント/タスク専用であり、スケジューラは必要に応じてスレッドを放棄できるため (NIO アプローチではそれほど簡単ではありません)、これは IO を使用する Comet では問題になりません。

「同期コメット」(IO ベース) で見られる唯一の問題は、スレッド スタックのメモリ消費です。

于 2010-11-23T08:09:05.513 に答える