centosカーネル最適化の詳細


システムコア部の設定はvim /etc/sysctl.conf1.IPV 6 netを無効にする.ipv6.conf.all.disable_ipv 6=1#システム全体のすべてのインタフェースを無効にするIPv 6 net.ipv6.conf.default.disable_ipv6 = 1 net.ipv6.conf.lo.disable_ipv 6=1#指定されたインタフェースを無効にするIPv 6(ここではlo)は、理想的には、IPv 6への移行プロセスは最終的なユーザーに見られるべきではありませんが、IPv 4/IPv 6ハイブリッド環境では、IPv 4とIPv 6の間の何気ない衝突に由来するさまざまな質問にぶつかることがあります.例えば、apt-getやsshがIPv 6接続に失敗したり、DNSサーバがIPv 6のAAAAレコードを誤って空にしたり、IPv 6をサポートしているデバイスがインターネットサービスプロバイダが残したIPv 4ネットワークに互換性がないなど、アプリケーションのタイムアウトの問題に遭遇します.もちろん、LinuxマシンでIPv 6を盲目的に無効にする必要はありません.IPv 6が約束した様々なメリットに鑑みて、社会の一員として私たちは最終的にそれを十分に抱擁しなければならないが、エンドユーザーにトラブルシューティングプロセスの一部として、IPv 6が確かに元凶であれば、それを閉じてみることができます.
2.スワップスペースvmを設定.swappiness=0 swappiness、Linuxカーネルパラメータは、実行時のメモリの相対的な重みを制御します.swappinessパラメータ値は、0~100の範囲で設定できます.低パラメータ値はカーネルができるだけ交換を少なくし、より高いパラメータ値はカーネルが交換空間をより多く使用するようにします.デフォルト値は60です(ネットワーク資料を参照:残りの物理メモリが40%(40=100-60)未満の場合、スワップ領域の使用が開始されます).ほとんどのオペレーティングシステムでは、100に設定すると全体的なパフォーマンスに影響し、0に設定すると応答の遅延が減少します.
3.チェックの期限がどのくらい切れているかを決定する隣人エントリnet.ipv4.neigh.default.gc_stale_time=120 ARPパラメータで,一次隣接層記録の有効性の周期を調べた.隣接するレイヤレコードが無効になると、データを送信する前に、もう一度解析されます.デフォルトは60秒です.
4.逆フィルタnetを閉じる.ipv4.conf.all.rp_filter = 0 net.ipv4.conf.default.rp_filter=0逆フィルタリング技術は、システムがIPパケットを受信した後、そのIPが要求に合っているかどうかを確認し、要求に合わないIPパケットがシステムに破棄される.この技術をrpfilterと呼ぶ.どのようなバッグが要求に合わないのですか?例えば、ユーザは、Aポート上でIPパケットを受信し、そのIPがBであることを確認する.そして、BというIPに対して、送信時にどのポートを使うべきかを調べ、「そのパケットを受信すべきでないポートでそのIPパケットを受信した場合、そのIPパケットはhacker行為であると考える」
5.arp要求パケットにおけるソースipアドレス制限net.ipv4.conf.default.arp_announce = 2 arp_announceは、ネットワークインタフェース(NIC)上で発行されるARP要求パケット内のソースIPアドレスに対して相応の制限を行う.ホストは、このパラメータ値に応じて、ARP要求パケットのソースIPアドレスとして、IPパケットのソースIPまたは現在のネットワークインタフェースカードのIPアドレスを選択する.詳細はこの1編を見ることができて、よく書いています.https://www.jianshu.com/p/a682ecae9693
6.SYNクッキーnetを開く.ipv4.tcp_syncookies=1通常、サーバ側がクライアントから送信されたSYNパケットを受信すると、接続要求情報を保存し、SYN+ACKパケットをクライアントに送信し、接続要求ブロックを半接続キューに追加するための接続要求ブロック(すなわちrequest_sock構造)が割り当てられる.クライアントはSYN+ACKパケットを受信すると,ACKパケットを送信してサーバ側のパケットを確認する.サーバ側はクライアントの確認を受けた後,保存した接続情報に基づいて新しい接続を構築し,リスニングソケットの接続キューに配置し,ユーザ層accept接続を待つ.これは正常ですが、高すぎる場合やSYN flood攻撃を受けた場合、半接続キューのスロット数がすぐに消費され、新しい接続要求が破棄され、SYN cookiesテクノロジーは、サーバが半接続キューがいっぱいの場合でも新しいSYN要求を処理できるようにします.SYN cookiesオプションがオンの場合、半接続キューがいっぱいの場合、SYN cookiesはSYN要求を破棄するのではなく、ソース宛先IP、ソース宛先ポート番号、受信したクライアント初期シーケンス番号、その他のセキュリティ数値などの情報をhash演算し、暗号化してサーバ側の初期シーケンス番号をcookieと呼ぶ.サーバ側は、初期シーケンス番号がクッキーのSYN+ACKパケットを送信すると、割り当てられた接続要求ブロックを解放する.クライアントのACKパケットを受信すると,サーバ側はクライアントのACKシーケンス番号を1減算して得られた値を上記要素hash演算で得られた値と比較し,等しければ3回の握手を直接完了し,新しい接続を構築する.SYN cookiesメカニズムの核心は、攻撃による無駄な接続要求ブロックの大量構築を回避し、メモリが消費され、正常な接続要求を処理できないことです.
7.リモートから開始するTCP接続netを何回確立するか試みる.ipv4.tcp_synack_retries = 3 tcp_synack_retriesはLinuxコアがSYN要求に応答したときに初期SYNを何回再送信しようとするかを表示または設定し、ACKパッケージを破棄することを決定します.これはいわゆる3回の握手(threeway handshake)の2番目のステップです.すなわち、システムは、遠位端から始まるTCP配線を何回確立しようと試みるかということである.tcp_synack_retriesの値は正の整数でなければなりません.255を超えることはできません.再送信するたびに約30~40秒かかるので、次の再送信を試みるか、破棄を決定します.tcp_synack_retriesのデフォルト値は5です.すなわち、各配線は約180秒(3分)後に時間超過を決定します.
8.接続再試行回数net.ipv4.tcp_syn_retries=3新規接続の場合、カーネルがSYN接続要求を何個送信するかによって、破棄が決定されます.255より大きくないでください.デフォルト値は5で、180秒前後に対応します.(大負荷で物理的な通信が良好なネットワークでは、この値は高く、2に変更可能である.この値は対外的な接続のみに対して、入ってきた接続は、tcp_retries 1によって決定される)
9.コアがTCP接続のメモリnetに割り当てる.ipv4.tcp_mem=379008 505344 758016最初の数字は、tcpが使用するpageが379008未満(1.4 Gメモリに相当)の場合、kernelはそれに関与しない2番目の数字は、tcpが505344を超えるpagesを使用すると、kernelは「memory pressure」圧力モードの3番目の数字は、tcpが758016を超えると(2.9 GBのメモリに相当)、Out of socket memory/tcp_と報告されます.wmem(3個のINTEGER変数):min,default,max min:TCP socketの送信バッファに使用するメモリの最小値を予約します.各tcp socketは、推奨後に使用できます.既定値は4096(4 K)です.default:TCP socketの送信バッファに使用するメモリ数を予約します.デフォルトでは、この値は他のプロトコルで使用するnetに影響します.core.wmem_default値は、一般的にnet.を下回る.core.wmem_defaultの値.既定値は16384(16 K)です.max:TCPソケット送信バッファに使用されるメモリの最大値.この値はnetに影響しません.core.wmem_max,「静的」選択パラメータSO_SNDBUFはこの値の影響を受けません.既定値は131072(128 K)です.(サーバにとって、このパラメータの値を増やすことはデータの送信に役立ち、私のネットワーク環境では、51200 131072 204800に変更されました)/tcp_rmem(3つのINTEGER変数):min,default,max min:TCP socketの受信バッファに使用されるメモリ数を予約し、メモリに緊張が発生した場合でもtcp socketは少なくとも受信バッファに使用されるメモリ数が多く、デフォルト値は8 Kです.default:TCP socketにバッファを受信ために予約するメモリの数.デフォルトでは、この値は他のプロトコルで使用するnetに影響します.core.wmem_default値.この値はtcp_で決定されますadv_win_scale、tcp_app_winとtcp_app_win=0のデフォルト値の場合、TCPウィンドウサイズは65535です.デフォルト値は87380 max:TCPソケット受信バッファのメモリ最大値.この値はnetに影響しません.core.wmem_max,「静的」選択パラメータSO_SNDBUFはこの値の影響を受けません.既定値は128 Kです.デフォルトは87380*2 bytesです.(.maxの設定はdefaultの2倍が望ましいことがわかりますが、NATにとって主にそれを増やすべきで、私のネットワークでは51200 131072 204800)/tcp_mem(3つのINTEGER変数):low,pressure,high low:TCPがこの値より低いメモリページ数を使用している場合、TCPはメモリの解放を考慮しません.(理想的には、この値はtcp_wmemに指定された2番目の値と一致する必要があります.この2番目の値は、最大ページサイズに最大同時要求数を乗じてページサイズ(131072*300/4096)で割ったことを示します.)pressure:TCPがこの値を超えるメモリページ数を使用した場合、TCPはメモリ使用を安定させようとし、pressureモードに入り、メモリ消費がlow値を下回るとpressure状態を終了する.(理想的には、この値はTCPが使用できる総バッファサイズの最大値であるべきである(20480*300/4096).high:すべてのtcp socketsをキューバッファのページ量に使用できます.(この値を超えるとTCP接続が拒否されます.これが、保守的すぎる(512000*300/4096)理由です.この場合、提供される価値は大きく、予想される2.5倍の多くの接続を処理することができます.あるいは、既存の接続が2.5倍のデータを伝送できるようにする.私のネットワークでは192000,000,000,000,732000)
#  ipv6
net.ipv6.conf.all.disable_ipv6 = 1                          #            IPv6
net.ipv6.conf.default.disable_ipv6 = 1                  
net.ipv6.conf.lo.disable_ipv6 = 1                          #           IPv6(   :lo)

#      
vm.swappiness = 0						#           --         vm.min_free_kbytes limit ,      。

#            
net.ipv4.neigh.default.gc_stale_time = 120

#        
net.ipv4.conf.all.rp_filter = 0
net.ipv4.conf.default.rp_filter = 0

#arp     ip    
#                 arp_announce   ,    (     default,     all)    arp_announce  。
net.ipv4.conf.default.arp_announce = 2    #2-       IP         IP    ARP    IP  。(0,1       )
net.ipv4.conf.lo.arp_announce = 2            
net.ipv4.conf.all.arp_announce = 2

#  SYN Cookie
net.ipv4.tcp_syncookies = 1   #    SYN Cookies。   SYN       ,  cookies   ,     SYN  ,   0,    ;

net.ipv4.tcp_synack_retries = 3  #  3          TCP  
net.ipv4.tcp_syn_retries = 3       #        ,     3 SYN         。

#     TCP     
net.ipv4.tcp_mem = 379008       505344  758016  
net.ipv4.tcp_wmem = 4096        16384   4194304
net.ipv4.tcp_rmem = 4096          87380   4194304

#        
net.core.wmem_default = 8388608   #              (      )
net.core.rmem_default = 8388608    #              (      )
net.core.rmem_max = 16777216      #   
net.core.wmem_max = 16777216    #   

net.core.somaxconn = 60480  #      (LISTEN)          ,                      
net.ipv4.tcp_max_orphans = 262144 #         TCP                    。        ,                  。              DoS   ,                 ,        (         )。
net.ipv4.tcp_max_syn_backlog = 262144  #                  (SYN  )     ,   1024,       262144,                。
net.ipv4.tcp_timestamps = 0  #             。  1Gbps                 。            “  ”    。        。
net.core.netdev_max_backlog = 262144 #                            ,               

kernel.msgmnb = 4203520 #             。
kernel.msgmni = 128			#              。                ,               。
kernel.msgmax = 8192        #       size。

kernel.core_pattern = /var/log/core/core-%e-%p-%t  #  core    ,core       :core-%e-%p-%t    core.    .  id.   

net.ipv4.tcp_fin_timeout = 10 #              ,           FIN-WAIT-2     。
net.ipv4.tcp_keepalive_time = 300 # keepalive      ,TCP  keepalive     。
net.ipv4.ip_local_port_range = 1024 65000 #              (  )             ,     TCP UDP  。
net.ipv4.tcp_max_tw_buckets = 8000 #        TIME_WAIT     ,        ,TIME_WAIT             。
net.ipv4.route.max_size = 5242880 #           ,           .
net.unix.max_dgram_qlen = 512     #               ,    unix         .
   listen              .
fs.file-max = 2000000   #                    (  ab            !!!!)

構成を有効にする