期翼嘻嘻即时通讯综合平台
标题:
linux 系统内核参数调优
[打印本页]
作者:
admin
时间:
2022-7-1 21:26:17
标题:
linux 系统内核参数调优
#!/bin/sh
# 用户单进程的最大文件数,用户登录时生效
echo '* soft nofile 1048576' >> /etc/security/limits.conf
echo '* hard nofile 1048576' >> /etc/security/limits.conf
# 用户单进程的最大文件数 当前会话生效
ulimit -n 1048576
# 每个进程能创建的最大线程数, 是由 total virtual memory 和stack size 共同决定的, number of threads = total virtual memory / stack size
echo 102400 > /proc/sys/kernel/threads-max
# 控制内核从物理内存移出进程,移到交换空间。该参数从0到100,当该参数=0,表示只要有可能就尽力避免交换进程移出物理内存;该参数=100,这告诉内核疯狂的将数据移出物理内存移到swap缓存中。
echo 0 > /proc/sys/vm/swappiness
# 用来确定系统开始回收内存的阀值,控制系统的空闲内存。值越高,内核越早开始回收内存,空闲内存越高。
echo 65536 > /proc/sys/vm/min_free_kbytes
# 整个系统文件句柄设置
echo 1048576 > /proc/sys/fs/file-max
# 网卡接收队列。这个跟somaxconn和tcp_max_syn_backlog参数类似,但是更底层,指的是网卡的接收队列。也就是当每个网络接口接收数据包的速率比内核处理这些包的速率快时,允许送到队列的数据包的最大数目。
echo 262144 > /proc/sys/net/core/netdev_max_backlog
# listen侦听队列的长度(包括syn_revd和established状态,共两个队列的长度),默认128。服务器业务负荷过大,来不及处理握手或就绪状态的连接时,多余的握手请求会被扔掉,可能导致客户端产生connection timeout的异常,这个时候应该把这个值调大。
echo 262144 > /proc/sys/net/core/somaxconn
# 表示接收套接字缓冲区大小的最大值(以字节为单位)。
echo 16777216 > /proc/sys/net/core/rmem_max
# 表示发送套接字缓冲区大小的最大值(以字节为单位)。
echo 16777216 > /proc/sys/net/core/wmem_max
# 默认的接收窗口大小(以字节为单位)
echo 129024 > /proc/sys/net/core/rmem_default
# 默认的发送窗口大小(以字节为单位)
echo 129024 > /proc/sys/net/core/wmem_default
# 用来配置读缓冲的大小,第1个值为最小值,第2个值为默认值,第3个值为最大值。
echo "4096 87380 16777216" > /proc/sys/net/ipv4/tcp_rmem
# 用来配置写缓冲的大小,第1个值为最小值,第2个值为默认值,第3个值为最大值。
echo "4096 87380 16777216" > /proc/sys/net/ipv4/tcp_wmem
# 系统所能处理不属于任何进程的 socket数量,当我们需要快速建立大量连接时,就需要关注下这个值了. 这个限制仅仅是为了防止简单的DoS 攻击,不能过分依靠它或者人为地减小这个值,更应该增加这个值(如果增加了内存之后)
echo 262144 > /proc/sys/net/ipv4/tcp_max_orphans
# 表示SYN队列的长度,默认为1024,加大队列长度为8192,可以容纳更多等待连接的网络连接数。
echo 262144 > /proc/sys/net/ipv4/tcp_max_syn_backlog
# 在内核放弃建立连接之前发送SYN 包的数量。
echo 1 > /proc/sys/net/ipv4/tcp_syn_retries
# 为了打开对端的连接,内核需要发送一个SYN 并附带一个回应前面一个SYN 的ACK。也就是所谓三次握手中的第二次握手。这个设置决定了内核放弃连接之前发送SYN+ACK 包的数量。
echo 1 > /proc/sys/net/ipv4/tcp_synack_retries
# 表示系统同时保持TIME_WAIT套接字的最大数量,如果超过这个数字,TIME_WAIT套接字将立刻被清除并打印警告信息。默认为180000,建议减小,避免TIME_WAIT状态过多消耗整个服务器的资源,
# 但也不能太小,跟你后端的处理速度有关,如果速度快可以小,速度慢则适当加大,否则高负载会有请求无法响应或非常慢。
echo 6000 > /proc/sys/net/ipv4/tcp_max_tw_buckets
# 设置端口范围
echo "1024 65535" > /proc/sys/net/ipv4/ip_local_port_range
# 1. 启用timewait 快速回收,1为开启。网上对这个字段争议很大,但我建议最好设置为0不要开启,请参考不要在linux上启用net.ipv4.tcp_tw_recycle参数和优化内核时的坑,切记不要启用net.ipv4.tcp_tw_recycle。
# 2. 误人子弟,有一个严重问题,timestamps和tw_recycle不能同时开启,否则nat以后的客户端往往由于时间戳问题无法连接。一般建议关闭 tw_recycle
# 3. 此参数已经从最新内核中被移除
# echo 0 > /proc/sys/net/ipv4/tcp_tw_recycle
# 开启SYN Cookies,当出现SYN 等待队列溢出时,启用cookies 来处理。可防范少量SYN攻击,默认为0,表示关闭。
echo 1 > /proc/sys/net/ipv4/tcp_syncookies
# 当服务器需要在大量TCP连接之间切换时,会产生大量处于TIME_WAIT状态的连接。TIME_WAIT意味着连接本身是关闭的,但资源还没有释放。将net_ipv4_tcp_tw_reuse设置为1是让内核在安全时尽量回收连接,这比重新建立新连接要便宜得多
echo 1 > /proc/sys/net/ipv4/tcp_tw_reuse
# 当keepalive 起用的时候,TCP 发送keepalive 消息的频度。缺省是2 小时。
echo 30 > /proc/sys/net/ipv4/tcp_keepalive_time
# 这是处于TIME_WAIT状态的连接在回收前必须等待的最小时间。改小它可以加快回收。
echo 15 > /proc/sys/net/ipv4/tcp_fin_timeout
# 客户端 fd 大概到64999左右会出现 connect timeout 错误
# 由于网络协议栈中的netfilter组件配置限制的原因
# 网卡把data通过sk_buff组件搬到网络协议栈,会经过一个组件netfilter组件,os在使用会出现大量无效的数据防止被攻击,在进入网络协议栈之前会加一个层过滤器(netfitler)规则,对网络数据包过滤
# netfilter:维护往外发送的最大连接数,也维护进来最大连接数
echo 1048576 > /proc/sys/net/nf_conntrack_max
# 这个值对应的场景是 “双方建立了连接后一直不发包,直到 5 天后才发
echo 1200 > /proc/sys/net/netfilter/nf_conntrack_tcp_timeout_established
# 类似,故意不发握手的 ACK 即可。但这个超时时间没那么夸张,系统也有 syn cookie 机制来缓解 syn flood 攻击。
echo 5 > /proc/sys/net/netfilter/nf_conntrack_tcp_timeout_syn_recv
# 一般程序不需要这么长的超时时间
echo 5 > /proc/sys/net/netfilter/nf_conntrack_tcp_timeout_syn_sent
# net.ipv4.tcp_fin_timeout 默认 60 秒,通常还会参考 BSD 和 macOS 设成更小的值。这里往往也没必要这么大。
echo 10 > /proc/sys/net/netfilter/nf_conntrack_tcp_timeout_fin_wait
# linux 里的 MSL 写死 60 秒(而不是 TCP 标准里拍脑袋的 120 秒),TIME_WAIT 要等 2MSL,这里 120 算是个合理的值。但现在默认有PAWS(net.ipv4.tcp_timestamps),不会出现标准制定时担心的迷途报文回来碰巧污染了序列号相同的
# 新连接的数据的情况。互联网公司基本都开 net.ipv4.tcp_tw_reuse,既然半连接都不留这么久,记录似乎也不需要留这么久。
echo 10 > /proc/sys/net/netfilter/nf_conntrack_tcp_timeout_time_wait
# CLOSE_WAIT 状态是让被动关闭方把该传的数据传完。如果程序写得不好,这里抛了未捕捉的异常,也许就走不到发 FIN 那步了,一直停在这里
echo 10 > /proc/sys/net/netfilter/nf_conntrack_tcp_timeout_close_wait
# 被动关闭方发 FIN 后如果一直收不到对面的 ACK 或 RST,会不断重发,直到超时才 CLOSE。net.ipv4.tcp_retries2 的默认值是 15,最多要等 924.6 秒……不过一般都会调小这个值。
echo 10 > /proc/sys/net/netfilter/nf_conntrack_tcp_timeout_last_ack
# 使设置生效
sysctl -p
欢迎光临 期翼嘻嘻即时通讯综合平台 (http://qiyicc.com/bbs001/)
Powered by Discuz! X2