一、内核参数说明
/proc/sys下内核文件与配置文件sysctl.conf中变量存在着对应关系。
配置说明:
内核参数 参数说明
net.inet.tcp.sendspace=65536 最大的待发送TCP数据缓冲区空间
net.inet.tcp.recvspace=65536 最大的接受TCP缓冲区空间
net.inet.udp.sendspace=65535 最大的接受UDP缓冲区大小
net.inet.udp.maxdgram=65535 最大的发送UDP数据缓冲区大小
net.local.stream.sendspace=65535 本地套接字连接的数据发送空间
net.inet.tcp.rfc1323=1
net.inet.tcp.rfc1644=1
net.inet.tcp.rfc3042=1
net.inet.tcp.rfc3390=1 加快网络性能的协议
kern.ipc.maxsockbuf=2097152 最大的套接字缓冲区
kern.maxfiles=65536 系统中允许的最多文件数量
kern.maxfilesperproc=32768 每个进程能够同时打开的最大文件数量
net.inet.tcp.delayed_ack=0 当一台计算机发起TCP连接请求时,系统会回应ACK应答数据包。该选项设置是否延迟ACK应答数据包,把它和包含数据的数据包一起发送,在高速网络和低负载的情况下会略微提高性能,但在网络连接较差的时候,对方计算机得不到应答会持续发起连接请求,反而会降低性能。
net.inet.icmp.drop_redirect=1
net.inet.icmp.log_redirect=1
net.inet.ip.redirect=0
net.inet6.ip6.redirect=0 屏蔽ICMP重定向功能
net.inet.icmp.bmcastecho=0
net.inet.icmp.maskrepl=0 防止ICMP广播风暴
net.inet.icmp.icmplim=100 限制系统发送ICMP速率
net.inet.icmp.icmplim_output=0
net.inet.tcp.drop_synfin=1 安全参数,编译内核时加了options TCP_DROP_SYNFIN才可以用。
net.inet.tcp.always_keepalive=1 设置为1会帮助系统清除没有正常断开的TCP连接,这增加了一些网络带宽的使用,但是一些死掉的连接最终能被识别并清除。死的TCP连接是被拨号用户存取的系统的一个特别的问题,因为用户经常断开modem而不正确的关闭活动的连接
net.inet.ip.intr_queue_maxlen=1000 若看到net.inet.ip.intr_queue_drops在增加,就要调大net.inet.ip.intr_queue_maxlen,net.inet.ip.intr_queue_drops为0时最好。
net.inet.tcp.msl=7500 防止DOS攻击,默认为30000
net.inet.tcp.blackhole=2 接收到一个已经关闭的端口发来的所有包,直接drop,如果设置为1则是只针对TCP包
net.inet.udp.blackhole=1 接收到一个已经关闭的端口发来的所有UDP包直接drop
net.inet.tcp.inflight.enable=1 为网络数据连接时提供缓冲
net.inet.ip.fastforwarding=0 如果打开的话每个目标地址一次转发成功以后它的数据都将被记录进路由表和arp数据表,节约路由的计算时间,但会需要大量的内核内存空间来保存路由表。
kern.polling.enable=1 kernel编译打开options POLLING功能,高负载情况下使用低负载不推荐SMP不能和polling一起用。
kern.ipc.somaxconn=32768 并发连接数,默认为128,推荐在1024-4096之间,数字越大占用内存也越大。
security.bsd.see_other_uids=0 禁止用户查看其他用户的进程
kern.securelevel=0 设置kernel安全级别
net.inet.tcp.log_in_vain=1 记录下任何TCP连接
net.inet.udp.log_in_vain=1 记录下任何UDP连接
net.inet.udp.checksum=1 防止不正确的udp包的攻击
net.inet.tcp.syncookies=1 防止DOS攻击
kern.ipc.shm_use_phys=1 仅为线程提供物理内存支持,需要256兆以上内存
kern.ipc.shmmax=67108864 线程可使用的最大共享内存
kern.ipc.shmall=32768 最大线程数量
kern.coredump=0 程序崩溃时不记录
net.local.stream.recvspace=65536
net.local.dgram.maxdgram=16384
net.local.dgram.recvspace=65536 lo本地数据流接收和发送空间
net.inet.tcp.mssdflt=1460 数据包数据段大小,ADSL为1452。
net.inet.tcp.inflight_enable=1 为网络数据连接时提供缓冲
net.inet.tcp.minmss=1460 数据包数据段最小值,ADSL为1452
net.inet.raw.maxdgram=65536 本地数据最大数量
net.inet.raw.recvspace=65536 本地数据流接收空间
net.inet.ip.fw.dyn_max=65535 ipfw防火墙动态规则数量,默认为4096,增大该值可以防止某些病毒发送大量TCP连接,导致不能建立正常连接
net.inet.ipf.fr_tcpidletimeout=864000 设置ipf防火墙TCP连接空闲保留时间,默认8640000(120小时)
net.ipv4.tcp_syncookies = 1 表示开启SYN Cookies。当出现SYN等待队列溢出时,启用cookies来处理,可防范少量SYN攻击,默认为0,表示关闭;
net.ipv4.tcp_tw_reuse = 1 表示开启重用。允许将TIME-WAIT sockets重新用于新的TCP连接,默认为0,表示关闭;
net.ipv4.tcp_tw_recycle = 1 表示开启TCP连接中TIME-WAIT sockets的快速回收,默认为0,表示关闭。
net.ipv4.tcp_fin_timeout = 30 表示如果套接字由本端要求关闭,这个参数决定了它保持在FIN-WAIT-2状态的时间。
net.ipv4.tcp_keepalive_time = 1200 表示当启用keepalive时,TCP发送keepalive消息的频度。缺省是2小时,改为20分钟。
net.ipv4.ip_local_port_range = 1024 65000 表示用于向外连接的端口范围。缺省情况下很小:32768到61000,改为1024到65000。
net.ipv4.tcp_max_syn_backlog = 8192 表示SYN队列的长度,默认为1024,加大队列长度为8192,可以容纳更多等待连接的网络连接数。
net.ipv4.tcp_max_tw_buckets = 5000 表示系统同时保持TIME_WAIT套接字的最大数量,如果超过这个数字,TIME_WAIT套接字将立刻被清除并打印警告信息。默认为180000,改为 5000。对于Apache、Nginx等服务器,上几行的参数可以很好地减少TIME_WAIT套接字数量,但是对于Squid,效果却不大。此项参数可以控制TIME_WAIT套接字的最大数量,避免Squid服务器被大量的TIME_WAIT套接字拖死。
net.ipv4.tcp_timestamps 开启tcp时间戳
二、常用内核参数参考值(需要根据系统配置进行调优)
#最大socket写buffer,可参考的优化值:873200
/proc/sys/net/core/wmem_max
#最大socket读buffer,可参考的优化值:873200
/proc/sys/net/core/rmem_max
#TCP写buffer,可参考的优化值: 8192 436600 873200
/proc/sys/net/ipv4/tcp_wmem
#TCP读buffer,可参考的优化值: 32768 436600 873200
/proc/sys/net/ipv4/tcp_rmem
/proc/sys/net/ipv4/tcp_mem
包含3个值,分别是:
net.ipv4.tcp_mem[0]:低于此值,TCP没有内存压力.
net.ipv4.tcp_mem[1]:在此值下,进入内存压力阶段.
net.ipv4.tcp_mem[2]:高于此值,TCP拒绝分配socket.
上述内存单位是页,而不是字节.可参考的优化值是:786432 1048576 1572864
#进入包的最大设备队列.默认是300,对重负载服务器而言,该值太低,可调整到1000.
/proc/sys/net/core/netdev_max_backlog
#listen()的默认参数,挂起请求的最大数量.默认是128.对繁忙的服务器,增加该值有助于网络性能.可调整到256.
/proc/sys/net/core/somaxconn
#socket buffer的最大初始化值,默认10K.
$ /proc/sys/net/core/optmem_max
#进入SYN包的最大请求队列.默认1024.对重负载服务器,增加该值显然有好处.可调整到2048.
$ /proc/sys/net/ipv4/tcp_max_syn_backlog
#TCP失败重传次数,默认值15,意味着重传15次才彻底放弃.可减少到5,以尽早释放内核资源.
/proc/sys/net/ipv4/tcp_retries2
#这3个参数与TCP KeepAlive有关。
/proc/sys/net/ipv4/tcp_keepalive_time
/proc/sys/net/ipv4/tcp_keepalive_intvl
/proc/sys/net/ipv4/tcp_keepalive_probes
默认值是:
tcp_keepalive_time = 7200 (单位:second)
tcp_keepalive_probes = 9
tcp_keepalive_intvl = 75 (单位:second)
意思是如果某个TCP连接在idle 2个小时后,内核才发起probe.如果probe 9次(每次75秒)不成功,内核才彻底放弃,认为该连接已失效.对服务器而言,显然上述值太大. 可以调整到:
/proc/sys/net/ipv4/tcp_keepalive_time 1800
/proc/sys/net/ipv4/tcp_keepalive_intvl 30
/proc/sys/net/ipv4/tcp_keepalive_probes 3
#指定端口范围的一个配置,默认是32768 61000,已够大.
/proc/sys/net/ipv4/ip_local_port_range
三、查看内核参数
3.1 查看所有内核参数
sysctl -a
1
3.2 查看特定内核参数
cat /proc/sys/net/ipv4/icmp_echo_ignore_all
1
或
sysctl net.ipv4.tcp_syncookies
1
四、修改内核参数
4.1 使用命令进行修改(当前有效,重启后无效)
echo “1” > /proc/sys/net/ipv4/icmp_echo_ignore_all
1
或
sysctl -w net.ipv4.icmp_echo_ignore_all=1
1
说明:sysctl的参数名与等于文件路径去掉/proc/sys/,并且"/ “改成”."
4.2 修改配置文件(永久生效)
vim /etc/sysctl.conf
添加:
net.ipv4.icmp_echo_ignore_all=1
让修改立即生效:
sysctl -p 或 sysctl --system
说明:这个命令会重新加载 /etc/sysctl.conf 的配置。
sysctl --system与sysctl -p的区别在于:
sysctl --system会重新加载以下所有配置文件的配置:
/run/sysctl.d/.conf
/etc/sysctl.d/.conf
/usr/local/lib/sysctl.d/.conf
/usr/lib/sysctl.d/.conf
/lib/sysctl.d/*.conf
/etc/sysctl.conf
五、参数迁移
1、保存当前主机所有配置
sysctl -a > mysys.conf
1
2、拷贝到其他主机并执行
sysctl -p -f mysys.conf
1
六、内核参数调优
6.1 高并发Web服务器内核参数调优
net.ipv4.tcp_syncookies = 1
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_tw_recycle = 1 (不推荐,NAT下会产生大量的timeout)
net.ipv4.tcp_fin_timeout = 30
net.ipv4.tcp_max_syn_backlog=65536
net.core.somaxconn=32768
net.core.netdev_max_backlog=65536
sysctl -w net.ipv4.ip_conntrack_max=65536
6.2 其他调优参数
#设置是否响应 icmp echo 请求广播
#net.ipv4.icmp_echo_ignore_broadcasts = 1
#设置之后,可以忽略由网络中的那些声称回应地址是广播地址的主机生成的ICMP错误。
#net.ipv4.icmp_ignore_bogus_error_responses = 1
#开启SYN Cookies,当出现SYN等待队列溢出时,启用cookies来处理
net.ipv4.tcp_syncookies = 1
#Default should work for all interfaces
net.ipv4.conf.all.log_martians = 1
net.ipv4.conf.default.log_martians = 1
#禁用所有IP源路由
net.ipv4.conf.all.accept_source_route = 0
net.ipv4.conf.default.accept_source_route = 0
#打开反向路径过滤功能,防止ip地址欺骗
net.ipv4.conf.all.rp_filter = 1
#启用源路由核查功能,减少DDoS攻击,防止IP Spoofing
net.ipv4.conf.default.rp_filter = 1
#禁止接收路由重定向报文,防止路由表被恶意更改
net.ipv4.conf.all.accept_redirects = 0
net.ipv4.conf.default.accept_redirects = 0
#只接受来自网关的“重定向”icmp报文
net.ipv4.conf.all.secure_redirects = 0
net.ipv4.conf.default.secure_redirects = 0
#禁止转发重定向报文
net.ipv4.conf.all.send_redirects = 0
net.ipv4.conf.default.send_redirects = 0
net.ipv4.tcp_window_scaling = 1
#表示SYN队列的长度,默认为1024,加大队列长度为8192,可以容纳更多等待连接的网络连接数。
net.ipv4.tcp_max_syn_backlog = 8192
#timewait的数量,默认是180000。(Deven:因此如果想把timewait降下了就要把tcp_max_tw_buckets值减小)
net.ipv4.tcp_max_tw_buckets = 4096
#表示当keepalive起用的时候,TCP发送keepalive消息的频度。缺省是2小时,改为20分钟。
net.ipv4.tcp_keepalive_time = 20
#禁用路由转发,只有在服务器上个开启了 ip_forward后,到达服务器的请求才会被iptables转发出去
net.ipv4.ip_forward = 0
#当TCP使用了该值的内存页面数时
net.ipv4.tcp_mem = 192000 300000 732000
TCP读buffer
net.ipv4.tcp_rmem = 51200 131072 204800
#min4096(4K)为TCP socket预留用于发送缓冲的内存最小值,default 16384(16K) max131072(128K)
net.ipv4.tcp_wmem = 51200 131072 204800
#探测消息未获得响应时,重发该消息的间隔时间(秒)(默认75)
net.ipv4.tcp_keepalive_intvl = 20
#在认定TCP连接失效之前,最多发送多少个keepalive探测消息。(默认9)
net.ipv4.tcp_keepalive_probes = 2
#对孤立的socket重试的最大次数
net.ipv4.tcp_orphan_retries = 3
#在内核放弃建立连接之前发送SYN包的数量
net.ipv4.tcp_syn_retries = 3
#为了打开对端的连接,内核需要发送一个SYN并附带一个回应前面一个SYN的ACK。也就是所谓三次握手中的第二次握手。这个设置决定了内核放弃连接之前发送SYN+ACK包的数量
net.ipv4.tcp_synack_retries = 3
#在丢弃激活(已建立通讯状况)的TCP连接之前﹐需要进行多少次重试。默认值为15
net.ipv4.tcp_retries2 = 5
#如果套接字由本端要求关闭,这个参数 决定了它保持在FIN-WAIT-2状态的时间。对端可以出错并永远不关闭连接,甚至意外当机。缺省值是60秒。2.2 内核的通常值是180秒,你可以按这个设置,但要记住的是,即使你的机器是一个轻载的WEB服务器,也有因为大量的死套接字而内存溢出的风险,FIN- WAIT-2的危险性比FIN-WAIT-1要小,因为它最多只能吃掉1.5K内存,但是它们的生存期长些
net.ipv4.tcp_fin_timeout = 30
#系统所能处理不属于任何进程的TCP sockets最大数量。假如超过这个数量,那么不属于任何进程的连接会被立即reset,并同时显示警告信息
net.ipv4.tcp_max_orphans = 200000
#开启重用。允许将TIME-WAIT sockets重新用于新的TCP连接
net.ipv4.tcp_tw_reuse = 1
#启用timewait快速回收
net.ipv4.tcp_tw_recycle = 1
#表示用于向外连接的端口范围。缺省情况下很小:32768到61000,改为10000到65000
net.ipv4.ip_local_port_range = 10000 65000
#每个网络接口接收数据包的速率比内核处理这些包的速率快时,允许送到队列的数据包的最大数目
net.core.netdev_max_backlog = 4096
#在所有标记的二进制程序中被启用。
kernel.exec-shield = 1
#参数值为2时,表示启用随机地址功能;0表示关闭;
kernel.randomize_va_space = 1
#增加系统文件描述符限制
#fs.file-max = 65535
#PID分配限制值。当内核下一个PID值到达这个值,它会回到最低的PID值。PID的最大的pid_max未分配,默认值为32768
kernel.pid_max = 65536
#该文件表示强制Linux VM最低保留多少空闲内存
vm.min_free_kbytes=409600
#该项表示内核回收用于directory和inode cache内存的倾向
vm.vfs_cache_pressure=200
#缺省60,减少这个参数会使系统尽快通过swapout不使用的进程资源来释放更多的物理内存
vm.swappiness = 40
#缺省是3000,也就是30秒,如果系统写操作压力很大,可以适当减小该值,但也不要太小;建议设置为
vm.dirty_expire_centisecs = 1500
#这个参数控制内核的脏数据刷新进程pdflush的运行间隔。单位是 1/100 秒。缺省数值是500,持续的写入降低,短期的写入并且数据不打并且内存多,应该增大数值
vm.dirty_writeback_centisecs = 1000
#单个进程的脏页数量达到系统总内存的多大比例后,就会触发pdflush/flush/kdmflush等后台回写进程运行。
vm.dirty_ratio = 20
#所有全局系统进程的脏页数量达到系统总内存的多大比例后,就会触发pdflush/flush/kdmflush等后台回写进程运行
vm.dirty_background_ratio = 10
6.3 tcp_tw_recycle内核参数说明
服务器端打开tcp_tw_recycle参数时,必须要非常小心,因为它依赖于客户机的时间戳。这可能会导致共享套接字的NAT系统出现问题,从而导致服务器端内核丢弃SYN包并忽略连接尝试,造成客户端connection refused,这将导致客户端发生随机连接故障。
当客户端访问一个net.ipv4.tcp_tw_recycle打开的服务器时,客户端连接可能会被有规律的丢弃,因为NAT后面的主机没有同步的TCP时钟。
如果客户端没有启用net.ipv4.tcp_timestamps内核参数,则服务端net.ipv4.tcp_tw_recycle内核参数无法正常工作。