ファイルを送信
現在、一般的な Web サーバーには、サーバーのパフォーマンスを向上させるための sendfile オプションが用意されています。sendfile とは一体何で、パフォーマンスにどのような影響を与えるのでしょうか? sendfile は実際には Linux 2.0 以降に起動されたシステム コールであり、Web サーバーは独自の設定を調整することで sendfile システム コールを使用するかどうかを決定できます。まず、sendfile を使用しない従来のネットワーク送信プロセスを見てみましょう:
読み取り(ファイル、tmp_buf、len);
write(ソケット,tmp_buf, len);
ハードディスク >> ユーザー バッファ >> プロトコル スタック
一般に、ネットワーク アプリケーションは、ハードディスクからデータを読み取り、ソケットにデータを書き込むことによってネットワーク送信を完了します。上記の 2 行のコードはこの点を説明していますが、上記の 2 行の単純なコードは多くの基礎的な操作をカバーしています。最下層が上記の 2 行のコードをどのように実行するかを見てみましょう:
1. システム コール read() はコンテキスト スイッチを生成し、ユーザー モードからカーネル モードに切り替えます。その後、DMA がコピーを実行してファイル データをハード ディスクからカーネル バッファに読み取ります。
2. データがカーネル バッファからユーザー バッファにコピーされ、システムは read() を呼び出して戻ります。このとき、コンテキスト スイッチが発生し、カーネル モードからユーザー モードに切り替わります。
3. システムは write() を呼び出してコンテキスト スイッチを生成します。ユーザー モードからカーネル モードに切り替え、ステップ 2 でユーザー バッファから読み取ったデータをカーネル バッファにコピーします (データは、次の手順でカーネル バッファにコピーされます)。 2 回目)、今回は異なります。カーネル バッファはソケットに関連付けられています。
4. システム コール write() が返されると、コンテキスト スイッチが発生します。カーネル モードからユーザー モードに切り替わり (4 回目)、DMA がカーネル バッファからプロトコル スタックにデータをコピーします (4 回目)。
上記の 4 つのステップには 4 つのコンテキスト スイッチと 4 つのコピーがあり、スイッチとコピーの数を減らすことができれば、パフォーマンスが効果的に向上することがわかりました。 kernel2.0+ バージョンでは、システム コール sendfile() を使用して、上記の手順を簡素化し、パフォーマンスを向上させます。 sendfile() を使用すると、スイッチの数だけでなくコピーの数も減らすことができます。
ネットワーク送信に sendfile() を使用するプロセスを見てみましょう:
sendfile(ソケット,ファイル,len);
ハードディスク >>カーネル バッファ (カーネルソケット バッファへのクイック コピー) >>プロトコル スタック
1. システムは sendfile() を呼び出して、ハードディスク データを DMA 経由でカーネル バッファにコピーします。その後、データはカーネルによってソケットに関連する別のカーネル バッファに直接コピーされます。ユーザー モードとカーネル モードの間の切り替えは行われず、あるバッファから別のバッファへのコピーはカーネル内で直接完了します。
2. DMA はデータをカーネルバッファからプロトコルスタックに直接コピーします。データはカーネル内にあるため、切り替えは行われず、データをユーザーモードからカーネルモードにコピーする必要もありません。
記事参照: http://www.th7.cn/system/lin/201306/41314.shtml
').addClass('pre-numbering').hide();
$(this).addClass('has-numbering').parent().append($numbering);
for (i = 1; i
上記では、nginx の sendfile パラメーターの説明を、関連する内容も含めて紹介しました。PHP チュートリアルに興味のある友人に役立つことを願っています。