Linux上で高度にネットワークを使用するサーバーアプリケーションを開発するには、どのようなアーキテクチャが適していますか?このアプリは通常、複数のコア(仮想または物理)を搭載したマシン上で動作するという考えがあります。パフォーマンスが重要な基準であることを考慮すると、マルチスレッドアプリケーションやマルチプロセス設計の方が良いでしょうか?私は、複数のプロセスからそのようなリソースにアクセスするためのリソースの共有と同期がプログラミングオーバーヘッドの多くであることを知っていますが、前述したように全体的なパフォーマンスが重要な要件であるため、プログラミング言語はC/C++になります。パフォーマンス - マルチスレッドまたはマルチプロセスアプリケーション
マルチスレッドアプリケーション(シングルプロセス)であっても、複数のコアを利用して独立して別のコアで各スレッドを実行できると聞いています(同期の問題がない限り)。このスケジューリングはカーネルによって行われます。もしそうなら、マルチスレッドアプリケーションとマルチプロセスアプリケーションの間にはパフォーマンスに大きな違いはありませんか? Nginxはマルチプロセスアーキテクチャを使用していますが、実際には高速ですが、マルチスレッドアプリケーションで同じパフォーマンスを得ることができますか?
ありがとうございました。
@ p-l:あなたの答えをありがとう。はい、計画は偶数ベースのアーキテクチャを使用し、ネットワークイベントに基づいて動作することです。また、実行時にスレッドやプロセスが追加されることはありません。これを考えると、マルチスレッド・アプリケーションとマルチプロセス・アプリケーションのパフォーマンスに違いは見られませんか?例えば:もし4つのコアを持つシステムがあれば、両方のアーキテクチャ間で性能に顕著な違いはありませんか? – sthustfo
スケジューリングの最大の違いは、タスクのCPUアフィニティで変更することができ、各タスク(スレッド/プロセス)を特定のCPUに固定することです。より多くの違いは、サーバープロセスによって行われた実際の作業と、それがネットワーク部分とどのようにやり取りするかによるものです。 メモリへのアクセス方法には違いがありますが、一般的にはNUMAシステム上でメモリを共有する場合と比べてスレッド/プロセスの違いにはあまり関係ありません。現在のカーネルでは異なるNUMAゾーン(彼らは過去にカーネル自体のためにそれを持っていました)。 –