バグ道路ソリューション-調査のネットワークサービスの確率失敗外のレコード1つのコール
序文
と外部FBIが問題、いくつかの基本的な構成環境によって引き起こされる、特に問題に悩まされています。偶然の著者の場合は、障害のネットワークサービスの確率外線通話の問題を解決します。この調査の過程で開始する方法を知って、読者はこの問題が発生することを希望に送信されます。
原因
ライン上の新しいシステムの著者は、PEは、操作を実行する必要があります。しかし、PEは確かに相互に絡み合った他の動作と開発を担当しているので、私は30分前に待っていました。システムを加速する上で思考のラインでは、私は彼らがすぐにようにすぐに私はコーディング戻って終了して、問題を処分するのを助けることができると思います。次のように一つは尋ね、質問は実際には3ヶ月、問題の現象を引っ張っ:
各クライアントは失敗し、エラーのほぼ1/2の確率になります:
java.net.SocketTimeoutException:読む時限OUTは
捜査を進める
と開発アプリケーションサーバーPEと対応する交換発見、それはしてSocketTimeoutExceptionであるので、との間の接続のアプリケーションサーバーnginxの確立を排除することができるので、アプリケーションサーバーnginxの間の短い接続です。以下に示すように、調査へのnginxのログは、我々は、奇妙な現象を発見した:
すべての呼び出しは、アプリケーションサーバーnginxの成功を収めて、失敗の別のnginxの大きな可能性を呼び出しています。まったく同じマシンの2つのnginxの構成は、奇妙な点があり、あなたが呼び出す場合にのみ、以下に示すように、ピアサーバーの障害の問題は、他のサービスに影響を与えないということです。
2つの奇妙な現象が終わっ対立に発展し、PEにつながっているので、開発者はnginxのために尋ねたので、第1の現象によれば、問題の第二のnginxのnginxのエラーが合理的な推論であるその後、良いものをnginxの。第2の現象によると、このビジネスは唯一、それは確かにエンドサーバのビジネスのための問題で、他のビジネス上の問題が存在しない、エラーを呼び出します、PEは、nginxの鍋を考えるべきではありません。長い紛争の後、初期の開発プログラムが展開nginxのにある効果を見-_-!私はこのプログラムが飛んでいない、盲目の拡大は逆効果を引き起こす可能性があることを感じます。私が最初にそれを捕獲状況になります。
Etherealの
事実は、私は問題はないはずですので、nginxのような共通のコンポーネントが、問題は、リモートサーバー上で表示されるべきだと思います。ピア反応の開発によると、彼は問題をカールしていないと(デッドロックし、この問題のため、彼は捜査を支援するために私達の会社に送信されたために)何の問題もなくカールN回を行うには、自分のサーバー上に住んでいます。次のように続いて、ファイアウォールの労働者の取り込み外部ネットワークを見つけ、キャプチャ結果は以下の通りであった
時点ソースオブジェクトのIPのIPプロトコル情報
2019年7月25日午後四時45分41秒TCP 20.1.1.1 30.1.1.1 58850-> 443 [SYN]
2019から07午後4時45分42秒TCP 20.1.1.1 30.1.1.1 -25 [TCP再送]> 443 58850- [SYN]
2019年7月25日16時45分44秒TCP 20.1.1.1 30.1.1.1 [TCP再送] 58850-> 443 [同期]
ReadTimeOutタイムアウトがアプリケーションサーバー設定3Sを終了、SO 2 SYN再送の後、ピアが与えられているからです。以下に示すように:
(注:tcp_syn_retries Linuxのnginxのホストサーバが2が設けられている)は
、分析結果を取得します
キャプチャデータから導出させず、第二ステーションがピアサービスにnginxのにSYNパケットを送信し、サービスの終了に応答、接続タイムアウトnginx2を作成するには、nginxのに接続タイムアウトReadTimeOutアプリケーションサーバー端(短アプリケーションサーバーにつながった、得られました)。
ピアサービスへのファイアウォールのSYNが失われた外の通常の推論によるとでなければなりません。そして、アリの雲は非常に安定したサービス・プロバイダーとして、このような大規模な確率の損失の現象が表示されません。ビューの非常に成熟SpringBootポイントを使用して反対側の端サーバーからは、このバグは発生しません。そして、最も可能性の高い問題は、サーバー側に自分自身を設定することであります。
エンドサーバーのトラブルシューティングを行うにはログインしてください
他の開発者が現場に来たので、私は自分のコンピュータがサービスを直接アリのクラウドサーバーを記録し使用しているため。以下に示すdmesgの最初ののこぎり、与えられた杭の下
にdmesg:
__ratelimit:33491概要は、コールバックに抑え
、待機時間テーブルバケットのオーバーフロー:TCP
TCP:待機時間テーブルバケットのオーバーフロー
TCP:タイムテーブルバケットオーバーフロー待ち
......
気持ちをほとんど関係が、この情報だけでは問題を見つけることができません。その後、私は-s netstatコマンドで実行されていました:
netstatの-s
......
そのため、パッシブ接続の16990は、タイムスタンプを拒否
......
このコマンドは、タイムスタンプ(タイムスタンプ)が原因拒否している16990のパッシブ接続に変換され、重要な情報を提供します!これは設定が原因であることが判明した情報をチェック
tcp_timestamps == 1 && tcp_tw_recycle == 1を
パッシブ接続拒否で問題が発生しますNAT状況で。そして、上記のdmesgログを解決するために、与えられたオンラインソリューションをtcp_tw_recycle = 1とtcp_timestampsデフォルトを設定することである1である、と私たちのクライアントは、問題のすべての特性に合わせて、NATから呼んでいます。だから私は彼らのtcp_timestamps 0、設定しようとする
エコー'0'>は、/ proc / sys / net / IPv4の/ tcp_timestamps
または
エコー'0'>は、/ proc / sys / net / IPv4の/ tcp_tw_recycleを
呼び出してきた数十もはや正しくないレポート!
Linuxのソースコード解析
の問題は、解決しますが、私はそれがどのように最終的にはソースコードレベルからこの問題を見てみたいので、彼は(のlinux-2.6.32のソースコードに基づいて)対応するソースコードを勉強し始めました。問題は、リモートサーバnginxの最初のハンドシェイクで時間と場所は(つまり最初のSYNを送信します)ので、私たちは主に原因を追跡するために関連しているので:
//スリーウェイハンドシェイク最初のSYNのカーネルブランチ取っている
tcp_v4_do_rcvを
| - > tcp_v4_hnd_req
| - > tcp_rcv_state_process
/ **ケースTCP_LISTEN && TH-> SYN * /
| - > conn_request(tcp_v4_conn_request)
内側にtcp_v4_conn_requestでtcp_timestamps上のコードは、我々は(他の不必要なロジックを無視して次のコード)を追跡し続ける:
int型tcp_v4_conn_request(構造体* SKたちの靴下、構造体sk_buff * SKB)
{
..... 。
。/ * VJのIDEA我々見保存ラスト・タイムスタンプ
入力するとき、あなたは相手の表をしたいですかどこでから*
*状態TIME-WAITを、と前にITに対してチェック
*新しい新しい接続要求を受け入れる。
*効果にコメント:
私たちはTIME_WAIT状態に入りしています*最後のタイムスタンプは、ピア・テーブルに記録する場合、
*新しい着信接続要求がときにタイムスタンプをチェック
* /
//がケースにtcp_tw_recycleオープンとtcp_timestamps
(tmp_opt.saw_tstamp && IF
tcp_death_row.sysctl_tw_recycle &&
(DSTを= inet_csk_route_req(SK、REQ)) != NULL &&
!= NULL &&(ピアrt_get_peer =((rtable構造体*)DST)を使用)
{)をsaddr v4daddr == peer->
/ * ** TCP_PAWS_MSL == 60 /
/ ** = www.yinchengylzc.cn TCP_PAWS_WINDOW。1 * = /
/ /以下は、同じピアIP用で
記録された接続状態// tcp_ts_stampのTIME_WAITピアIPネイティブタイムスタンプに
最後// TIME_WAITにおける現在時刻がタイムスタンプの実際の記録を入力した後1分以内
(get_seconds場合()<peer-> tcp_ts_stamp + TCP_PAWS_MSL &&
@そのパケットのタイムスタンプは、最近(ピア・バンドを介して)受信tcp_ts
//記録状態TIME_WAITに記録された最後のより少ないオーバータイムスタンプと現在のリクエストの終了後ピア・スタンプ
(S32)(peer-> tcp_ts - req-> ts_recent)>
TCP_PAWS_WINDOW){
//増加パッシブ接続拒否統計
NET_INC_STATS_BH(sock_net(www.lannxinzc.cn)、LINUX_MIB_PAWSPASSIVEREJECTED);
//の中に滴下位相リリース
後藤drop_and_releaseを。
コアな意味で、コードtcp_timestampsの場合はtcp_tw_recycleオープン、そこに新しい着信接続で、新しいタイムスタンプが前のコネクタよりも小さい場合、接続状態に入るTIME_WAIT 1分でip同じ接続、最後のパケットのタイムスタンプがTIME_WAIT状態になり、それがシンが進むのdrop_and_releaseを破棄します。私たちは、drop_and_releaseに従うことを続ける:
int型tcp_v4_conn_request(構造体* SKたちの靴下、構造体sk_buff * SKB){
......
drop_and_release:
dst_release(DST);
drop_and_free:
reqsk_free(REQ);
ドロップ:
リターン0;
}
私たちは、探し続けた場合tcp_v4_conn_requestは、その後、システムのパフォーマンスが何であるか、0を返します。
int型tcp_rcv_state_process(SKB構造体のsk_buff *、私たちの靴下www.shenzhenztgs.com SKをストラクト
構造体tcphdr TH *、符号なしwww.chuanchenpt.cnさlen)
{
......
//のでtcp_v4_conn_requestので、次の枝を取っていない
場合(icsk-> icsk_af_ops-> conn_request( SK、SKB)<0)
。1つのリターンは
//ので、ここも0を返します
。kfree_skb(SKB)は
0を返す;
}
//当時ジャンプtcp_v4_do_rcv
int型tcp_v4_do_rcv(私たちの靴下SKをストラクト*、* sk_buff SKB構造体)
{
//リターン側によるtcp_rcv_state_processが0であるが、したがって、ロジックは行かないリセット
(tcp_rcv_state_process(SK、SKB、tcp_hdr(SKB)、skb-> LEN)){IF
; RSK = SK
; GOTOリセット
}
リセットパケットが送信されない場合、与えないこと//方法の後任意の応答の終わり
TCP_CHECK_TIMER(SK);
戻り0;
}
このような状況は、SYNパケットの廃棄を対応生じる、トラッキング源からわかるように、ピアは、再送信を実行する任意の応答SYNを得ることができない、これは捕捉の結果と一致しています。
そして、外観はすべての問題を証明した
nginxのは、失敗した場合nginxの大丈夫があったのはなぜ
TCPタイムスタンプので、マシンの現在の日付コマンドによって与えられたタイムスタンプを参照されていません。このタイムスタンプの計算規則がここで開始されていない、唯一の各マシンのタイムスタンプが異なることを知っている必要がある(と大幅に異なる場合があります)。私たちは終わりのための呼び出しとしてNATを使用していますので、2つのnginxのは、2台のピアサーバーが混乱になるときのタイムスタンプに送信し、その後、同じピア・サーバーのIPように見えます。nginx1タイムスタンプは、分でので、限り、接続要求nginx2後の接続要求(ショートコネクタを)、そこnginx1ように破棄されていますが、タイムスタンプnginx2よりも大きくなっています。以下に示すように:
ピア・セルフテストが正常であったなぜ
スタンプネイティブ呼び出し、このマシンは、マシン(機械)ので、混乱があるためです。
なぜnginx2他のサービスを呼び出すことは正常です
ので、サーバがtcp_tw_recycleを開けませんでした他の外部サービスの。この問題は、実際には0に設定tcp_tw_recycleを解決することができます。また、Linuxカーネルの高いバージョンでは、このパラメータtcp_tw_recycle削除されました。
概要は、
現在のIPアドレスの不足とは、DNSパケットサイズ(512バイト)を制限しているため、ネットワークアーキテクチャのほとんどは、相互に作用すると、外部、に設定tcp_tw_recycle 1基本的な問題が発生しますNATの方法を使用することです。この問題は通常、究極の根を見つけるために、それに従うことができるように、TCP契約のいくつかの理解を持っている必要があります。