cat etc/sysctl.conf相关:
net.ipv4.tcp_tw_reuse = 0 //允许将TIME-WAIT sockets重新用于新的TCP连接,默认为0,表示关闭;
net.ipv6.conf.all.disable_ipv6 = 1 //关闭ipv6
net.ipv6.conf.default.disable_ipv6 = 1 //关闭ipv6
net.ipv6.conf.lo.disable_ipv6 = 1 //
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 //开启反向路径过滤
net.ipv4.conf.default.arp_announce = 2 //忽略IP数据包的源IP地址,选择该发送网卡上最合适的本地地址作为arp请求的源IP地址。
net.ipv4.conf.lo.arp_announce = 2
net.ipv4.conf.all.arp_announce = 2 //
net.ipv4.tcp_max_tw_buckets = 5000 //表示系统同时保持TIME_WAIT套接字的最大数量,如果超过这个数字,TIME_WAIT套接字将立刻被清除并打印警告信息。我们公司统一设置为5000
net.ipv4.tcp_syncookies = 1 //表示开启SYN Cookies。当出现SYN等待队列溢出时,启用cookies来处理,可防范少量SYN攻击,默认为0,表示关闭;
net.ipv4.tcp_max_syn_backlog = 65536 //Tcp syn队列的最大长度,在进行系统调用connect时会发生Tcp的三次握手,server内核会为Tcp维护两个队列,Syn队列和Accept队列,Syn队列是指存放完成第一次握手的连接,Accept队列是存放完成整个Tcp三次握手的连接,修改net.ipv4.tcp_max_syn_backlog使之增大可以接受更多的网络连接。
注意此参数过大可能遭遇到Syn flood攻击,即对方发送多个Syn报文端填充满Syn队列,使server无法继续接受其他连接
net.ipv4.tcp_synack_retries = 2 //对于一个新建连接,内核要发送多少个 SYN 连接请求才决定放弃。不应该大于255,默认值是5,对应于180秒左右时间。(对于大负载而物理通信良好的网络而言,这个值偏高,可修改为2.这个值仅仅是针对对外的连接,对进来的连接,是由tcp_retries1决定的)
kernel.sysrq = 1 //开启sysrq功能
net.ipv4.ip_forward = 1 //IP转发功能已经打开
fs.file-max = 655360 //Linux最大打开文件描述符数
vm.max_map_count = 500000 //限制一个进程可以拥有的VMA(虚拟内存区域)的数量。虚拟内存区域是一个连续的虚拟地址空间区域。在进程的生命周期中,每当程序尝试在内存中映射文件,链接到共享内存段,或者分配堆空间的时候,这些区域将被创建。调优这个值将限制进程可拥有VMA的数量。限制一个进程拥有VMA的总数可能导致应用程序出错,因为当进程达到了VMA上线但又只能释放少量的内存给其他的内核进程使用时,操作系统会抛出内存不足的错误。如果你的操作系统在NORMAL区域仅占用少量的内存,那么调低这个值可以帮助释放内存给内核用。
net.ipv4.tcp_fin_timeout = 3 //对于本端断开的socket连接,TCP保持在FIN-WAIT-2状态的时间。对方可能会断开连接或一直不结束连接或不可预料的进程死亡
net.ipv4.tcp_sack = 0 //启用有选择的应答(1表示启用),通过有选择地应答乱序接收到的报文来提高性能,让发送者只发送丢失的报文段,(对于广域网通信来说)这个选项应该启用,但是会增加对CPU的占用。
net.ipv4.tcp_max_orphans = 655360 //系统所能处理不属于任何进程的TCP sockets最大数量。假如超过这个数量,那么不属于任何进程的连接会被立即reset,并同时显示警告信息。之所以要设定这个限制﹐纯粹为了抵御那些简单的 DoS 攻击﹐千万不要依赖这个或是人为的降低这个限制,更应该增加这个值(如果增加了内存之后)
net.core.somaxconn = 8192 //定义了系统中每一个端口最大的监听队列的长度,默认1024,改成8192,可以容纳更多等待连接的网络连接数。
net.core.netdev_max_backlog = 64000 //进入包的最大设备队列.默认是300,对重负载服务器而言,该值太低,可调整到1000.
TCP keep-alive的三个参数:
$ sysctl -a | grep keepalive
net.ipv4.tcp_keepalive_intvl = 75
net.ipv4.tcp_keepalive_probes = 9
net.ipv4.tcp_keepalive_time = 7200
tcp_keepalive_time
一个连接需要TCP开始发送keepalive探测数据包之前的空闲时间,以秒为单位。
tcp_keepalive_probes
发送TCP keepalive探测数据包的最大数量,默认是9.如果发送9个keepalive探测包后对端仍然没有响应,就关掉这个连接。
tcp_keepalive_intvl
发送两个TCP keepalive探测数据包的间隔时间,默认是75秒。
可以看出在默认参数下,若tcp对端不通知就掉线,需要经过7200+9*75=7875秒=131.25分钟=2.1875小时才能确认对方掉线。