「バックエンドサービスのパフォーマンスの最適化ガイド」
ディレクトリ
まず、 サーバーのオペレーティングシステム 2
二、ウェブサーバー/ リバースプロキシサーバ(nginxの) 2
第三に、 アプリケーションサーバ( Tomcatの) 2
第四に、 アプリケーションログの設定 2
第五に、 データベース( MySQLの) 3
第六に、 データベース接続プール 3
七、 RESTfullのサービスを呼び出す 4
まず、サーバオペレーティングシステム
図1に示すように、すべてのプロセスがグローバル制限を共有しました
ビューシステムは、最大数のハンドル 猫の/ proc / sysのの/ fsの/ファイル・NRの
レビューを: /etc/sysctl.confの
fs.file-MAX = 100000
net.ipv4.ip_conntrack_max = 100000
net.ipv4.netfilter.ip_conntrack_max = 100000
2、最大の単一のプロセスハンドル
サーバー構成のデフォルト 1024
プロセスの最大数を確認 のulimitは、-u
プロセスがハンドルの最大数を表示する -n ulimitの
修正を: /etc/security/limits.confをします
*ソフトNOFILE = 32768
*ハードNOFILE = 65536
すべてのユーザーのための最大のオープンハンドルシングルスレッド、ソフトリミット 32768 、ハードリミット65536 ;
3、TCP コネクションの生存時間は、レイテンシの接続が閉じられています
変更に/etc/sysctl.confに以下の行を追加し、:
#1 のデフォルトTIMEOUTの期間
net.ipv4.tcp_fin_timeout = 30
#甲斐の再利用が可能にTIME_WAITソケット新たに再使用のTCP デフォルトで接続0はオフ表す
net.ipv4.tcp_tw_reuse = 1
#オープンTCP 接続のTIME_WAITソケットすばやくデフォルトで回復0はオフを表し
net.ipv4.tcp_tw_recycle = 1
4、使用のuname -a システムのカーネルバージョンを表示するコマンドを、ことを確認して、Linuxのカーネルのバージョンよりも高い2.6.28は、 このリリースの Linuxのサポート効率的な非同期IOのモデルのepollは、JDKがNIOの開発キットは、ペアが含まれている場合、オペレーティングシステムのバージョン番号の前に(分析のLinux> 2.6 ときに呼び出さのepoll ネイティブ方式)、ジャワのNiOがされ、オペレーティングシステムによって決定されたIOモデルにより達成。
二、ウェブサーバー/ リバースプロキシサーバ(nginxの)
nginx.conf プロフィール:
5、nginxの単一のワーカープロセスは、外部接続の最大数を確立するために、
worker_connections 16000
6、nginxのハンドルを開くことができるプロセスの最大数
worker_rlimit_nofile 65535
7、nginxののワーカープロセス
worker_processes 8 [ 一般設定CPU 核の二重数]
第三に、アプリケーションサーバ( Tomcatの)
図1に示すように、作るコネクタをするように構成されているNIOのモード、および接続の適切な最大数を設定(springboot 埋め込みTomcatのデフォルトはNIO 、接続の最大数MAX-接続デフォルト10000 )
2、調整 Tomcatのワーカースレッドキューキューの長さの数
server.tomcat.max-スレッド= 800
server.tomcat.acceptカウント= 200
第四に、アプリケーションログの設定
1は、アプリケーションが現在のベストプラクティスログ sl4j + logbackをコードを使用する必要があり、sl4j ファサードを記録し、直接使用禁止log4jの具体的な実現を。
2、いくつかの非常に同時サービスに低減するように最適化ログ非同期ことを検討すべきである IOを改善するための時間を遮断するCPUの使用率を:
<アペンダ名= "syslogの"
クラス= "ch.qos.logback.core.rolling.RollingFileAppender">
......
</アペンダ>
<アペンダ名= "ASYNC_ROLLING_FILE" クラス= "ch.qos.logback.classic.AsyncAppender">
<QUEUESIZE> 256 </ QUEUESIZE>
<includeCallerData>真</ includeCallerData>
<アペンダ-REF REF = "syslogの" />
</アペンダ>
<ルートレベル= "INFO">
<! - <アペンダ-REF REF = "STDOUT" /> - >
<アペンダ-REF REF = "ASYNC_ROLLING_FILE" />
</ルート>
Logback 提供AsyncAppender 内蔵非同期ログ出力キュー、デフォルト用いて256を、パフォーマンスを保証するためにの長さにわたって 80%の落下開始エラー外部ログ。
プロパティ名 |
タイプ |
デフォルト値 |
説明 |
QUEUESIZE |
int型 |
256 |
内蔵BlockingQueueの最大容量 |
discardingThreshold |
int型 |
-1 |
しきい値のBlockingQueue(80%)よりも高い容量は、ERRORログレベルを破棄する際、デフォルトで、あなたは(両方ともたびに合計金額を格納)のログを破棄したくない、それが0に設定されますが、キューがいっぱいの場合することができます破棄は、すべてのログ情報をエンキューするとき、1(デフォルト値)に設定することをお勧めします。ログは、通常のように廃棄することができ、それが大幅にパフォーマンスを向上させ、重大なエラーログを保存することができます。
|
includeCallerData |
ブーリアン |
偽 |
発信者データを抽出するコストは非常に高価です。イベントがキューに追加されたときに、デフォルトでは、パフォーマンスを向上させるために、発呼者に関連付けられているイベント・データが抽出されません。こうしたスレッド名としてデフォルトでは、唯一の「安い」データ、。ログの例行番号trueに設定された値の出力が必要かどうかのために。測定includeCallerData = trueが、いくつかのパフォーマンスの低下をもたらすが、それでも遠くTPS非常に高への同時同期ログの道ます。 |
第五に、データベース( MySQLの)
ストレステストを行うことで、私はこの分野での主要な問題を解決するために、データベース接続の数だけでなく、いくつかの長いスロークエリ、次のような構成に制限を見つけました
以下のパラメータが再起動後に有効に、データベースのデータベースな/etc/my.cnf修飾することができます。
図1に示すように、接続の最大数と、次のように提供されたデータベースに接続しているユーザーの最大数、
= 1000 MAX_CONNECTIONS (デフォルト 151)
MAX_USER_CONNECTIONS = 1000
2 、一時テーブルのサイズの間に生成されたクエリができます使用を行う場合max_heap_table_sizeクエリに参加し、tmp_table_sizeを設定します。パラメータ max_heap_table_size よりtmp_table_size 時間は、システムがあろうmax_heap_table_size 最大メモリ一時テーブルとして上限値を、これよりも大きい場合、書き換え可能なハードディスク、増加ヒープテーブルのサイズは、同等の効果は、クエリの速度に参加することができます。
以下のような:
200M = tmp_table_size (デフォルト 16M)
max_heap_table_size = 500M (默认 16M)
。3 、 read_buffer_sizeとして:れるMySQLはバッファサイズに読み込まれ、バッファに読み込まシーケンシャルスキャンを割り当てるテーブルの要求を、 MySQLはそれのためにいくつかのメモリ・バッファを割り当てます。read_buffer_size 変数は、バッファのサイズを制御します。テーブルの順次スキャンの要求が非常に頻繁に、そして場合、このような頻繁なスキャニングが遅すぎることが、その性能は、変数の値、及びメモリ・バッファ・サイズを増加させることによって改善することができます。
次の設定:
sort_buffer_size = 8M
read_buffer_size = 8M
read_rnd_buffer_size = 8M
join_buffer_size 、すなわちであるテーブルは、結合会合を:のような、 join_buffer_size = 8M 。
第六に、データベース接続プール
Tomcat、JDBC 接続プール、例えば、のような他の接続プールDBCP 、C3P0 、ドルイドなど。
図1に示すように、コアポータルユーザ識別データベース接続プールパラメータは、いくつかのアプリケーションを変更するユーザの最大接続MAXACTIVEのためのアイドル最大maxIdle 300 、最小アイドルminIdle 、初期数INITIALSIZE 60 ; ポータル\コア\アイデンティティ:最大接続、最大アイドル100 、 最小アイドル最初の数 20 ;初期の他の用途5 最大20
2は、本番環境でのオフtestOnBorrow とtestOnReturn(設定をfalseに)主に接続失敗を通じて、 testWhileIdle 保証します。
七、Restfullサービスコール
1、ホットスポットサービスを直接利用を許可しない JDK 自身java.net.URLConnectionが可能HTTPクライアントの呼び出し
2、使用することが推奨されるのApacheのHttpClientを、okhttp ような接続プーリングモードとして、HTTP ライブラリ、残りのサービス呼び出し、接続を確立するために、繰り返しのオーバーヘッドを削減します。ベースのスプリングテクノロジー・スタックのアプリケーションより良い練習が使用することですrestTemplateを上記の実装を設定します。
3は、ApacheのHttpClientを流暢APIは、自身に基づいて、基礎となるのHTTPClientの接続プールモード、前記コード書かれて死んだmaxTotal とmaxPerRoute 共通接続プールの総使用するすべての要求200台の接続、各目的地までを100台の接続が。高い並行処理のボトルネックがあるでしょう、ホットアプリケーションが使用することは推奨されません。