一、优化文件打开数

为了防止失控的进程破坏系统的性能,Unix和Linux会跟踪进程使用的大部分资源,会对用户及系统管理员进行资源限制,例如控制某个用户打开文件最大数、对某个用户打开进程数进行限制等,一般限制手段包括:软限制和硬限制,一般这两者的值都是设置相等的。

1
2
3
4
5
6
7
8
9
10
# 每个用户打开文件的数量,"*"表示所有用户。如果改成root就表示对root用户的限制。
cat /etc/security/limits.conf
......... 末尾添加
* soft noproc 65535
* hard noproc 65535
* soft nofile 65535
* hard nofile 65535
# 整个系统打开文件对数量
cat /proc/sys/fs/file-max
2621440

二、内核参数优化

Linux /proc/sys目录下存放着多数内核的参数,并且可以在系统运行时进行更改,一般重新启动机器就会失效,
/proc/sys下内核文件与配置文件/etc/sysctl.conf中变量存在着对应关系,即修改sysct.conf配置文件,其实是修改/proc/sys相关参数!

1 生产环境内核完整参数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
net.ipv4.conf.all.accept_redirects=0
net.ipv4.icmp_echo_ignore_broadcasts=1
kernel.core_pattern=/var/log/core/core_%e_%p_%t
kernel.core_uses_pid=1
kernel.pid_max=458752
kernel.msgmnb=65536
kernel.msgmax=65536
kernel.msgmni=4096
net.core.somaxconn=65535
net.core.netdev_max_backlog=30000
net.core.rmem_default=8388608
net.core.wmem_default=8388608
net.core.rmem_max=16777216
net.core.wmem_max=16777216
net.core.dev_weight=512
net.core.optmem_max=262144
net.core.netdev_budget=1024
net.ipv4.neigh.default.gc_thresh1=10240
net.ipv4.neigh.default.gc_thresh2=40960
net.ipv4.neigh.default.gc_thresh3=81920
net.ipv4.tcp_slow_start_after_idle=0
net.ipv4.tcp_no_metrics_save=1
net.ipv4.tcp_rfc1337=1
net.ipv4.ip_forward=1
net.ipv4.ip_local_port_range=1024 65535
net.ipv4.tcp_timestamps=0
net.ipv4.tcp_sack=1
net.ipv4.tcp_dsack=1
net.ipv4.tcp_window_scaling=1
net.ipv4.tcp_max_syn_backlog=262144
net.ipv4.tcp_max_orphans=262144
net.ipv4.tcp_tw_reuse=1
net.ipv4.tcp_moderate_rcvbuf=1
net.ipv4.tcp_keepalive_time=1800
net.ipv4.tcp_keepalive_intvl=30
net.ipv4.tcp_keepalive_probes=3
net.ipv4.tcp_max_tw_buckets=1440000
vm.swappiness=10
vm.overcommit_memory=1
vm.overcommit_ratio=50
vm.max_map_count=262144
fs.file-max=2621440
fs.aio-max-nr=1048576
fs.inotify.max_user_watches=102400
fs.inotify.max_user_instances=1024
net.bridge.bridge-nf-call-ip6tables=1
net.bridge.bridge-nf-call-iptables=1
net.ipv4.conf.all.route_localnet=1
net.ipv4.tcp_fin_timeout=30
net.ipv4.tcp_syncookies=1
net.ipv4.tcp_tw_recycle=1
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

2 Linux内核常见参数详解

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
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 防止DDOS优化

此问题是由于SYN 队列已满,而触发SYN cookies,一般是由于大量的访问,或者恶意访问导致,也称之为SYN Flooding洪水攻击。它是DDOS攻击中的一种。
防护DDOS攻击有两种手段,一是基于硬件专业防火墙、二是基于Linux内核简单防护,如果攻击流量特别大,单纯配置内核参数是无法抵挡的,还得依靠专业级硬件防火墙,
如下为Linux内核防护DDOS优化参数,加入如下代码即可:

1
2
3
4
5
6
7
8
9
10
net.ipv4.tcp_fin_timeout=30 
net.ipv4.tcp_keepalive_time=1800
net.ipv4.tcp_syncookies=1
net.ipv4.tcp_tw_reuse=1
net.ipv4.tcp_tw_recycle=1
net.ipv4.ip_local_port_range=1024 65535
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