linux 内核篇
This is the content of my super blog post.
linux 内核篇
linux内核一些参数详解
net.ipv4.ip_forward = 0 #禁用路由转发
net.ipv4.conf.default.rp_filter = 1 #开启IP源地址验证,防止IP地址欺骗
net.ipv4.conf.default.accept_source_route = 0 #禁用icmp源路由选项
kernel.sysrq = 0 #禁用组合键能即时打印出内核的信息
kernel.core_uses_pid = 1 #控制core文件的文件名中是否添加pid作为扩展
net.ipv4.tcp_syncookies = 1 #表示开启SYN Cookies,当出现SYN等待队列溢出时,启用cookies来处理,可防范少量SYN攻击,默认为0表示关闭
kernel.shmmni = 4096 #共享内存段的最大个数
kernel.sem = 250 32000 100 128 #SEMMSL:每个信号量set中信号量最大个数,SEMMNI:linux系统信号量set最大个数,SEMMNS:linux系统中信号量最大个数,SEMOPM:semop系统调用允许的信号量最大个数
kernel.msgmnb = 65536 #每个消息队列的最大字节限制
kernel.msgmax = 65536 #每个消息的最大size
kernel.shmmax = 68719476736 #单个共享内存段的最大字节数,这个设置得比SGA_MAX_SIZE大比较好
kernel.shmall = 4294967296 #系统中共享内存页数总数
net.ipv4.tcp_abort_on_overflow = 1 #表示加快接收客户端的连接速度
net.ipv4.tcp_max_tw_buckets = 6000 #表示系统同时保持TIME_WAIT套接字的最大数量,如果超过这个数字,TIME_WAIT套接字将立刻被清除并打印警告信息
net.ipv4.tcp_sack = 1 #有选择的应答
net.ipv4.tcp_window_scaling = 1 #支持更大的tcp窗口
net.ipv4.tcp_rmem = 4096 87380 4194304 #TCP 读 buffer
net.ipv4.tcp_wmem = 4096 66384 4194304 #TCP 写 buffer
net.ipv4.tcp_mem = 94500000 915000000 927000000 #确定TCP栈应该如何反映内存使用:每个值的单位都是内存页,通常是4KB
net.core.optmem_max = 81920 #表示每个套接字所允许的最大缓冲区的大小
net.core.wmem_default = 8388608 #表示发送套接字缓冲区大小的缺省值
net.core.wmem_max = 16777216 #最大socket 写 buffer
net.core.rmem_default = 8388608 #表示接收套接字缓冲区大小的缺省值
net.core.rmem_max = 16777216 #最大socket 读 buffer
net.ipv4.tcp_max_syn_backlog = 262144 #进入SYN包的最大请求队列,默认1024
net.core.netdev_max_backlog = 262144 #进入包的最大设备队列,默认是300
net.core.somaxconn = 262144 #listen队列的限制,所有AF_INET类型socket的listen队列
net.ipv4.tcp_max_orphans = 3276800 #设定系统中最多有多少个TCP套接字不被关联到任何一个用户文件句柄上
net.ipv4.tcp_timestamps = 0 #禁止TCP的时间戳
net.ipv4.tcp_synack_retries = 1 #决定了内核放弃连接之前发送SYN+ACK包的数量
net.ipv4.tcp_syn_retries = 1 #决定了内核放弃建立连接之前发送SYN包的数量
net.ipv4.tcp_tw_recycle = 1 #表示开启TCP连接中TIME-WAIT sockets的快速回收,默认为0表示关闭
net.ipv4.tcp_tw_reuse = 1 #表示开启重用。允许将TIME-WAIT sockets重新用于新的TCP连接,默认为0表示关闭
net.ipv4.tcp_fin_timeout = 1 #表示如果套接字由本端要求关闭,这个参数决定了它保持在FIN-WIAT-2状态的时间
net.ipv4.tcp_keepalive_time = 1200 #表示当keepalive启用的时候,TCP发送keepalive消息的频度。缺省是2小时,改为20分钟
net.ipv4.ip_local_port_range = 10000 65000 #设置程序产生的端口范围为10000-65000
net.netfilter.nf_conntrack_max = 1048576 #设置TCP连接追踪ip_contrack表的最大条数
net.nf_conntrack_max = 1048576 #设置TCP连接追踪ip_contrack表的最大条数
需要注意的地方
一般会在TIME-WAIT过多的情况下,把net.ipv4.tcp_tw_recycle 设置为1, 但是这个会有一个特别恶心的问题,其余环境还没发现,在游戏环境下,这个参数开启会出现多人局域网连接游戏经常有人掉线的问题。
问题描述
在同一个局域网内,几个人共同玩一个游戏,出现经常掉线的情况,切换手机网络则没有问题,换成别的无线也没问题,当时痛苦了好久,几经排查最后确定是内核参数net.ipv4.tcp_tw_recycle的问题,将其设置为0,问题解决
问题原因
-
经过NAT设备后面的用户上网,发出的TPC/IP时间戳不连续,造成服务端丢弃连接。
-
启用TIME-WAIT状态sockets的快速回收,这个选项不推荐启用。在NAT(Network Address Translation)网络下,会导致大量的TCP连接建立错误。