Nginx のパラメータをオンにして Web パフォーマンスを 3 倍向上させる方法

Nginx のパラメータをオンにして Web パフォーマンスを 3 倍向上させる方法

1. 遭遇したいくつかの問題

2008 年にパフォーマンス テストを行っていたとき、パフォーマンス テスト用に 7 台の新しい Lenovo 4 コア 4G サーバーを購入したことを覚えています。

当時はリソースが逼迫していたため、これら 7 台のサーバーはすべてデュアル システム (Win2003/CentOS5) がインストールされ、アイドル時にはテスト マシン (ストレス テスト エージェント) として使用されていました。

当時、私は Nginx で一連のテストを行いましたが、最も感銘を受けたのは、この一連のマシンでの Nginx ステータス ページのストレス テストでした。

短い接続の場合、最高の QPS は約 40,000 で、長い接続の場合、最高の QPS は約 130,000 です。

約 3 年後、その Lenovo サーバーのバッチは誰も気にしなくなり、ゾンビ マシンとしてしか使用できなくなりました。

しかし、偶然のテストで、サーバーがどれだけ強力であっても、短い接続の最高の QPS はそれほど高くならないことが判明しました。さらに、テストマシンのリソースが枯渇することはなく、テスト対象サーバーのリソースが枯渇することもなく、ネットワークのボトルネックもありません。

サーバー リソースの使用率は低いですが、応答が十分に速くありません。

結局、ボトルネックは監視の入り口にあることがわかりました。リスナーエントリのパフォーマンスを向上させることは可能ですか?ポートの再利用は可能ですか?ついにSO_REUSEPORTを見つけました。

SO_REUSEPORT は、同じポートにバインドする複数のプロセスまたはスレッドをサポートし、サーバー プログラムのパフォーマンスを向上させます。

2. 解決策

テスト環境

  Dell PowerEdge M620 インテル(R)Xeon(R)CPU E5–[email protected]
Linux3.16.0–4–amd64#1 SMP Debian 3.16.7-ckt11-1+deb8u3 (2015-08-04) x86_64 GNU/Linux
イーサネット コントローラ: Broadcom Corporation NetXtreme II BCM5781010Gigabit Ethernet (rev10)

コンパイルパラメータを表示

Nginx の設定は次のとおりです。

再利用ポートパラメータがあることに注意してください

ユーザー www-data;
ワーカープロセスは自動です。
pid/run/nginx.pid;
イベント{
使用アンケート;
multi_accept オン;
再利用ポートをオン;
ワーカー接続 1048576;
}
dso{# 関数モジュール /usr/share/nginx/modules を動的にロードする
ngx_http_memcached_module.so をロードします。
ngx_http_limit_conn_module.so をロードします。
ngx_http_empty_gif_module.so をロードします。
ngx_http_scgi_module.so をロードします。
ngx_http_upstream_session_sticky_module.so をロードします。
ngx_http_user_agent_module.so をロードします。
ngx_http_referer_module.so をロードします。
ngx_http_upstream_least_conn_module.so をロードします。
ngx_http_uwsgi_module.so をロードします。
ngx_http_reqstat_module.so をロードします。
ngx_http_browser_module.so をロードします。
ngx_http_limit_req_module.so をロードします。
ngx_http_split_clients_module.so をロードします。
ngx_http_upstream_ip_hash_module.so をロードします。
}
http{
/etc/nginx/mime.types を含めます。
デフォルトタイプはテキスト/プレーンです。
access_log オフ;
ファイル送信オン;
tcp_nopush オン;
tcp_nodelay オン;
server_tokens オフ;
キープアライブタイムアウト120;
サーバー名ハッシュバケットサイズ512;
server_name_in_redirect オフ;
タイムアウト3秒
送信タイムアウト3秒
タイムアウト3秒
高速cgi_バッファサイズ128k;
高速cgi_バッファ8128k;
fastcgi_busy_buffers_size256k;
fastcgi_temp_file_write_size256k;
変数ハッシュ最大サイズ 1024;
実際のIPを10.0.0.0/8に設定します。
実際のIPを172.28.0.0/16に設定します。
実際のIPを192.168.0.0/16に設定します。
real_ip_headerX–転送–For;
gzip オフ;
gzip_disable "msie6";
gzip_min_length1k;
gzip_バッファ1664k;
gzip_http_バージョン1.1;
gzip_comp_level6;
gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript;
gzip_vary オン;
ssl_protocols TLSv1 TLSv1.1TLSv1.2;# SSLv3 を削除、参照: POODLE
ssl_prefer_server_ciphers をオン;
アクセスログ/var/log/nginx/access.log;
error_log/var/log/nginx/error.log;
サーバ{
80バックログ=65535を聴く;
文字セット utf-8;
location/{# Tengine ステータス ページを印刷します stub_status on;# ステータス ページを開き、http_stub_status_module module に依存します access_log off;# アクセス プロセスをログに記録しません}
location~^(.*)\/\.(svn|git|hg|bzr|cvs)\/{# これらのディレクトリをブロックし、すべてを拒否します。
access_log オフ;
log_not_found オフ;
}
location~/\.{# .htaccess .bash_history など、. で始まるディレクトリまたはファイルをシールドします
すべてを否定する;
access_log オフ;
log_not_found オフ;
}
場所/削除しないでください.html{
access_log オフ;
空のgif;
}
}
}

ストレステストの再利用ポート

Tengine はすでにreuse_portをサポートしています。 Reuse_port を有効にすると、多くのプロセスが同時にポート 80 をリッスンしていることがわかります。

圧力をかけると、サーバーのパフォーマンスを自分で絞り出すことができることがわかります。

再利用ポートテストの結果を比較すると、友人たちは衝撃を受けました(短い接続の QPS が 240,000 を超えました)!

真実が明らかになった今、何を待っているのですか?

探し出す

テスト中に、TCP の増加によりポート 80 で SYN フラッディングが発生した可能性があり、多数のエラーが発生しました。

したがって、同時実行性は 60,000 net.core.somaxconn = 65535 に減少しました。

Reuse_port を閉じた後、perf top の状況を見てみましょう。

次に、reuse_port を開いて、perf top の結果を比較します。

次に、Nginx によって監視されている back_log を拡大して、リソースの使用状況を確認します。

現時点でのキューの状況を見てみましょう(エントリが 10,000 件以上あります)。

次に、300,000 の同時接続に挑戦します (MTT は平均応答時間 (ms) です)。

一連の最適化を行った結果、同じ環境で同じ同時実行性を持つ場合、「TCP: ポート 80 で SYN フラッディングが発生する可能性があります。」という問題は発生しなくなりました。ただし、少数の接続タイムアウトが発生しました。

テストは完了しました。reuse_port をオンにすると、パフォーマンスが 3 倍向上します。ぜひ試してみてはいかがでしょうか。

以上がこの記事の全内容です。皆様の勉強のお役に立てれば幸いです。また、123WORDPRESS.COM を応援していただければ幸いです。

以下もご興味があるかもしれません:
  • Nginx で X-Sendfile ヘッダーを使用して PHP ファイルのダウンロード パフォーマンスを向上させる (大きなファイルのダウンロードの場合)
  • DjangoはセロリとNGINXを使用して静的ページを生成し、パフォーマンスの最適化を実現します。
  • セキュリティとパフォーマンスを向上させるためのNginxの最適な構成の詳細な説明
  • Nginx+Tomcat 高性能負荷分散クラスタ構築チュートリアル
  • Nginx+Tomcat で高性能な負荷分散クラスターを構築する方法
  • nginxのパフォーマンスを高速化: gzipとキャッシュを有効にする
  • Nginx サーバー構成パフォーマンス最適化ソリューション
  • Nginx のパフォーマンスを向上させるための提案

<<:  外部キー制約を持つテーブルデータを削除する MySQL メソッドの紹介

>>:  MySQL での limit の使用方法は何ですか (推奨)

推薦する

Linux で削除できないファイル/フォルダの解決方法

序文最近、弊社のサーバーがハッカーの攻撃を受け、一部のファイルの属性が変更されたため、ウイルスファイ...

JSコードコンパイラMonacoの使い方

序文私が必要としているのは、構文の強調表示、関数プロンプト、自動行折り返し、およびコードの折りたたみ...

互換性を維持しながら他のウェブページのデータを適用する iframe の使い方

以下は、Shiji Tiancheng が Tencent KartRider ページを呼び出すため...

jQuery キャンバスで画像検証コード例を描画する

この記事では、jQuery Canvasの描画画像検証コードの具体的なコードを例として紹介します。具...

AES_ENCRYPT() と AES_DECRYPT() を使用して MySQL を暗号化および復号化する正しい方法の例

序文最近、仕事でAES_ENCRYPT()関数を使用してプレーンテキストを暗号化し、MySQL に保...

Docker ポート マッピングと外部アクセス不可の問題

Docker コンテナはサービスを提供し、ポート 8888 をリッスンします。外部からアクセスできる...

iframe の多層ネスト、無制限のネスト、高度に適応したソリューション

ページ A、B、C の 3 つがあります。ページ A にはページ B が含まれ、ページ B にはペー...

MySQL binlog を開く手順

Binlog は、MySQL データの変更を記録するために使用されるバイナリ ログ ファイルです。B...

JS の querySelector メソッドと getElementById メソッドの違い

目次1. 概要1.1 querySelector() と querySelectorAll() の使...

フロントエンドは画像を遅延ロードする方法を知っている必要があります(3つの方法)

目次1. 遅延読み込みとは何ですか? 2. 遅延読み込みを実装する🌄: 2.1 最初の方法: 2.2...

Windows 10 での MySQL 8.0 のダウンロードとインストール構成のグラフィック チュートリアル

この記事では、MySQL 8.0のダウンロードとインストールについてご紹介します。具体的な内容は以下...

MySQLの指定されたテーブルからデータをエクスポートする例の詳細な説明

指定されたテーブルからデータをエクスポートするMySQLの詳細な説明必要とする: 1. テーブルはす...

Vue のフィルターウィジェットの詳細な使用方法

この記事では、参考までにVue More Filter Itemウィジェットの実装方法を例として紹介...

Centos7 への mysql8.0rpm のインストール チュートリアル

まず、図をダウンロードしてください 1. まず、centos7に付属しているmariadbをアンイン...