一度zulの圧力テストを覚える
4937 ワード
abツールを使用してspring cloudのzulを圧力テストします.私のゲートウェイはtokenの論理を検証するだけで、tokenが存在しない場合はヒントを返します.しかし,qps(ここでもtpsと理解できる)は400程度であることが分かった.しかし、広範なオープンソースコンポーネントを適用する場合、これは明らかに最適化されていない.
jconsoleを用いて観察する
jconsoleはjdkが持参したツールです.
起動時にパラメータを追加
メモリとcpuに異常はないことが分かった.スレッドを観察すると、私の同時実行がいくらであっても、実際に実行されているスレッドは1つまたは2つであり、これは間違っていることを示しています.そこでabツールやネットワーク構成が間違っているのではないかと疑い始めました.
1、abツールをcentos 7システム本体に装着し、同時に以下の調整を行った.
(1)ulimit -SHn 65535
(2)修正/ect/sysctl.conf
(3)サーバ上の/etc/sysctl.confの変更
現在qpsは1000以上に達していますが、まだ理想的ではありません.
2、jprofilerとjstackを使って新しいボトルネックを見つける
Windowsにjprofiler 9をインストールすることで、サーバにもjprofiler 9をインストールしました(バージョンは一致して、ここからダウンロードしますhttps://download.csdn.net/download/chs007chs/10930102)、これによりwindowsマシン上でインタフェースを介してサーバ上のjvmプロセスに接続することができ、ここでは圧力測定時にスレッドblockedがあることを発見しました.そこでjstackツールdumpでスレッドスナップショットを作成すると、logbackログがファイルに書き込まれたスレッドがブロックされていることがわかりました.
ログプロファイルを変更します.
非同期ログを使用することでスレッドがブロックされなくなり、jprofilerを使用して観察を続けたところ、CPU View->Call Treeで、私がカスタマイズしたzulFilterでfastjsonを使用してシーケンス化する場合にcpuが消費されることがわかり、カスタムzulfilterを再修正し、fastjsonの使用を減らしました.最後に、qpsは3000ぐらいで、その本は私の予想を満たしました.
jconsoleを用いて観察する
jconsoleはjdkが持参したツールです.
起動時にパラメータを追加
-Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.port=2099 -Djava.rmi.server.hostname=192.168.50.5
メモリとcpuに異常はないことが分かった.スレッドを観察すると、私の同時実行がいくらであっても、実際に実行されているスレッドは1つまたは2つであり、これは間違っていることを示しています.そこでabツールやネットワーク構成が間違っているのではないかと疑い始めました.
1、abツールをcentos 7システム本体に装着し、同時に以下の調整を行った.
(1)ulimit -SHn 65535
(2)修正/ect/sysctl.conf
#
net.ipv4.tcp_syncookies=0
net.ipv4.tcp_tw_reuse=1
net.ipv4.tcp_tw_recycle=1
net.nf_conntrack_max=100000
net.netfilter.nf_conntrack_max=100000
(3)サーバ上の/etc/sysctl.confの変更
#
net.ipv4.tcp_syncookies=0
net.ipv4.tcp_tw_reuse=1
net.ipv4.tcp_tw_recycle=1
現在qpsは1000以上に達していますが、まだ理想的ではありません.
2、jprofilerとjstackを使って新しいボトルネックを見つける
Windowsにjprofiler 9をインストールすることで、サーバにもjprofiler 9をインストールしました(バージョンは一致して、ここからダウンロードしますhttps://download.csdn.net/download/chs007chs/10930102)、これによりwindowsマシン上でインタフェースを介してサーバ上のjvmプロセスに接続することができ、ここでは圧力測定時にスレッドblockedがあることを発見しました.そこでjstackツールdumpでスレッドスナップショットを作成すると、logbackログがファイルに書き込まれたスレッドがブロックされていることがわかりました.
ログプロファイルを変更します.
${log.path}/${application.name}/info.log
true
${log.path}/${application.name}/%d{yyyy-MM-dd}/info/info-%i.zip
50MB
7
2GB
%d{yyyy-MM-dd HH:mm:ss} [%p] [%t] %c - %m%n
INFO
ACCEPT
DENY
${log.path}/${application.name}/warn.log
true
${log.path}/${application.name}/%d{yyyy-MM-dd}/warn/warn-%i.zip
50MB
15
2GB
%d{yyyy-MM-dd HH:mm:ss} [%p] [%t] %c - %m%n
WARN
ACCEPT
DENY
${log.path}/${application.name}/error.log
true
${log.path}/${application.name}/%d{yyyy-MM-dd}/error/error-%i.zip
50MB
15
2GB
%d{yyyy-MM-dd HH:mm:ss} [%p] [%t] %c - %m%n
ERROR
ACCEPT
DENY
0
512
0
512
0
512
非同期ログを使用することでスレッドがブロックされなくなり、jprofilerを使用して観察を続けたところ、CPU View->Call Treeで、私がカスタマイズしたzulFilterでfastjsonを使用してシーケンス化する場合にcpuが消費されることがわかり、カスタムzulfilterを再修正し、fastjsonの使用を減らしました.最後に、qpsは3000ぐらいで、その本は私の予想を満たしました.