/ proc / sys / net / ipv4 / tcp_tw_reuseの値を変更することは危険ですか?


10

最近仮想マシンに変換された本番システムがいくつかあります。MySQLデータベースに頻繁にアクセスするアプリケーションがあり、クエリごとに接続を作成し、クエリを実行して、その接続を切断します。

これは適切なクエリ方法ではありませんが(わかっています)、回避できないように見える制約があります。とにかく、問題はこれです:マシンが物理ホストだったのに、プログラムは問題なく実行されました。仮想マシンに変換すると、データベースへの接続が断続的になるという問題に気付きました。ある時点で、TIME_WAITに24000以上のソケット接続がありました(物理ホスト上で、私が見た最大のものは17000でした-良くはありませんが、問題を引き起こしていません)。

これらの接続を再利用して、接続の問題が発生しないようにしたいと思います。

質問:

tcp_tw_reuseの値を1に設定しても問題ありませんか?明らかな危険は何ですか?絶対にやらない理由はありますか?

また、システム(RHEL / CentOS)を取得して、非常に多くの接続がTIME_WAITにならないようにしたり、再利用できるようにする方法は他にありますか?

最後に、tcp_tw_recycleを変更するとどうなりますか?

よろしくお願いします!


1
このリンクは、tcp_tw_recycleとtcp_tw_reuseの危険性をよく説明しています。それを使わないでください。

回答:


8

ダウンタイムを安全に減らすことができますが、パケット損失またはジッターがあるネットワークで接続が適切に閉じられないという問題が発生する可能性があります。私は1秒からチューニングを開始せず、15から30で開始して、下に向かって作業します。

また、実際にアプリケーションを修正する必要があります。

RFC 1185のセクション3.2で適切な説明があります。

TCP接続が閉じられると、TIME-WAIT状態の2 * MSLの遅延により、ソケットペアが4分間拘束されます([Postel81]のセクション3.5を参照)。1つの接続を閉じて新しい接続を開くアプリケーション(TCPなど) 、ストリームモードを使用したFTPデータ転送接続)は、毎回新しいソケットペアを選択する必要があります。この遅延は、2つの異なる目的に役立ちます。

 (a)  Implement the full-duplex reliable close handshake of TCP. 

      The proper time to delay the final close step is not really 
      related to the MSL; it depends instead upon the RTO for the 
      FIN segments and therefore upon the RTT of the path.* 
      Although there is no formal upper-bound on RTT, common 
      network engineering practice makes an RTT greater than 1 
      minute very unlikely.  Thus, the 4 minute delay in TIME-WAIT 
      state works satisfactorily to provide a reliable full-duplex 
      TCP close.  Note again that this is independent of MSL 
      enforcement and network speed. 

      The TIME-WAIT state could cause an indirect performance 
      problem if an application needed to repeatedly close one 
      connection and open another at a very high frequency, since 
      the number of available TCP ports on a host is less than 
      2**16.  However, high network speeds are not the major 
      contributor to this problem; the RTT is the limiting factor 
      in how quickly connections can be opened and closed. 
      Therefore, this problem will no worse at high transfer 
      speeds. 

 (b)  Allow old duplicate segements to expire. 

      Suppose that a host keeps a cache of the last timestamp 
      received from each remote host.  This can be used to reject 
      old duplicate segments from earlier incarnations of the 

*注意:FINを送信する側は必要な信頼性の程度を知っているため、FINの受信者のTIME-WAIT遅延の長さを判別できるはずです。これは、FINセグメントの適切なTCPオプションで実現できます。

      connection, if the timestamp clock can be guaranteed to have 
      ticked at least once since the old conennection was open. 
      This requires that the TIME-WAIT delay plus the RTT together 
      must be at least one tick of the sender's timestamp clock. 

      Note that this is a variant on the mechanism proposed by 
      Garlick, Rom, and Postel (see the appendix), which required 
      each host to maintain connection records containing the 
      highest sequence numbers on every connection.  Using 
      timestamps instead, it is only necessary to keep one quantity 
      per remote host, regardless of the number of simultaneous 
      connections to that host.

説明ありがとう。問題はライブラリーにあり、私が制御することはできません。
Sagar

6

これはあなたの質問に答えません(そしてそれは18ヶ月遅れます)が、レガシーアプリを再利用するポートを作る別の方法を提案します:

システムでtcp_tw_reuse(またはtcp_tw_recycle)を設定する代わりの便利な方法は、共有ライブラリを(を使用してLD_PRELOAD)アプリに挿入することです。そのライブラリは、ポートの再利用を許可できます。これにより、レガシーアプリはシステムのすべてのアプリで強制的にポートを再利用せずにポートを再利用できるため(アプリの変更は不要)、微調整の影響を制限できます。例えば、

    LD_PRELOAD=/opt/local/lib/libreuse.so ./legacy_app

この共有ライブラリは、socket()呼び出しをインターセプトし、実際のsocket()を呼び出し、返されたソケットにSO_REUSEADDRやSO_REUSEPORTを設定する必要があります。見http://libkeepalive.sourceforge.netこれを行う方法の例については、(キープアライブで、このターン、しかしSO_REUSEPORTをオンにすると非常に似ています)。動作不良のレガシーアプリがIPv6を使用している場合は、55行目libkeepalive.c

    if((domain == PF_INET) && (type == SOCK_STREAM)) {

    if(((domain == PF_INET) || (domain == PF_INET6)) && (type == SOCK_STREAM)) {

行き詰まっている場合は、メールを送ってください。コードを書いて送ります。


6

この値を1に変更しても問題ないと思います。より適切な方法は、次のコマンドを使用することです。

[root@server]# sysctl -w net.ipv4.tcp_tw_reuse=1

私が知っている明らかな危険性はありませんが、Googleをすばやく検索するとこのリンクが生成されます。このリンクtcp_tw_reuseはに勝る代替案ですがtcp_tw_recycle、使用する場合は注意して使用する必要があります。


2
いいえ、それはそれが言っていることではありません。それは(tcp_tw_reuseについて話している)、「それは一般にtcp_tw_recycleより安全な代替手段です」と言います。
ファンティウス2013年

0

それらがTIME WAITの場合、接続は再利用できません。アプリケーションとMySQLの間のネットワークでパケット損失がない場合は、タイムアウトを下げることができます。

ただし、最善の解決策は、データベースと接続プールへの永続的な接続を使用することです。


1
実際には、必ずしもそうではありません。一部のシステムでは、TIME_WAITでのソケットの使用が許可されます。これが私の質問です。それが可能かどうかではなく、明白でそれほど明白ではない危険とは何か。ありがとう!
Sagar
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.