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. 解決策 テスト環境
コンパイルパラメータを表示 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 を応援していただければ幸いです。 以下もご興味があるかもしれません:
|
<<: 外部キー制約を持つテーブルデータを削除する MySQL メソッドの紹介
>>: MySQL での limit の使用方法は何ですか (推奨)
ドキュメント モードには次の 2 つの機能があります。 1. HTML文書を解析するためにどのHTM...
シミュレーションテーブルとデータスクリプト次の SQL ステートメントをコピーして、sys_dept...
導入:インターネット上にはデータベースの最適化に関する情報や方法が数多くありますが、その多くは品質に...
1. デフォルトでインストールされているMySQLの文字セットを確認するmysql> '...
7 のMicrosoft の公式 Web サイトから HTTP Rewrite モジュールをダウンロ...
序文実際、クエリ中に結果に番号が付けられるこのような状況に遭遇したことは一度もありません。同僚が転職...
最終結果はこんな感じです、かわいいでしょう… PS: HTML と CSS の知識があればベストです...
背景このバグは滾動條占據空間ことで発生していました。いくつかの情報を確認して、ようやく解決しました。...
MacにMySQLデータベースをインストールし、環境変数を設定する手順を参考までに記録します。具体的...
3つのパラダイム1NF: フィールドは分離不可能です。 2NF: 主キーがあり、非主キー フィールド...
この投稿では、キャンバスとドラッグ可能なノード インターフェースを使用するデスクトップおよび Web...
比較演算子でNULLを使用する mysql> 1>NULLを選択します。 +------...
接続数を取得する --- 最大接続数を取得します。SHOW VARIABLES LIKE '...
目次1. 浅いコピー1. Object.assign(ターゲット、ソース、ソース...) 2. スプ...
この記事では、セキュリティ、使用方法、同時処理などを通じて、MySQL トランザクションとデータの一...