kernel.shmmax、kernel.shmall、net.ipv4.tcp_mem根据实际服务器内存大小进行调整
echo "net.ipv4.ip_forward = 1
net.ipv4.conf.all.rp_filter = 1
net.ipv4.conf.default.rp_filter = 1
net.ipv4.conf.all.accept_source_route = 0
net.ipv4.conf.default.accept_source_route = 0
kernel.sysrq = 0
kernel.core_uses_pid = 1
kernel.msgmnb = 65536
kernel.msgmax = 65536
kernel.shmmax = 8589934591
kernel.shmall = 2097152
net.ipv6.conf.all.disable_ipv6 = 1
net.ipv6.conf.default.disable_ipv6 = 1
fs.file-max = 6553560
###内存资源使用相关设定
vm.vfs_cache_pressure = 100000
vm.swappiness = 10
net.core.wmem_default = 8388608
net.core.rmem_default = 8388608
net.core.rmem_max = 16777216
net.core.wmem_max = 16777216
net.ipv4.tcp_rmem = 4096 8192 4194304
net.ipv4.tcp_wmem = 4096 8192 4194304
net.ipv4.tcp_mem = 196608 262144 393216
##应对DDOS攻击,TCP连接建立设置
net.ipv4.tcp_syncookies = 1
net.ipv4.tcp_synack_retries = 1
net.ipv4.tcp_syn_retries = 1
net.ipv4.tcp_max_syn_backlog = 262144
##应对timewait过高,TCP连接断开设置
net.ipv4.tcp_max_tw_buckets = 6000
net.ipv4.tcp_tw_recycle = 1
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_timestamps = 0
net.ipv4.tcp_fin_timeout = 30
net.ipv4.ip_local_port_range = 1024 65000
###TCP keepalived 连接保鲜设置
net.ipv4.tcp_keepalive_time = 1200
net.ipv4.tcp_keepalive_intvl = 15
net.ipv4.tcp_keepalive_probes = 5
###其他TCP相关调节
net.core.somaxconn = 8192
net.core.netdev_max_backlog = 262144
net.ipv4.tcp_max_orphans = 3276800
net.ipv4.tcp_sack = 1
net.ipv4.tcp_window_scaling = 1" >> /etc/sysctl.conf
#使配置生效
sysctl -p
各参数说明(红色部分根据实际服务器内存大小进行调整)
net.ipv4.ip_forward = 1 | 开启IP转发功能 |
net.ipv4.conf.all.rp_filter = 1 net.ipv4.conf.default.rp_filter = 1 | "告诉"kernel加强入站过滤(ingress filtering)和出站过滤 |
net.ipv4.conf.all.accept_source_route = 0 net.ipv4.conf.default.accept_source_route = 0 | 是否接受含有源路由信息的ip包。参数值为布尔值,1表示接受,0表示不接受。 在充当网关的linux主机上缺省值为1,在一般的linux主机上缺省值为0。 从安全性角度出发,建议你关闭该功能。 |
kernel.sysrq = 0 | 使用sysrq组合键是了解系统目前运行情况,为安全起见设为0关闭 |
kernel.core_uses_pid = 1 | 控制core文件的文件名是否添加pid作为扩展,用于调试多线程应用程序 |
kernel.msgmnb = 65536 | 所有在消息队列中的消息总和的最大值(msgmnb=64k) |
kernel.msgmax = 65536 | 指定内核中消息队列中消息的最大值(msgmax=64k) |
kernel.shmmax = 8589934591 | 是核心参数中最重要的参数之一,用于定义单个共享内存段的最大值,64位linux系统:可取的最大值为物理内存值-1byte,建议值为多于物理内存的一半,一般取值大于SGA_MAX_SIZE即可,可以取物理内存-1byte。例如,如果为8GB物理内存,可取8*1024*1024*1024-1=8589934591 |
kernel.shmall = 2097152 | 该参数控制可以使用的共享内存的总页数。Linux共享内存页大小为4KB,共享内存段的大小都是共享内存页大小的整数倍。一个共享内存段的最大大小是 8G,那么需要共享内存页数是8GB/4KB=8388608KB /4KB=2097152(页),也就是64Bit系统下8GB物理内存,设置kernel.shmall = 2097152才符合要求 |
net.ipv6.conf.all.disable_ipv6 = 1 net.ipv6.conf.default.disable_ipv6 = 1 | 关闭IPv6 |
fs.file-max = 6553560 | 系统级别的能够打开的文件句柄的数量 |
vm.vfs_cache_pressure = 100000 | 该文件表示内核回收用于directory和inode cache内存的倾向;缺省值100表示内核将根据pagecache和swapcache,把directory和inode cache保持在一个合理的百分比;降低该值低于100,将导致内核倾向于保留directory和inode cache;增加该值超过100,将导致内核倾向于回收directory和inode cache |
vm.swappiness = 10 | swappiness的值的大小对如何使用swap分区是有着很大的联系的。swappiness=0的时候表示最大限度使用物理内存,然后才是 swap空间,swappiness=100的时候表示积极的使用swap分区,并且把内存上的数据及时的搬运到swap空间里面。linux的基本默认设置为60 |
net.core.wmem_default = 8388608 | 为TCP socket预留用于发送缓冲的内存默认值(单位:字节) |
net.core.rmem_default = 8388608 | 为TCP socket预留用于接收缓冲的内存默认值(单位:字节) |
net.core.rmem_max = 16777216 | 为TCP socket预留用于接收缓冲的内存最大值(单位:字节) |
net.core.wmem_max = 16777216 | 为TCP socket预留用于发送缓冲的内存最大值(单位:字节) |
net.ipv4.tcp_rmem = 4096 8192 4194304 net.ipv4.tcp_wmem = 4096 8192 4194304 | 为每个TCP连接分配的读、写缓冲区内存大小,单位是字节。 第一个数字表示,为TCP连接分配的最小内存 第二个数字表示,为TCP连接分配的缺省内存 第三个数字表示,为TCP连接分配的最大内存 一般按照缺省值分配,这个例子就是读写均为8KB,共16KB 1.6GB TCP内存能容纳的连接数,约为 1600MB/16KB = 100K = 10万 4.0GB TCP内存能容纳的连接数,约为 4000MB/16KB = 250K = 25万 |
net.ipv4.tcp_mem = 196608 262144 393216 | 第一个数字表示,当 tcp 使用的 page 少于 196608 时,kernel 不对其进行任何的干预 第二个数字表示,当 tcp 使用了超过 262144 的 pages 时,kernel 会进入 “memory pressure” 压力模式 第三个数字表示,当 tcp 使用的 pages 超过 393216 时(相当于1.6GB内存),就会报:Out of socket memory 以上数值适用于4GB内存机器,对于8GB内存机器,建议用以下参数: net.ipv4.tcp_mem = 524288 699050 1048576 (TCP连接最多约使用4GB内存) |
net.ipv4.tcp_syncookies = 1 | 只有在内核编译时选择了CONFIG_SYNCOOKIES时才会发生作用。当出现syn等候队列出现溢出时象对方发送syncookies。目的是为了防止syn flood攻击。 |
net.ipv4.tcp_synack_retries = 1 | 为了打开对端的连接,内核需要发送一个SYN 并附带一个回应前面一个SYN 的ACK。也就是所谓三次握手中的第二次握手。这个设置决定了内核放弃连接之前发送SYN+ACK 包的数量。减少系统SYN连接重试次数,为了打开对端的连接,内核需要发送一个SYN并附带一个回应前面一个SYN的ACK。 |
net.ipv4.tcp_syn_retries = 1 | 在内核放弃建立连接之前发送SYN包的数量 |
net.ipv4.tcp_max_syn_backlog = 262144 | 表示那些尚未收到客户端确认信息的连接(SYN消息)队列的长度,默认为1024,加大队列长度为262144,可以容纳更多等待连接的网络连接数,系统可以处理更多的并发连接 |
net.ipv4.tcp_max_tw_buckets = 6000 | timewait 的数量,默认是180000。表示系统同时保持TIME_WAIT的最大数量,如果超过这个数字,TIME_WAIT将立刻被清除并打印警告信息 |
net.ipv4.tcp_tw_recycle = 1 | 表示开启TCP连接中TIME-WAIT sockets的快速收回功能,默认为 0 ,表示关闭 |
net.ipv4.tcp_tw_reuse = 1 | 开启TCP连接复用功能,允许将time_wait sockets重新用于新的TCP连接(主要针对time_wait连接),默认为 0 表示关闭。 |
net.ipv4.tcp_timestamps = 0 | 时间戳可以避免序列号的卷绕。一个1Gbps的链路肯定会遇到以前用过的序列号。时间戳能够让内核接受这种“异常”的数据包。这里需要将其关掉。 |
net.ipv4.tcp_fin_timeout = 30 | 减少处于FIN-WAIT-2连接状态的时间,使系统可以处理更多的连接。缺省值是60秒。 |
net.ipv4.ip_local_port_range = 1024 65000 | 表示允许系统打开向外连接的端口范围 |
net.ipv4.tcp_keepalive_time = 1200 | 这个参数表示当keepalive启用时,TCP发送keepalive消息的频度(单位:秒)。默认是2小时,若将其设置得小一些,可以更快地清理无效的连接 |
net.ipv4.tcp_keepalive_intvl = 15 | 当探测没有确认时,重新发送探测的频度。缺省是75秒。 |
net.ipv4.tcp_keepalive_probes = 5 | 在认定连接失效之前,发送多少个TCP的keepalive探测包。缺省值是9。这个值乘以tcp_keepalive_intvl之后决定了一个连接发送了keepalive之后可以有多少时间没有回应 |
net.core.somaxconn = 8192 | listen(函数)的默认参数,挂起请求的最大数量限制。web 应用中listen 函数的backlog 默认会给我们内核参数的net.core.somaxconn 限制到128,而nginx 定义的NGX_LISTEN_BACKLOG 默认为511,所以有必要调整这个值 |
net.core.netdev_max_backlog = 262144 | 当网卡接收数据包的速度大于内核处理的速度时,会有一个队列保存这些数据包。这个参数表示该队列的最大值 |
net.ipv4.tcp_max_orphans = 3276800 | 表示系统中最多有多少TCP连接不被关联到任何一个用户文件句柄上。如果超过这里设置的数字,连接就会复位并输出警告信息。这个限制仅仅是为了防止简单的DoS攻击。此值不能太小 |
net.ipv4.tcp_sack = 1 | 启用有选择的应答(Selective Acknowledgment), 这可以通过有选择地应答乱序接收到的报文来提高性能(这样可以让发送者只发送丢失的报文段); (对于广域网通信来说)这个选项应该启用,但是这会增加对 CPU 的占用 |
net.ipv4.tcp_window_scaling = 1 | 支持更大的TCP窗口. 如果TCP窗口最大超过65535(64K), 必须设置该数值为1 |