内核优化

cat /etc/sysctl.conf

默认推荐设置是 htcp

net.ipv4.tcp_congestion_control = bic

忽略icmp ping广播包,应开启,避免放大攻击 1开启0关闭

net.ipv4.icmp_echo_ignore_broadcasts = 1

开启恶意icmp错误消息保护 1开启0关闭

net.ipv4.icmp_ignore_bogus_error_responses = 1

开启SYN洪水攻击保护,表示开启SYN Cookies。当出现SYN等待队列溢出时,启用cookies来处理,可防范少量SYN攻击,默认为0,表示关闭 1为开启

net.ipv4.tcp_syncookies = 1

开启并记录欺骗,源路由和重定向包

net.ipv4.conf.all.log_martians = 1
net.ipv4.conf.default.log_martians = 1

处理无源路由的包

net.ipv4.conf.all.accept_source_route = 0
net.ipv4.conf.default.accept_source_route = 0

0:关闭反向路由校验

1:开启严格的反向路由校验。对每个进来的数据包,校验其反向路由是否是最佳路由。如果反向路由不是最佳路由,则 直接丢弃该数据包。

2:开启松散的反向路由校验。对每个进来的数据包,校验其源地址是否可达,即反向路由是否能通(通过任意网口), 如果反向路径不通,则直接丢弃该数据包。

net.ipv4.conf.all.rp_filter = 1
net.ipv4.conf.default.rp_filter = 1

恶意用户可以使用IP重定向来修改远程主机中的路由表,在设计良好的网络中,末端的重定向设置是不需要的,发送和接受重定向信息包都要关闭。

net.ipv4.conf.all.accept_redirects = 0
net.ipv4.conf.default.accept_redirects = 0
net.ipv4.conf.all.secure_redirects = 0
net.ipv4.conf.default.secure_redirects = 0

禁止数据包转发,不做路由器功能。所谓转发即当主机拥有多网卡时,其中一块收到数据包,根据数据包的目的ip地址将包发往本机另一网卡,该网卡根据路由表继续发送数据包。这通常就是路由器所要实现的功能。IP转发功能,做NAT服务或者路由时才会用到。

net.ipv4.conf.all.send_redirects = 0
net.ipv4.conf.default.send_redirects = 0
net.ipv4.ip_forward = 0

开启execshield,execshield主要用于随机化堆栈地址,避免被exploit程序修改恶意地址,而导致执行攻击程序。

kernel.exec-shield = 1
kernel.randomize_va_space = 1

增加系统文件描述符限制,系统所有进程一共可以打开的文件数量

fs.file-max = 65535

系统默认的pid_max值为32768,正常情况下是够用的,当我们跑重量任务时,会不够用,最终导致内存无法分配的错误

kernel.pid_max = 65536

接收套接字缓冲区大小的默认值(以字节为单位)。

net.core.rmem_default = 262144

接收套接字缓冲区大小的最大值(以字节为单位)。

net.core.rmem_max = 16777216

定义默认的发送窗口大小;对于更大的 BDP 来说,这个大小也应该更大。

net.core.wmem_default = 262144

定义发送窗口的最大大小;对于更大的 BDP 来说,这个大小也应该更大。

net.core.wmem_max = 16777216

用来限制监听(LISTEN)队列最大数据包的数量,超过这个数量就会导致链接超时或者触发重传机制。

net.core.somaxconn = 262144

当网卡接收数据包的速度大于内核处理的速度时,会有一个队列保存这些数据包。这个参数表示该队列的最大值。

net.core.netdev_max_backlog = 4096

该参数指定了每个套接字所允许的最大缓冲区的大小

net.core.optmem_max = 10000000

启用 RFC 1323 定义的 window scaling;要支持超过 64KB 的窗口,必须启用该值。

net.ipv4.tcp_window_scaling = 1

表示SYN队列长度,默认1024,改成8192,可以容纳更多等待连接的网络连接数。

net.ipv4.tcp_max_syn_backlog = 4096

表示系统同时保持TIME_WAIT套接字的最大数量

net.ipv4.tcp_max_tw_buckets = 4096

表示当keepalive起用的时候,TCP发送keepalive消息的频度。缺省是2小时,改为30分钟。

net.ipv4.tcp_keepalive_time = 20

keepalive探测包的发送间隔

net.ipv4.tcp_keepalive_intvl = 5

IP转发功能,做NAT服务或者路由时才会用到。

net.ipv4.ip_forward = 0

为自动调优定义每个 socket 使用的内存。

第一个值是为 socket 的发送缓冲区分配的最少字节数。

第二个值是默认值(该值会被 wmem_default 覆盖),缓冲区在系统负载不重的情况下可以增长到这个值。

第三个值是发送缓冲区空间的最大字节数(该值会被 wmem_max 覆盖)。

net.ipv4.tcp_mem = 192000 300000 732000

与 tcp_wmem 类似,不过它表示的是为自动调优所使用的接收缓冲区的值。

net.ipv4.tcp_rmem = 51200 131072 204800

为自动调优定义每个 socket 使用的内存。

第一个值是为 socket 的发送缓冲区分配的最少字节数。

第二个值是默认值(该值会被 wmem_default 覆盖),缓冲区在系统负载不重的情况下可以增长到这个值。

第三个值是发送缓冲区空间的最大字节数(该值会被 wmem_max 覆盖)。

net.ipv4.tcp_wmem = 51200 131072 204800

keepalive探测包的发送间隔

net.ipv4.tcp_keepalive_intvl = 5

如果对方不予应答,探测包的发送次数

net.ipv4.tcp_keepalive_probes = 2

设置较小的数值,可以有效降低orphans的数量

net.ipv4.tcp_orphan_retries = 3

在内核放弃建立连接之前发送SYN包的数量。

net.ipv4.tcp_syn_retries = 3

对于远端的连接请求SYN,内核会发送SYN + ACK数据报,以确认收到上一个 SYN连接请求包。这是所谓的三次握手( threeway handshake)机制的第二个步骤。这里决定内核在放弃连接之前所送出的 SYN+ACK 数目。不应该大于255,默认值是5,对应于180秒左右时间。(可以根据上面的 tcp_syn_retries 来决定这个值)

net.ipv4.tcp_synack_retries = 3

在丢弃激活(已建立通讯状况)的TCP连接之前﹐需要进行多少次重试。默认值为15,根据RTO的值来决定,相当于13-30分钟(RFC1122规定,必须大于100秒).(这个值根据目前的网络设置,可以适当地改小,我的网络内修改为了5)

net.ipv4.tcp_retries2 = 5

表示如果套接字由本端要求关闭,这个参数决定了它保持在FIN-WAIT-2状态的时间。

net.ipv4.tcp_fin_timeout = 30

系统所能处理不属于任何进程的TCP sockets最大数量。假如超过这个数量﹐那么不属于任何进程的连接会被立即reset,并同时显示警告信息。之所以要设定这个限制﹐纯粹为了抵御那些简单的 DoS 攻击﹐千万不要依赖这个或是人为的降低这个限制(这个值Redhat AS版本中设置为32768,但是很多防火墙修改的时候,建议该值修改为2000)

net.ipv4.tcp_max_orphans = 2000

表示系统同时保持TIME_WAIT套接字的最大数量

net.ipv4.tcp_max_tw_buckets = 10000

表示SYN队列长度,默认1024,改成8192,可以容纳更多等待连接的网络连接数。

net.ipv4.tcp_max_syn_backlog = 8192

表示开启重用。允许将TIME-WAIT sockets重新用于新的TCP连接,默认为0,表示关闭;

net.ipv4.tcp_tw_reuse = 1

表示开启TCP连接中TIME-WAIT sockets的快速回收,默认为0,表示关闭。

net.ipv4.tcp_tw_recycle = 1

开启TCP时间戳,以一种比重发超时更精确的方法(请参阅 RFC 1323)来启用对 RTT 的计算;为了实现更好的性能应该启用这个选项。

net.ipv4.tcp_timestamps = 1

关闭tcp_sack

启用有选择的应答(Selective Acknowledgment),

这可以通过有选择地应答乱序接收到的报文来提高性能(这样可以让发送者只发送丢失的报文段);

(对于广域网通信来说)这个选项应该启用,但是这会增加对 CPU 的占用。

net.ipv4.tcp_sack = 1

表示用于向外连接的端口范围。缺省情况下很小:32768到61000,改为1024到65000。

net.ipv4.ip_local_port_range = 1024 65000

设置系统对最大跟踪的TCP连接数的限制

net.ipv4.netfilter.ip_conntrack_max=204800

关闭tcp的连接传输的慢启动,即先休止一段时间,再初始化拥塞窗口。

net.ipv4.tcp_slow_start_after_idle = 0

路由缓存刷新频率,当一个路由失败后多长时间跳到另一个路由,默认是300。

net.ipv4.route.gc_timeout = 100

允许 TCP/IP 协议栈适应在高吞吐量情况下低延时的情况;这个选项应该禁用。

net.ipv4.tcp_low_latency = 0

一个tcp连接关闭后,把这个连接曾经有的参数比如慢启动门限snd_sthresh,拥塞窗口snd_cwnd 还有srtt等信息保存到dst_entry中, 只要dst_entry 没有失效,下次新建立相同连接的时候就可以使用保存的参数来初始化这个连接.tcp_no_metrics_save 设置为1就是不保持这些参数(经验值),每次建立连接后都重新摸索一次. 我觉得没什么好处. 所以系统默认把它设为0。

net.ipv4.tcp_no_metrics_save = 0

打开了TCP内存自动调整功能(1为打开、0为禁止)

net.ipv4.tcp_moderate_rcvbuf = 1

单个TSO段可消耗拥塞窗口的比例,默认值为3。

net.ipv4.tcp_tso_win_divisor = 3

分组层路径MTU发现(MTU探测)中使用的search_low的初始值。如果允许MTU探测,这个初始值就是连接使用的初始MSS值。

net.ipv4.tcp_base_mss= 512

慢启动阶段,就是当前拥塞窗口值比慢启动阈值(snd_ssthresh)小的时候,所处的阶段就叫做慢启动阶段。当我们收到一个新的ACK时,则会调用tcp_slow_start()这个函数,并且为拥塞窗口增加1.(Linux中拥塞窗口的值表数据包的个数,而不是实际的发送字节数目。实际可以发送的字节数等于可以发送的数据包个数*MSS。)直到慢启动阶段出现数据包的丢失。而引入了tcp_max_ssthresh 这个参数后,则可以控制在慢启动阶段拥塞窗口增加的频度。默认这个参数不打开,如果这个参数的值设置为1000,则当拥塞窗口值大于1000时,则没收到一个ACK,并不再增加拥塞窗口一个单位了,而是约收到2个ACK才增加一个窗口单位。收到2ACK并不是决定值!!需要根据当前的拥塞窗口值,tcp_max_ssthresh值进行判断。

net.ipv4.tcp_max_ssthresh= 0

这个函数RTO超时的处理函数。如果是thin流,则不要新设RTO是原先的2倍。

net.ipv4.tcp_thin_linear_timeouts= 0

与tcp_thin_linear_timeouts同为快速重传算法参数

net.ipv4.tcp_thin_dupack= 0

在内核内存中netfilter可以同时处理的“任务”(连接跟踪条目)another

net.ipv4.ip_conntrack_max = 655360

运行sysctl -p 启用内核配置

参考文档

https://www.cnblogs.com/klcf0220/p/6003222.html

你可能感兴趣的:(内核优化)