当社はIT技術のオンライン教育を得意としたセミナー専門会社です。 | 一戸英男

ITエンジニアの技術力UPをお約束します。

nginxでWEBサイトを立ち上げる際のセッション数の考え方

Nginxのセッション数を決めるための数式は、サーバーのリソース(メモリ、CPU)や使用ケースに依存しますが、以下のような考え方で設定することができます。

マシンの速度やメモリ数、コアの数も依存するので確率的なことはいえませんがざっとした考え方は示したいと思います。

考え方の例:
サーバー搭載メモリ: 2GByte 各接続が消費するメモリ量を推定します。通常、Nginxのワーカープロセスは1接続あたり約2MB程度のメモリを使用しますが、これは設定や使用中のモジュールによって変わります。
サーバーの総メモリから、OSや他のサービスに必要なメモリを差し引いた残りのメモリをNginxに割り当てます。


CPU使用率:
CPUコア数が1の場合、worker_processesは1に設定します。複数コアの場合はコア数に合わせて設定します。
CPUの負荷を考慮して、ワーカープロセスが同時に処理できる接続数を決めます。

nginx.confへのセッション数の計算式

worker_connections = (総メモリ – OSおよび他のサービスに必要なメモリ) / (ワーカープロセス数 * 1接続あたりのメモリ使用量)
例えば、総メモリが2GB(2048MB)で、Nginxが使用できるメモリが1500MB、ワーカープロセス数が1、1接続あたりのメモリ使用量が2MBと仮定します。

worker_connections = (2048MB – 548MB) / (1 * 2MB) = 750

現実の設定

worker_connections: 前述の計算結果に基づいて設定しますが、接続のピーク時や突発的なトラフィックを考慮して、少し余裕を持たせるのが一般的です。例えば、計算結果が750接続であれば、70%程度にして525の接続数などにすることが安全です。

  1. keepalive_timeout: 接続を保持する時間を調整することで、不要な接続を減らし、リソースを効率的に使用します。
  2. client_body_buffer_size、client_header_buffer_size、large_client_header_buffers: これらのバッファのサイズを適切に設定することで、メモリ使用量を抑えます。
その他の考慮点
  • キャッシュ: キャッシュを使用することで、リソースの利用を最適化します。
  • セッションの管理: セッションの保存方法(メモリ、ファイルシステム、データベース)を考慮して、メモリ使用量を抑えることができます。
  • モニタリング: 実際の使用状況を監視し、必要に応じて設定を調整します。
  • これらの数式や考え方はあくまでも目安であり、サーバーの負荷やパフォーマンスを実際に監視しながら、必要に応じて調整することが重要です。

nginxプロセス測定にあたって

Nginxプロセスのメモリ使用量を確認する際、topコマンドで表示される「VIRT」カラム(仮想メモリ)の値を直接参照することは、1接続あたりのメモリ使用量を正確に推定するには不適切です。以下の理由からです:

  • VIRT(仮想メモリ): VIRTはプロセスが利用可能な仮想メモリ空間の総量を示しており、実際に使用されている物理メモリ(RES)とは異なります。プロセスが割り当てられているメモリ領域の全てを含みますが、必ずしも全てが使用されているわけではありません。

  • RES(実メモリ): 実際に物理メモリに割り当てられているメモリ量を示します。Nginxのメモリ使用量を評価する際には、RESの方がより適切です。

  • SHR(共有メモリ): プロセス間で共有されるメモリ量を示します。Nginxのワーカープロセスはしばしばメモリを共有するため、SHRの値も考慮する必要があります

セッション数概算からメモリ使用量を割り出す

例えば、Nginxが1プロセスで11960MBのVIRTを使用している場合、RESを見ると実際に使用されているメモリがどれだけか確認できます。もしRESが200MBで、現在の接続数が100であると仮定。

★topコマンドで表示される「RES」(実メモリ)の単位は**キロバイト(KB)**です。3956という値は、Nginxプロセスが現在使用している物理メモリが約3.86MB(3956KB / 1024)であることを示しています。

1接続あたりのメモリ使用量

先ほどの例に基づいて、3956KB(約3.86MB)を1接続あたりのメモリ使用量と仮定すると、以下のように推定できます

この場合、1接続あたりのメモリ使用量は約3.86MBとなりますが、これはあくまでも目安であり、他の要因(キャッシュ、静的ファイルの配信、PHP-FPMの使用状況など)によって変動します。実際の使用状況を監視し、負荷テストを行って正確な値を確認することが必要。