Linux系统网络性能调优

8 篇文章 1 订阅
8 篇文章 1 订阅

tcp网络参数调优思路

1.设置向外连接可用端口范围

2.设置time_wait连接重用

3.设置快速回收time_wait连接

4.设置time_wait的最大连接长度

5.启用以一种比超时重发更精确的方法来启用RTT的计算

        RTT(Round Trip Time):一个连接的往返时间,即数据发送时刻到接收到确认的时刻的差值;

6.设置tcp/ip会话的滑动窗口大小是否可变

7.设置最大等待处于客户端还没有应答回来的连接数

8.设置每一个处于监听状态的端口的监听队列的长度

9.设置最大等待CPU处理的包的数目

10.设置最大打开文件数

11.FIN-WAIT-2状态等待回收时间

12.设置最大系统套接字数据接收缓冲大小

13.设置默认的系统套接字的接收缓冲大小

14.设置最大的系统套接字数据发送缓冲大小

15.设置默认的系统套接字数据发送缓冲大小

16.设置最大的TCP数据发送缓冲大小, 三个值分别是最小, 默认和最大值

17.设置默认的TCP数据接收缓冲大小, 三个值分别是最小, 默认和最大值

TCP网络参数调优

要能够建立一个TCP连接,必须知道对方的IP和一个未被使用的端口号,由于32位操作系统的端口号通常由两个字节表示,也就是只有65535个,所以一台主机能够同时建立的连接数是有限的,当然操作系统还有一些0~1024是受保护的,如80端口、22端口,这些端口都不能被随意占用。
    在Linux中可以通过查看/proc/sys/net/ipv4/ip_local_port_range文件来知道当前这个主机可以使用的端口范围,如下图所示。


    上图表示可以使用的端口为61000-42768=18232。如果可以分配的端口号偏少,再遇到大量并发请求时就会成为瓶颈,由于端口有限导致大量请求等待建立链接,这样性能就会压不上去。另外如果发现有大量的TIME_WAIT的话,可以设置/proc/sys/net/ipv4/tcp_fin_timeout为更小的值来快速释放请求。我们通过另外一主机用 ab -c 30 -n 1000000 10.232.101.208:8080/ 来压测这台机器,看看网络的连接情况,如下图所示。


    可以看出TIME_WAIT的连接有26364个,我们设置sudu sh -c "echo 3 > /proc/sys/net/ipv4/tcp_fin_timeout"后再进行测试,如下图所示。
    
    调整后TIME_WAIT的数量明显减少,除了增大端口范围之外,还可以让TCP连接复用等,这些调优参数如下表所示。

网络参数说明
echo "1024 65535" >/proc/sys/net/ipv4/ip_local_port_range设置向外连接可用端口范围
echo 1 >/proc/sys/net/ipv4/tcp_tw_reuse设置time_wait连接重用
echo 1 >/proc/sys/net/ipv4/tcp_tw_recycle设置快速回收time_wait连接
echo 180000 >/proc/sys/net/ipv4/tcp_max_tw_buckets设置最大time_wait连接长度
echo 0 >/proc/sys/net/ipv4/tcp_timestamps表示是否启用以一种比超时重发更精确的方法来启用对RTT的计算
echo 1 >/proc/sys/net/ipv4/tcp_window_scaling设置TCP/IP会话的滑动窗口大小是否可变
echo 20000 >/proc/sys/net/ipv4/tcp_max_syn_backlog设置最大等待处于客户端还没有应答回来的连接数
echo 10000 >/proc/sys/net/core/somaxconn设置每一个处于监听状态的端口的监听队列的长度
echo 2000000 >/proc/sys/fs/file-max设置最大打开文件数
esho 15 >/proc/sys/net/ipv4/tcp_fin_timeout设置FIN-WAIT-2状态等待回收时间
esho 16777216 >/proc/sys/net/core/mem_max设置最大的系统套接字数据接收缓冲大小
esho 262144 >/proc/sys/net/core/mem_default设置默认的系统套接字数据接收缓冲大小
esho 16777216 >/proc/sys/net/core/wmen_max设置最大的系统套接字数据发送缓存大小
esho 262144 >/proc/sys/net/core/wmen_default设置默认的系统套接字数据发送缓冲大小
echo "4096 87380 16777216" >/proc/sys/net/ipv4/tcp_rmem设置最大的TCP数据发送缓冲大小,三个值分别是最小、默认和最大值
echo "4096 65536 16777216" >/proc/sys/net/ipv4/tcp_wmem设置默认的TCP数据接收缓冲大小,三个值分别是最小、默认和最大值

注意,以上设置都是临时性的,系统重新启动后会丢失。另外,Linux还提供了一些工具可用于查看当前的TCP统计信息,如下所示。

  • cat /proc/net/netstat:查看TCP的统计信息。
  • cat /proc/net/snmp:查看当前系统的连接情况。
  • netstat -s:查看网络的统计信息。

高并发Linux内核网络参数调优

调整linux内核参数以便满足高并发访问,解决大量time_wait和syn攻击问题:

# vi /etc/sysconfig/sysctl.conf

在最下面编辑添加:

net.ipv4.tcp_fin_timeout = 30

net.ipv4.tcp_keepalive_time = 1200

net.ipv4.route.gc_timeout = 100

net.ipv4.ip_local_port_range = 1024 65000

net.ipv4.tcp_tw_reuse = 1

net.ipv4.tcp_tw_recycle = 1

net.ipv4.tcp_syn_retries = 1

net.ipv4.tcp_synack_retries = 1

net.ipv4.tcp_max_syn_backlog = 262144

net.core.netdev_max_backlog = 262144

net.core.somaxconn = 262144

net.ipv4.tcp_mem = 94500000 915000000 927000000

保存退出

netstat -an | grep 80 | awk '{print $5}' | awk 'BEGIN {FS=":"} NF==2 {print $1} NF==5 {print $4}' | sort | uniq -c | sort -n

立刻生效(实践中有遇到不能立刻生效的,需要重启机子才能生效)

使用如下命令监控当前各状态连接:
1 netstat -n | awk '/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}'
2 cat /proc/net/sockstat
3 查看是否有异常日志:dmesg
4 查看当前IP个数和每IP连接数:

默认值恢复:
以上配置在实际生产环境中单机1.7w连接数情况下nginx工作正常。 

net.ipv4.tcp_fin_timeout = 60

net.ipv4.tcp_keepalive_time = 7200

net.ipv4.route.gc_timeout = 300

net.ipv4.ip_local_port_range = 32768 61000

net.ipv4.tcp_tw_reuse = 0

net.ipv4.tcp_tw_recycle = 0

net.ipv4.tcp_syn_retries = 5

net.ipv4.tcp_synack_retries = 5

net.ipv4.tcp_max_syn_backlog = 1024

net.core.netdev_max_backlog = 1000

net.core.somaxconn = 128

net.ipv4.tcp_mem = 853440 1137920 1706880
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值