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,问题解决

问题原因

  1. 经过NAT设备后面的用户上网,发出的TPC/IP时间戳不连续,造成服务端丢弃连接。

  2. 启用TIME-WAIT状态sockets的快速回收,这个选项不推荐启用。在NAT(Network Address Translation)网络下,会导致大量的TCP连接建立错误。

links

social