6

ネットワークを多用するサーバー アプリケーションを Linux で開発するには、どのようなアーキテクチャが適していますか? このアプリは通常、複数のコア (仮想または物理) を備えたマシンで実行されるという考えです。パフォーマンスが重要な基準であることを考えると、マルチスレッド アプリケーションとマルチプロセス設計のアプリケーションのどちらを選ぶのがよいでしょうか? リソースの共有と、複数のプロセスからそのようなリソースにアクセスするための同期は、多くのプログラミング オーバーヘッドであることは知っていますが、前述のように、全体的なパフォーマンスが重要な要件であるため、それらのことは無視できます。また、プログラミング言語は C/C++ になります。

マルチスレッド アプリケーション (単一プロセス) でさえ、複数のコアを利用して、各スレッドを異なるコアで個別に実行できると聞いています (同期の問題がない限り)。そして、このスケジューリングはカーネルによって行われます。もしそうなら、マルチスレッド アプリケーションとマルチプロセス アプリケーションのパフォーマンスに大きな違いはありませんか? Nginx はマルチプロセス アーキテクチャを使用しており、非常に高速ですが、マルチスレッド アプリケーションで同じパフォーマンスを得ることができますか?

ありがとう。

4

2 に答える 2

4

Linux のプロセスとスレッドは互いに非常に似ています。主な違いは、仮想メモリ全体が共有されていることと、シグナル処理などの特定の点が異なることです。

これにより、スレッド間のコンテキスト切り替えが安価になります (コストのかかる MMU リロードなどは必要ありません) が、必ずしも速度に大きな違いが生じるわけではありません (特にスレッド作成以外では)。

非常にネットワーク集約型のアプリケーションを設計する場合、基本的に唯一の解決策はイベント アーキテクチャを使用することです (そうしないと、大量のプロセス/スレッドでシステムが停止し、実際に作業コードを実行するよりもそれらの管理に多くの時間を費やすことになります)。ソケットの I/O に反応し、アクティビティを示すソケットに基づいて適切な操作を行います。

このような状況で直面する問題についての有名な記事は、http: //www.kegel.com/c10k.htmlから入手できる「The C10k problem」です。さまざまな I/O アプローチについて説明しているため、少し時代遅れですが、非常に良い紹介。

ただし、reactor のような設計に深く飛び込む前に注意してください。扱いにくく複雑になる可能性があるため、より適切な抽象化を提供するライブラリ/言語を使用できないかどうかを確認してください (Erlang は、コルーチンを使用する言語で私の個人的なお気に入りです。 Go のようなものも役に立ちます)。

于 2013-05-16T06:59:53.087 に答える
1

スレッドが互いに独立してジョブを実行している場合、Linux では、代わりに複数のプロセスを使用しない理由はまったくありません。複数のプロセスでは、各プロセスに独自のプライベート メモリ空間があるため、メモリ使用量が増加しますが、独立したスレッド間でメモリ空間を共有することは、より悪い決定です。スレッドとプロセスの間のコンテキスト切り替えは、通常、スレッドよりもプロセスの方が適切に行われますが、アーキテクチャとコードに少し依存します。プロセスは、ロックとミューテックスでシリアル化されなくても安全です。Linux では、プロセスの管理と対話が容易になります。ここに興味深いドキュメントがあります ( http://elinux.org/images/1/1c/Ben-Yossef-GoodBadUgly.pdf )。

于 2014-12-11T02:48:22.123 に答える