OSとWebサーバー-一緒にもっと楽しく

みなさんこんにちは。 最初は、いずれかのバトルサーバーからクリーンアップおよびコメントアウトされた構成の例を使用して、nginxテーマを続行するのが最善であると考えましたが、これにはかなりの追加情報が必要であることがわかりました。 そのため、nginxがどのように機能するのか、なぜnginxが非常に高速に機能するのかについての概要を説明することにしました。





最初に、1つの条件付きプロセッサを搭載したサーバーが一度に複数のネットワーク要求を処理する方法を理解することから始める必要があります。 タスク間でのCPU時間の分離と、最新のオペレーティングシステムでのタイマーによるタスクの切り替えについては、誰もが長い間知っていました。 ただし、コンピューターにCPUが1つしかない場合でも、同時に複数の要求を実行することはできません。 タスクをクォンタムに分離し、それらを交互にすると、減少することはなく、すべてのタスクの合計作業時間が長くなります。



問題は、現代のコンピューターでは、プロセッサーは1つではないということです。 :) CPUにコアが1つしかない場合でも、他の多くのチップが役立ちます。 主なものは、DMAコントローラー、ネットワークボード上の専用コントローラー、ハードディスクコントローラー、ビデオカードプロセッサー(Webサーバーではまだ使用されていませんが)、その他、その他です。これらのデバイスはすべて、非常に特殊化された他のタスクのために中央処理装置を解放することにより機能します。



オペレーティングシステムの動作は、コンピューター内のデバイス間で負荷を正しく分散することです。 たとえば、プロセッサはDMAコントローラに「このデータをディスクからこのメモリ領域に転送する」ように指示し、他のことを行うことができます。 正確に「異なる」ものとは、特別な計画アルゴリズムの1つであり、それぞれに長所と短所があります(それらについては、Tannenbaum氏の非常に優れた書籍「Modern Operating Systems」を読むことをお勧めします)。 しかし、これは今ではそれについてではありません。



最新のx86コンピューターのアーキテクチャーは、システム全体のパフォーマンスを向上させるためにタスクの非同期実行を課しているという事実に注目したいと思います。 オペレーティングシステム 、同期システムコールを提供することにより、この非同期性をユーザーから隠すことができますが、「フードの下で」発生していることを考慮してプログラムを作成すれば、多くを獲得できます。



ここでの真実は小さな問題です。 オペレーティングシステムは、従来、実行可能プログラムが「ここに単独ではない」と疑わないように設計されていました。 また、Linux、FreeBSD、およびWindowsでは、比較的非同期の高速システムコールを行うためのツールでさえ比較的最近登場しました(selectおよびpollを意味するわけではありません)。



実際、私が何をしているのか、あなたはすでに理解していると思う Nginxは、ユーザーからの処理された要求ごとに個別のプロセス(スレッド)を生成しないため、非常に高速に動作しますが、入出力操作(ネットワークとハードディスクの操作)の非同期システムコールを使用して、1つのプロセスですべてのタスクを実行します。 このアプローチにはいくつかの利点があります。



-すべての作業は、1つのプロセス、または一般的な場合、N個のプロセスで実行できます。ここで、Nはサーバー内のコアの数です。

-実行コンテキスト間のスイッチの数が最小化されます。

-プロセスやスレッドの同期は実質的に必要ありません。

-メモリ使用量の削減。



このアプローチには欠点があり、その主な点は、サーバープログラミングへの非常に徹底したアプローチが必要であり、ブロックされたI / O操作を使用できないことです。 より正確には、もちろんブロックされた操作を使用できますが、ブロックが完了するまで、完全なWebサーバープロセスを停止し、すべての接続を処理します。 特に、これはnginxの組み込みPerginの使用に関する問題の1つです。 どのI / O操作でも、ブロックされる可能性があります。これにより、すべての作業が遅くなります。



結論として、nginxを使用したサーバーの速度は、オペレーティングシステムとその設定に大きく依存することを付け加えます。 OSを適切にチューニングすると、負荷が高い場合にサーバーのパフォーマンスを数十パーセント向上させることができます。



PSテキストベータテストについて友人や同僚に感謝します。 :)



All Articles