ネットワーク開発の注意事項

2265 ワード

自分でserverを実現する時、必ずカーネルTCPに関するパラメータを調整してこそ、システムのスループットを最適にすることができます。接続を確立するスループット、ネットワークIOスループット、および接続をオフにする処理が必要です。
接続を確立
私達は性能テストをする時、機械のハードウェアの配置がとても良いことを発見するかもしれませんが、合併数をどのように調整しても、マシンのロードは全然上がりません。このような場合は、オペレーティングシステムが接続を確立してボトルネックになります。接続を確立する3回の握手の間、Linuxカーネルは2つのキューに使用される:
  • 未完成の列はSYN_にあります。RECV状態のsocketキュー
  • はすでにキューを完成しました。ESTABLISHEDにありますが、acceptが適用されていません。
    二つのパラメータを調整したいです。
  • net.ipv 4.tcp_max_syn_backlog キューの最大長さが未完成で、20480に設定することが推奨されています。
  • net.co re.somaxconn 完了した列の最大長さは20480に設定することを推奨します。
  • システムは上の二つの構成についての標準値が小さいです。200以上しかありません。自分でServerを開発するなら、この二つの構成を修正しなければなりません。sbin/syssctl-a grep xxxで確認できます。修正後、syssctl-pがカーネルパラメータを再読み込みします。
    listenメソッドのbacklogパラメータ
    listen()に導入されたbacklogsを適用して、完成した列の長さを指定します。システムの値はminです。したがって、listenを呼び出した時に大きなbacklogs値が入ることを提案します。
          The behaviour of the backlog parameter on TCP sockets changed with Linux 2.2.  Now it
          specifies the queue length for completely established sockets waiting to be accepted,
          instead  of  the  number of incomplete connection requests. The maximum length of the
          queue for incomplete sockets can be set using the tcp_max_syn_backlog  sysctl.   When
          syncookies  are enabled there is no logical maximum length and this sysctl setting is
          ignored.  See tcp(7) for more information.
    accept()スレッド
    アプリケーションがaccept()を呼び出しても、新しい接続が確立されても、完了したキューと未完成のキューは、容量の上限に達して、新しい接続を作成できません。
    TCP書き込み
    sendQが小さすぎると、ネットの出力スループットが上がりません。tpsも上がりません。スライドウィンドウのサイズはエンドrecvQのサイズに制限されているので、recvQも小さすぎてはいけません。
    /etc/syssctl.com nfにはいくつかのパラメータがあり、socketのsendQおよびrecvQのサイズを変更することができる。
  • net.ipv 4.tcp_rmem=4096 16777216/読み書き用バッファエリアmin default max
  • を設定します。
  • net.ipv 4.tcp_wmem=4096 16777216
  • net.ipv 4.tcp_mem=196608 262144 393216/単位:ページ
  • 接続を閉じる
    修正/etc/syssctl.comにおける以下のパラメータは、
  • net.ipv 4.tcp_fintimeout自発的に接続を閉じる方はFIN_にいます。WAIT 2状態のタイムアウト時間は、端のFINカバンが届いていないため、FIN_uにあります。WAIT 2
  • net.ipv 4.tcp_tw_reuseは直接TIME_を再利用します。WAIT状態のsocket
  • net.ipv 4.tcp_tw_recycle回収利用TIME_WAIT状態のsocketは、tcp_と分かりません。tw_reuseにはどんな違いがありますか?
  • をsession Config.set Solinger(-1)
  • に変更しました。
    ツール
    netstat-s
    netstat-s列は、様々なネットワークイベントの回数を挙げています。中から手がかりを見つけることもできます。