一、性能测试的主要概念和计算公式

系统吞度量要素:

一个系统的吞度量(承压能力)与request对CPU的消耗、外部接口、IO等等紧密关联。

单个reqeust 对CPU消耗越高,外部系统接口、IO影响速度越慢,系统吞吐能力越低,反之越高。

系统吞吐量几个重要参数:QPS(TPS)、并发数、响应时间

QPS(TPS):每秒钟request/事务 数量

并发数: 系统同时处理的request/事务数

响应时间:  一般取平均响应时间

理解了上面三个要素的意义之后,就能推算出它们之间的关系:

QPS(TPS)= 并发数/平均响应时间

*******************************************************

二、Linux 下产生大量 TIME_WAIT 状态的原因和解决办法

1、问题描述:高负载下,系统响应变慢,并出现超时或失误失败情况,TIME_WAIT积压

2、问题影响:系统设置的自动回收时间为60s,但在压测中如果涉及的服务较多的情况下,比如这次以100TPS压力单测1个接口,涉及4-6个服务,每秒就会创建400+的连接,1分钟就是2.4万的连接,系统无法及时回收,压测两分钟后,新的请求过来,无法创建连接或无法及时创建连接,导致请求失败,严重时会出现整个服务器挂死(新来的请求无法创建连接)。

3、问题原因:Linux环境配置存在问题(后check所有测试环境均未配置,包括生产环境)

4、问题背景:在对A接口进行负载测试时,在一定压力下,出现了比较诡异的现象:在100TPS压力下,开始响应时间很快,都在0.3s左右,但压测不到一分钟开始出现大量事务失败,响应时间倍增,最后系统甚至出现“挂死”。

5、问题解决:增加以下,

[root@aaa1 ~]# vim /etc/sysctl.conf

net.ipv4.tcp_tw_reuse = 1

这个是重点,表示开启重用。允许将TIME-WAIT sockets重新用于新的TCP连接,默认为0,表示关闭

问题定位及验证

netstat -n | awk '/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}'

TIME_WAIT 41735

CLOSE_WAIT 145

FIN_WAIT2 3

ESTABLISHED 413

不到两分钟,time_wait积压到4万,最后导致无法创建新的连接,事务全部失败。

添加参数后,再次验证,以下是压测十分钟中的time_wait数据,一致保持在5000以下,而且由于不需要重新创建连接,直接用已存在的,减少了资源开销,120TPS比之前压测100TPS的性能要好很多。

netstat -n | awk '/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}'

TIME_WAIT 4500

CLOSE_WAIT 7

ESTABLISHED 642

***************************附上相关参数的详解****************************

1、在服务器中可输入如下命令:

#netstat -n | awk '/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}'

LAST_ACK 14

SYN_RECV 348

ESTABLISHED 70

FIN_WAIT1 229

FIN_WAIT2 30

CLOSING 33

TIME_WAIT 18122

状态:描述

CLOSED:无连接是活动的或正在进行

LISTEN:服务器在等待进入呼叫

SYN_RECV:一个连接请求已经到达,等待确认

SYN_SENT:应用已经开始,打开一个连接

ESTABLISHED:正常数据传输状态

FIN_WAIT1:应用说它已经完成

FIN_WAIT2:另一边已同意释放

ITMED_WAIT:等待所有分组死掉

CLOSING:两边同时尝试关闭

TIME_WAIT:另一边已初始化一个释放

LAST_ACK:等待所有分组死掉

也就是说,这条命令可以把当前系统的网络连接状态分类汇总。

如发现系统存在大量TIME_WAIT状态的连接,通过调整内核参数解决。

2、先检查一下time wait的值:

[root@aaa1 ~]# sysctl -a | grep time | grep wait

net.ipv4.netfilter.ip_conntrack_tcp_timeout_time_wait = 120

net.ipv4.netfilter.ip_conntrack_tcp_timeout_close_wait = 60

net.ipv4.netfilter.ip_conntrack_tcp_timeout_fin_wait = 120

[root@aaa1 ~]# sysctl -a|grep net.ipv4.tcp_tw

(说明没配置)

3、修改系统配置

[root@aaa1 ~]# vim /etc/sysctl.conf

增加以下几行:(请根据实际需要添加

net.ipv4.tcp_fin_timeout = 30

net.ipv4.tcp_keepalive_time = 1200

net.ipv4.tcp_syncookies = 1

net.ipv4.tcp_tw_reuse = 1

net.ipv4.tcp_tw_recycle = 1

net.ipv4.ip_local_port_range = 1024 65000

net.ipv4.tcp_max_syn_backlog = 8192

net.ipv4.tcp_max_tw_buckets = 5000

说明:

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套接字拖死。

4、执行以下命令使配置生效:

[root@aaa1 ~]# /sbin/sysctl -p

***************************关于 sysctl.conf 中的其他参数****************************

$ /proc/sys/net/core/wmem_max
最大socket写buffer,可参考的优化值:873200

$ /proc/sys/net/core/rmem_max
最大socket读buffer,可参考的优化值:873200

$ /proc/sys/net/ipv4/tcp_wmem
TCP写buffer,可参考的优化值: 8192 436600 873200

$ /proc/sys/net/ipv4/tcp_rmem
TCP读buffer,可参考的优化值: 32768 436600 873200

$ /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

$ /proc/sys/net/core/netdev_max_backlog
进入包的最大设备队列.默认是300,对重负载服务器而言,该值太低,可调整到1000.

$ /proc/sys/net/core/somaxconn
listen()的默认参数,挂起请求的最大数量.默认是128.对繁忙的服务器,增加该值有助于网络性能.可调整到256.

$ /proc/sys/net/core/optmem_max
socket buffer的最大初始化值,默认10K.

$ /proc/sys/net/ipv4/tcp_max_syn_backlog
进入SYN包的最大请求队列.默认1024.对重负载服务器,增加该值显然有好处.可调整到2048.

$ /proc/sys/net/ipv4/tcp_retries2
TCP失败重传次数,默认值15,意味着重传15次才彻底放弃.可减少到5,以尽早释放内核资源.

$ /proc/sys/net/ipv4/tcp_keepalive_time
$ /proc/sys/net/ipv4/tcp_keepalive_intvl
$ /proc/sys/net/ipv4/tcp_keepalive_probes

这3个参数与TCP KeepAlive有关.默认值是:

tcp_keepalive_time = 7200 seconds (2 hours)
tcp_keepalive_probes = 9
tcp_keepalive_intvl = 75 seconds

意思是如果某个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

$ proc/sys/net/ipv4/ip_local_port_range
指定端口范围的一个配置,默认是32768 61000,已够大.

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。

性能案例-Linux下解决time_wait连接过多(Linux内核优化)相关推荐

  1. linux连接池等待时间,LINUX系统下解决time_wait 连接数过多问题

    经常检查apache的连接数,会发现很多无用的time_wait连接.有人说这是正常的,是因为一个请求中途中断造成的:还有人说微软的IE连接时产生的Time_wait会比用Firefox连接时多.个人 ...

  2. linux下 远程桌面连接,Unix/Linux下通过远程桌面连接Windows OS

    不知Microsoft出于什么考虑,在Windows XP中只允许一个Session通过远程桌面连接,如果一台XP为管理工作站,只有它能够访问后端的SAN Switch或存储系统,那么多人将无法同时使 ...

  3. linux 进程 状态 ri,LINUX下解决netstat查看TIME_WAIT状态过多问题(转)

    # netstat -an|awk '/tcp/ {print $6}'|sort|uniq -c 16 CLOSING 130 ESTABLISHED 298 FIN_WAIT1 13 FIN_WA ...

  4. LINUX下解决netstat查看TIME_WAIT状态过多问题

    LINUX下解决netstat查看TIME_WAIT状态过多问题 参考文章: (1)LINUX下解决netstat查看TIME_WAIT状态过多问题 (2)https://www.cnblogs.co ...

  5. Linux 下用 Python 连接 MSSql Server 2008

    Linux 下用 Python 连接 MSSql Server 2008 赖勇浩(http://blog.csdn.net/lanphaday) Keywords:Linux.python.pyodb ...

  6. linux登陆ftp报错425,linux下命令行连接FTP是遇到的错误(425 Failed to establish connection)...

    linux下命令行连接FTP是遇到的错误(425 Failed to establish connection) 首先FTP的运行模式有主动模式和被动模式两种 然后笔者在工作中搭建了ftp,但是没有开 ...

  7. linux mysql 1055_记一次Linux下解决MySql1055问题

    记一次Linux下解决MySql1055问题 2020-03-20 05:41:09  卢浮宫  版权声明:本文为站长原创文章,转载请写明出处 QQ分享 一.背景 今天在项目中遇到一个问题: sql中 ...

  8. TCP连接中TIME_WAIT连接过多

    2019独角兽企业重金招聘Python工程师标准>>> TCP连接中TIME_WAIT连接过多 转载于:https://my.oschina.net/meowmeow/blog/36 ...

  9. Linux下解决“shutdown: command not found“问题

    Linux下解决"shutdown: command not found"问题 参考文章: (1)Linux下解决"shutdown: command not found ...

最新文章

  1. 从业务发展的阶段看系统发展
  2. 直播源码:直播+内容营销新趋势
  3. 【PAT - 甲级1155】Heap Paths (30分)(栈,dfs,二叉树)
  4. LeetCode425——Add Strings(两个字符串中的数字相加(十进制或二进制),输出字符串形式的结果)
  5. SpringBoot怎么直接访问templates下的html页面
  6. MySQL如何创建沙箱,沙箱环境搭建 - osc_y8w65yuq的个人空间 - OSCHINA - 中文开源技术交流社区...
  7. C++ 预处理器和名称空间
  8. WinXp怎么开机进入Dos
  9. 软件工程师工作内容和从业要求
  10. 关于自动化测试,你真的懂嘛?
  11. WebSocket 对象简介
  12. iPhone/iPad怎么进入恢复模式?
  13. Oracle细节,plsql语法大全
  14. Linkflow新锐洞察 06 | DTC品牌如何快速规模化?
  15. jsp使用session出现The server encountered an unexpected condition that prevented it from fulfilling the r
  16. 如何关闭苹果手机自动扣费_手机自动扣费?三招教你关闭
  17. 华为手机下拉菜单变大_华为手机下拉菜单变少了 华为下拉通知栏变白色
  18. 计算机操作系统 - 目录
  19. SIGIR论文写作技巧
  20. 水仙花数(Java实现)

热门文章

  1. Java从SFTP服务器下载文件一
  2. python中ret是什么意思_数据结构图在python中的应用
  3. 合同模板布局html,套打模板制作(合同类模板)
  4. 华中科大计算机冯丹,华中科大南加校友会欢迎母校代表团
  5. html键值对与名称值对的区别,使用网络存储存储键值对的数据-HTML5教程
  6. html footer 布局,详解CSS经典布局之Sticky footer布局
  7. java下拉列表选日期_iPhone应用程序:日期选择器查看下拉列表
  8. java循环购物车结算系统_原生JS实现购物车结算功能代码
  9. mysql怎么导出所有的表名称_MYSQL导出表名(navicat 导出表名称)
  10. 快速搭建Java 17环境并玩转Record特性