Linuxカーネルのチューニング

まず、オープンシステムとプロセスの数を最適化するために開いているファイルの数

システムのパフォーマンスを損なうプロセスの暴走を防ぐために、UnixおよびLinuxは、プロセスによって使用されるリソースのほとんどを追跡し、ユーザーとシステム管理者は、リソースの制約になります、そのようなユーザーコントロールなどのオープンファイルの最大数利用者のためのプロセスの数を開きますソフトとハードリミットを:制限は、制限手段には、一般的です。
注:ソフトリミットと多くの使用がない、一般的にこの値が等しくなるように設定されている両方。

1、一時的に方法を設定するオープンファイルの最大数:

  • このパラメータは、サーバー無効、再起動され、コマンドライン端末は、以下のコマンドを実行します。
ulimit   -n  65535
  • 永久にセットする方法

カーネルファイルを制限するために、次のコード/etc/security/limits.confの端を:

* 	soft 	noproc			65535
* 	hard 	noproc			65535
* 	soft 	nofile			65535
* 	hard 	nofile			65535

あなたは全体のLinuxファイルシステムの最大数を制限する必要がある場合は修正するために、提供され/proc/sys/fs/file-maxた値を、そのLinux总文件打开数、例えば、へ:echo 3865161233 >/proc/sys/fs/file-max。
"*"表示所有用户。如果改成root就表示对root用户的限制。

2、ファイルディスクリプタ

我们打开一个服务,会起很多进程,进程又会打开很多的文件,比如服务配置文件、日志文件等等,<font color=red>文件描述符便是内核为了高效管理已被打开的文件所创建的索引。</font>

:私たちは今、メインプロセスnginxのすべてのファイル記述子を見て
ここに画像を挿入説明ここに画像を挿入説明注意:ファイルディスクリプタ小さな非負の整数を!


知識(非優先)の拡張:
各プロセスのためのLinuxシステムメンテナンスファイルディスクリプタテーブルは、この表の値は、別のプロセスで使用すると、同じファイルディスクリプタが表示されます、同じファイルディスクリプタゼロベースですそれは、同じファイルを指すことが可能である、別のファイルにあり指すことがあります。次のようにファイル操作、3つの概念的なデータ構造の維持のためのLinuxカーネルは、次のとおりです。

  • プロセス・レベルのファイルディスクリプタテーブル;
  • システムレベルのオープンファイルディスクリプタテーブル;
  • iノードテーブルのファイルシステム。

3件の独自のGoogle検索との違い!

二、TCP 3ウェイハンドシェイクと4オフ

ここに画像を挿入説明使用tcpdumpのパケットキャプチャ解析:
ことを確認してくださいnginxのは、正常に展開されています!
ここに画像を挿入説明

tcpdump -i ens33 -nn host 172.16.193.201 and port 80 #抓取所有经过ens33,目的或源地址:端口是172.16.193.201:80的网络数据
-i:指定本地监控的网络接口
-n:对地址以数字方式显式,否则显式为主机名;
-nn:除了-n的作用外,还把端口显示为数值,否则显示端口服务名;

Nginxはそれにアクセスします。
スリーウェイハンドシェイク:
ここに画像を挿入説明4オフ:
ここに画像を挿入説明

第三に、カーネルパラメータ最適化

ほとんどのカーネルパラメータは、Linuxの/ proc / sysのディレクトリの下に格納され、システムの実行中に変更することができ、機械は一般的に失敗し、再起動、ファイルは/ procとカーネルの設定ファイル/ sysの/etc/sysctl.conf変数が対応を存在する、修正されましたsysct.confプロファイル、実際には、/ procの/ sysのパラメータを変更することです!

1、BATの本番環境の完全なカーネルパラメータ:

net.ipv4.ip_forward = 0
net.ipv4.conf.default.rp_filter = 1
net.ipv4.conf.default.accept_source_route = 0
kernel.sysrq = 0
kernel.core_uses_pid = 1
net.ipv4.tcp_syncookies = 1
kernel.msgmnb = 65536
kernel.msgmax = 65536
kernel.shmmax = 68719476736
kernel.shmall = 4294967296
net.ipv4.tcp_max_tw_buckets = 10000
net.ipv4.tcp_sack = 1
net.ipv4.tcp_window_scaling = 1
net.ipv4.tcp_rmem = 4096 87380 4194304
net.ipv4.tcp_wmem = 4096 16384 4194304
net.core.wmem_default = 8388608
net.core.rmem_default = 8388608
net.core.rmem_max = 16777216
net.core.wmem_max = 16777216
net.core.netdev_max_backlog = 262144
net.core.somaxconn = 262144
net.ipv4.tcp_max_orphans = 3276800
net.ipv4.tcp_max_syn_backlog = 262144
net.ipv4.tcp_timestamps = 0
net.ipv4.tcp_synack_retries = 1
net.ipv4.tcp_syn_retries = 1
net.ipv4.tcp_tw_recycle = 1
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_mem = 94500000 915000000 927000000
net.ipv4.tcp_fin_timeout = 1
net.ipv4.tcp_keepalive_time = 30
net.ipv4.ip_local_port_range = 1024 65535

2、Linuxカーネルの一般的な議論が詳細に

net.ipv4.tcp_timestamps = 1 //该参数控制RFC 1323 时间戳与窗口缩放选项;
net.ipv4.tcp_sack = 1 //选择性应答(SACK)是 TCP 的一项可选特性,可以提高某些网络中所有可用带宽的使用效率;
net.ipv4.tcp_fack = 1 //打开FACK(Forward ACK) 拥塞避免和快速重传功能;
net.ipv4.tcp_retrans_collapse = 1  //打开重传重组包功能,为0的时候关闭重传重组包功能;
net.ipv4.tcp_syn_retries = 5 //对于一个新建连接,内核要发送多少个SYN 连接请求才决定放弃;
net.ipv4.tcp_synack_retries = 5
tcp_synack_retries //显示或设定Linux在回应SYN要求时尝试多少次重新发送初始SYN,ACK封包后才决定放弃;
net.ipv4.tcp_max_orphans = 131072 //系统所能处理不属于任何进程的TCP sockets最大数量;
net.ipv4.tcp_max_tw_buckets = 5000//系统同时保持TIME_WAIT套接字的最大数量,如果超过这个数字,TIME_WAIT套接字将立刻被清除并打印警告信息;默认为180000,设为较小数值此项参数可以控制TIME_WAIT套接字的最大数量,避免服务器被大量的TIME_WAIT套接字拖死;

net.ipv4.tcp_keepalive_time = 30
net.ipv4.tcp_keepalive_probes = 3
net.ipv4.tcp_keepalive_intvl = 3
//如果某个TCP连接在空闲30秒后,内核才发起probe(探查);
//如果probe 3次(每次3秒既tcp_keepalive_intvl值)不成功,内核才彻底放弃,认为该连接已失效;

net.ipv4.tcp_retries1 = 3 //放弃回应一个TCP 连接请求前﹐需要进行多少次重试;
net.ipv4.tcp_retries2 = 15 //在丢弃激活(已建立通讯状况)的TCP连接之前﹐需要进行多少次重试;
net.ipv4.tcp_fin_timeout = 30 //表示如果套接字由本端要求关闭,这个参数决定了它保持在 FIN-WAIT-2状态的时间;
net.ipv4.tcp_tw_recycle = 1 //表示开启TCP连接中TIME-WAIT sockets的快速回收,默认为0,表示关闭;
net.ipv4.tcp_max_syn_backlog = 8192 //表示SYN队列的长度,默认为1024,加大队列长度为8192,可以容纳更多等待连接的网络连接数;
net.ipv4.tcp_syncookies = 1 //TCP建立连接的 3 次握手过程中,当服务端收到最初的 SYN 请求时,会检查应用程序的syn_backlog队列是否已满,启用syncookie,可以解决超高并发时的Can’t  Connect` 问题。但是会导致 TIME_WAIT 状态fallback为保持2MSL时间,高峰期时会导致客户端无可复用连接而无法连接服务器;
net.ipv4.tcp_orphan_retries = 0 //关闭TCP连接之前重试多少次;
net.ipv4.tcp_mem = 178368  237824     356736
net.ipv4.tcp_mem[0]:  //低于此值,TCP没有内存压力;
net.ipv4.tcp_mem[1]:  //在此值下,进入内存压力阶段; 
net.ipv4.tcp_mem[2]:  //高于此值,TCP拒绝分配socket;
net.ipv4.tcp_tw_reuse = 1 //表示开启重用,允许将TIME-WAIT sockets重新用于新的TCP连接;
net.ipv4.ip_local_port_range = 1024 65000 //表示用于向外连接的端口范围;
net.ipv4.ip_conntrack_max = 655360 //在内核内存中netfilter可以同时处理的“任务”(连接跟踪条目);
net.ipv4.icmp_ignore_bogus_error_responses = 1 //开启恶意icmp错误消息保护;
net.ipv4.tcp_syncookies = 1 //开启SYN洪水攻击保护。

3、Linuxカーネルの一般的な議論が詳細に

net.ipv4.tcp_sack = 1 //选择性应答(SACK)是 TCP 的一项可选特性,可以提高某些网络中所有可用带宽的使用效率;
net.ipv4.tcp_fack = 1 //打开FACK(Forward ACK) 拥塞避免和快速重传功能;
net.ipv4.tcp_syn_retries = 5 //对于一个新建连接,内核要发送多少个SYN 连接请求才决定放弃;
net.ipv4.tcp_synack_retries = 5 //tcp_synack_retries显示或设定Linux在回应SYN要求时尝试多少次重新发送初始SYN,ACK封包后才决定放弃;
net.ipv4.tcp_max_tw_buckets = 5000//系统同时保持TIME_WAIT套接字的最大数量,如果超过这个数字,TIME_WAIT套接字将立刻被清除并打印警告信息;默认为180000,设为较小数值此项参数可以控制TIME_WAIT套接字的最大数量,避免服务器被大量的TIME_WAIT套接字拖死;

net.ipv4.tcp_keepalive_time = 30
net.ipv4.tcp_keepalive_probes = 3
net.ipv4.tcp_keepalive_intvl = 3 
//如果某个TCP连接在空闲30秒后,内核才发起probe(探查);
//如果probe 3次(每次3秒既tcp_keepalive_intvl值)不成功,内核才彻底放弃,认为该连接已失效;

net.ipv4.tcp_fin_timeout = 30 //表示如果套接字由本端要求关闭,这个参数决定了它保持在 FIN-WAIT-2状态的时间;
net.ipv4.tcp_tw_recycle = 1 //表示开启TCP连接中TIME-WAIT sockets的快速回收,默认为0,表示关闭;
net.ipv4.tcp_syncookies = 1//TCP建立连接的 3 次握手过程中,当服务端收到最初的 SYN 请求时,会检查应用程序的syn_backlog队列是否已满,启用syncookie,可以解决超高并发时的Can’t  Connect` 问题。但是会导致 TIME_WAIT 状态fallback为保持2MSL时间,高峰期时会导致客户端无可复用连接而无法连接服务器;
net.ipv4.tcp_orphan_retries = 0 //关闭TCP连接之前重试多少次;
net.ipv4.tcp_tw_reuse = 1 //表示开启重用,允许将TIME-WAIT sockets重新用于新的TCP连接;
net.ipv4.ip_local_port_range = 1024 65000 //表示用于向外连接的端口范围;
net.ipv4.ip_conntrack_max = 655360 //在内核内存中netfilter可以同时处理的“任务”(连接跟踪条目);
net.ipv4.tcp_syncookies = 1 //开启SYN洪水攻击保护。

四、Linuxカーネルのエラー解析

1、時間待機バケットテーブルのオーバーフロー错误

Sep 23 04:45:55 localhost kernel: TCP: time wait bucket table overflow
Sep 23 04:45:55 localhost kernel: TCP: time wait bucket table overflow
Sep 23 04:45:55 localhost kernel: TCP: time wait bucket table overflow
Sep 23 04:45:55 localhost kernel: TCP: time wait bucket table overflow
Sep 23 04:45:55 localhost kernel: TCP: time wait bucket table overflow
Sep 23 04:45:55 localhost kernel: TCP: time wait bucket table overflow

3ウェイハンドシェイクと切り離さ4つの規定で定義されているTCPプロトコルによると、当事者が近いソケットにソケットがTIME_WAIT状態になりますイニシアチブを立ち上げ、TIME_WAIT状態は2つのMSL(最大セグメント寿命)が続きます。
net.ipv4.tcp_max_tw_buckets值设置过小导致システム時刻の設定のデフォルト値は、上記の警告メッセージ、net.ipv4.tcp_max_tw_bucketsの値を大きくする必要がスローされます待ちの数を超えた場合、警告メッセージが解消します。
当然也不能设置过大サーバが閉じた場合、プロセスは、短い接続の多数を扱うサーバに対して、接続クライアントはさらにはるかにソケットを設立状態比で深刻な影響を受けるサーバーで、TIME_WAIT状態のプレゼンスサーバソケット大量になります能力、あるいは利用可能なソケットストップサービスが不足し、TIME_WAIT TCPプロトコルがソケット残留機構の再割り当ては、パケット衝突を送信する前に遅延されず、TCP輸送を確保するために必要なロジックであることを確認することを意図しています。

2、開いているファイルが多すぎます错误

Benchmarking localhost (be patient)
socket: Too many open files (24)
socket: Too many open files (24)
socket: Too many open files (24)
socket: Too many open files (24)
socket: Too many open files (24)

カーネルの制限ファイル/etc/security/limits.confを次のコードは、有効にするには、サーバーを再起動してください!

* 	soft 	noproc			65535
* 	hard 	noproc			65535
* 	soft 	nofile			65535
* 	hard 	nofile			65535

3、DDOS攻撃防御:クッキーエラーを送信するポート80上で可能なSYNフラッド。

May 31 14:20:14 localhost kernel: possible SYN flooding on port 80. Sending cookies.
May 31 14:21:28 localhost kernel: possible SYN flooding on port 80. Sending cookies.
May 31 14:22:44 localhost kernel: possible SYN flooding on port 80. Sending cookies.
May 31 14:25:33 localhost kernel: possible SYN flooding on port 80. Sending cookies.
May 31 14:27:06 localhost kernel: possible SYN flooding on port 80. Sending cookies.
May 31 14:28:44 localhost kernel: possible SYN flooding on port 80. Sending cookies.
May 31 14:28:51 localhost kernel: possible SYN flooding on port 80. Sending cookies.
May 31 14:31:01 localhost kernel: possible SYN flooding on port 80. Sending cookies.

この問題は、SYNキューが原因でいっぱいです、アクセスの多数のために、一般的にSYNクッキーを、トリガ、または悪質なアクセスの原因となる、としても知られていますSYN Flooding洪水攻击。它是DDOS攻击中的一种。

防护DDOS攻击有两种手段,一是基于硬件专业防火墙、二是基于Linux内核简单防护トラフィックが特に重い攻撃である場合は、単純にカーネルパラメータは抵抗することはできません設定し、プログレードのハードウェアファイアウォールに依存しなければなりませんでした、

次のパラメータは、Linuxカーネル保護DDOSは、次のコードを追加し、最適化されています。

net.ipv4.tcp_fin_timeout = 30 
net.ipv4.tcp_keepalive_time = 1200 
net.ipv4.tcp_syncookies = 1 
net.ipv4.tcp_tw_reuse = 1 
net.ipv4.tcp_tw_recycle = 1 
net.ipv4.ip_local_port_range = 1024 65000 
net.ipv4.tcp_max_syn_backlog = 8192 
net.ipv4.tcp_max_tw_buckets = 8000 
net.ipv4.tcp_synack_retries = 2 
net.ipv4.tcp_syn_retries = 2
彼は188元の記事を発表 ウォンの賞賛150 ビュー30000 +

おすすめ

転載: blog.csdn.net/weixin_44571270/article/details/104879180