You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

191 lines
11 KiB
Markdown

This file contains invisible Unicode characters!

This file contains invisible Unicode characters that may be processed differently from what appears below. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to reveal hidden characters.

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

# 27丨案例带宽消耗以及Swap
今天我们来看一个真实的案例。事情是这样的之前有人在微信上问我一个问题这个问题的现象很典型典型的TPS上不去响应时间增加资源用不上。
大概的情况是这样的有两台4C8G的服务器一台服务器上有2个Tomcat一台服务器上是DB。压测的混合场景有4个功能模块其中3个访问一个Tomcat另外一个访问一个Tomcat。
Tomcat的监控页面如下
![](https://static001.geekbang.org/resource/image/53/0b/532bbd1525be0ad0d08da7335645260b.png)
应用服务器系统资源监控页面如下:
![](https://static001.geekbang.org/resource/image/19/e5/1944bc692902fed979815a538d879be5.png)
数据库服务器系统资源监控如下:
![](https://static001.geekbang.org/resource/image/50/f0/50a996ac196dbfd2b9a23858e87dc8f0.png)
JMeter结果如下
![](https://static001.geekbang.org/resource/image/f8/33/f8b228a61b980c338046fbb3c8875033.png)
综上现象就是,单业务场景执行起来并不慢,但是一混合起来就很慢,应用服务器和数据库服务器的系统资源使用率并不高。请问慢在哪?
这是非常典型的询问性能问题的方式,虽然多给了系统资源信息,但是这些信息也不足以说明瓶颈在哪。
为什么呢?在现在多如牛毛的监控工具中,除非我们在系统中提前做好分析算法或警告,否则不会有监控工具主动告诉你, 监控出的某个数据有问题,而这个只能靠做性能分析的人来判断。
我在很多场合听一些“专家”说:性能分析判断要遵守木桶原理。但是在做具体技术分析的时候,又不给人说明白木桶的短板在哪里。这就好像,一个赛车手说要是有一个各方面都好的车,我肯定能得第一名,但是,我没有车。
话说出来轻而易举但是请问木桶的短板怎么判断呢因为CPU高所以CPU就是短板吗所以就要加CPU吗这肯定是不对的。
因为这个例子并不大,所以可以细细地写下去。今天文章的目的就是要告诉你,性能问题分析到底应该是个什么分析思路。
## 分析的第一阶段
### 画架构图
做性能测试时,我们需要先画一个架构图,虽然简单,但是让自己脑子里时时记得架构图,是非常有必要的。因为架构级的分析,就是要胸怀架构,在看到一个问题点时,可以从架构图中立即反应出来问题的相关性。
![](https://static001.geekbang.org/resource/image/fe/2c/fe8abb747bdeebfefd833ae8a5f4e12c.jpg)
上面这张图是自己脑子里的逻辑图,数据在网络中的流转并不是这样,而是像下图这样。
![](https://static001.geekbang.org/resource/image/72/8c/72fdc9310d5678fc1988f96f3026b28c.jpg)
数据流是从压力机到应用服务器,应用服务器再到网络设备,再到数据库服务器;数据库把数据返回给应用服务器,应用服务器再通过网络设备给压力机。
如果把里面的Redis、ActiveMQ和MySQL的逻辑再细说明白那么这个小小的应用都可以描述好一会。所以这里我先大概描述一下如果后面的分析中涉及到了相应的逻辑再一点点加进来。
应用服务器只有一台上面有两个Tomcat实例数据库服务器有三个应用。混合场景中有四个业务其中三个访问Tomcat1第四个访问Tomcat2。
### 场景描述
有了场景大概的画像之后,我们再来看场景。根据测试工程师描述:
1. 响应时间慢的都是可视化页面有不少图片、JS、CSS等静态资源。公网上是用CDN的现在只测试内网的部分。静态资源已经做了压缩。
2. 单业务测试的容量是可以满足要求的,但混合场景响应时间就长。系统资源用得并不多。
3. 压力场景是300线程Ramp-up period是1秒。
4. Duration是72000。
5. 各参数化都已经做了,参数化数据也合理。
6. 测试环境都是内网。
7. 服务器是CentOS压力机是Win10。
既然这样,我们还是要看看系统的各个资源,再来判断方向。我在很多场合都强调证据链。对架构比较简单的应用来说,我们都不用再做时间的拆分了,直接到各主机上看看资源就好了。
### 瓶颈分析定位
根据我们之前画的架构图,我们从应用服务器、数据库服务器和压力数据分别定位一下。
* 应用服务器
![](https://static001.geekbang.org/resource/image/5f/b0/5f3f4fc313c833ff2ad979d63de7f9b0.png)
从前面的应用服务器资源来看CPU使用率现在还不高也基本都在us CPU就是user消耗的CPU比例也比较合理。
物理内存8G还有3.5G。即使不多对Java应用来说也要先看JVM只要不是page fault过多我们可以先不用管物理内存。
网络资源接收900KB/s左右发送11M左右。这样的带宽应该说是比较敏感的因为对100Mbps和1000Mbps来说我们要心里有一个数一个是12.5MB对应100Mbps一个是125MB对应1000Mbps当和这样的带宽值接近的时候就要考虑下是不是带宽导致的压力上不去。不过这里我们也不用先下定论。只是留个疑问在这里。
磁盘资源,基本上没有读写,很正常。
从Process列表中也没看到什么异常数据。faults也都是minmajor fault并没有。但在这个案例中还部署了另一个监控工具上面显示如下
![](https://static001.geekbang.org/resource/image/9e/b9/9e9bc7528dac06fcbef811eed0ae8bb9.png)
为什么这个Swapping要标黄呢那肯定是过大了嘛。是的你可以觉得swap过多。这个扣我们也记在心里。在这里标红加粗敲黑板
* 数据库服务器
![](https://static001.geekbang.org/resource/image/23/14/23b3ce5e2d551a54c59ef24c3601ad14.png)
照样分析CPU、内存、网络、磁盘、Process列表并没看到哪里有异常的数据连网络都只有500多k的发送。
这样的数据库资源状态告诉我们,它不在我们的问题分析主线上。接下来是压力数据。
* 压力数据
这是JMeter中的聚合报告
![](https://static001.geekbang.org/resource/image/ee/98/eecc1affbdeca2484d2964a93d75fe98.png)
从上面这张图也能看出,响应时间确实挺长的,并且,300线程只有37的TPS带宽总量10M左右。这个带宽倒是和应用服务器上的带宽使用量相当。关于这个带宽的判断请你一定注意对于性能分析来说带宽能不能对得上非常重要。比如,客户端接收了多少流量,服务端就应该是发出了多少流量。如果服务端发了很多包,但是客户端没有接收,那就是堵在队列上了。
既然其它的资源暂时没出现什么瓶颈。其实在这个时间里,如果是复杂的应用的话,我们最应该干的一件事情就是拆分时间。如下图所示:
![](https://static001.geekbang.org/resource/image/e7/41/e77401663a74e38dacf6cd05f3c96f41.jpg)
这里我把时间拆为t1-t5具体分析哪一段为什么消耗了时间。我们可以在Tomcat中加上%D和%F两个参数来记录request和response的时间。
在没有做这个动作之前我们先把前面的扣解决一下。首先带宽是不是受了100Mbps的限制
一般来说,判断网络的时候,我们会有几个判断点。
首先是带宽的流量大小也就是前面我们看到的11M左右的值。一般来说100Mbps是指的bit per second但是在应用层基本上都是byte所以对100Mbps来说是12.5MB。
其次是,全连接和半连接队列是否已经溢出?
![](https://static001.geekbang.org/resource/image/c7/07/c7a67037f03d82378eec8b6c70c32207.png)
我们通过SYNs to LISTEN sockets dropped来判断半连接队列是否溢出通过times the listen queue of a socket overflowed来判断全连接队列是否溢出。
通过实时的查看,这两个值的增加并不多。所以这里不会是问题点。
最后是发送和接收队列是否堆积?
![](https://static001.geekbang.org/resource/image/fe/72/fe954bf48b860464923418ca90800572.png)
通过应用服务器上的send-Q前面数第三列可以看到服务器和压力机之间的的队列还是很长的基本上每次查看都存在这说明队列一直都有堆积。
我们再到压力机上看看带宽用了多少:
![](https://static001.geekbang.org/resource/image/f2/4d/f2a3e24763892f2eab807adc6934ac4d.png)
看这里也是用到了93Mbps那么到这里我们就可以确定是网络问题导致的TPS上不去响应时间增加系统资源也用不上了。
和系统管理员确认宿主机的带宽后被告知宿主机确实是100Mbps。
似乎这个分析到这里就可以结束了,直接把带宽加上再接着测试呗。但是,从项目实施的角度上说,这个问题,并不是阻塞性的。
为了把更多的性能问题提前找出来,现在我们先不下载静态资源,只发接口请求找下其他性能问题。这个带宽的问题记一个bug就行了。
### 优化结果
我们将静态资源全都过滤掉之后,再次执行场景,结果是下面这样的。
JMeter压力数据
![](https://static001.geekbang.org/resource/image/77/aa/771ee29f154f43bc84c8e8df66431caa.png)
应用服务器带宽:
![](https://static001.geekbang.org/resource/image/ed/b6/ed896cecbdfbb6c9cc4beba10f5744b6.png)
数据库服务器带宽:
![](https://static001.geekbang.org/resource/image/74/b8/74a2516200a297a062730341eacf60b8.png)
应用服务器网络队列:
![](https://static001.geekbang.org/resource/image/75/73/750402d3482cba2c6e77cd9043616373.png)
应用服务器资源监控:
![](https://static001.geekbang.org/resource/image/75/7c/75423cd11a411b3847252d479554a97c.png)
通过上面的结果可以看出:
1. TPS可以达到221.5了并且Received和Sent的字节加一起不到4MB。
2. 应用服务器和数据库服务器的带宽都用到了近40Mbps和JMeter结果也相当。
3. 应用服务器上的网络队列也没有堆积。
4. 应用服务器的CPU也已经能消耗到66%了,
当正在想通过过滤掉静态资源绕过带宽不足的现状来测试其他性能问题的时候这时Swap双向都标黄了。这时性能测试工程师更纠结了它为什么双向都黄了CPU使用率才66%嘛。
其实这两句话之间并没有什么关系CPU使用率不管是多少Swap该黄还是会黄。
这是为什么呢?这里卖个关子,在下一篇文章中,我们接着分析。
## 总结
带宽问题是性能分析中常见的问题之一其难点就在于带宽不像CPU使用率那么清晰可理解它和TCP/IP协议的很多细节有关像三次握手四次挥手队列长度网络抖动、丢包、延时等等都会影响性能关键是这些判断点还不在同一个界面中所以需要做分析的人有非常明确的分析思路才可以做得到。而且现在的监控分析工具中对网络的判断也是非常薄弱的。
而Swap问题不能算是常见只要出现基本上就会很多人晕乎。解决的关键就是要明白Swap的原理查到关联参数然后就可以很快地定位了。
## 思考题
结合今天的内容,你能说一下网络的瓶颈如何判断吗?有哪几个队列?
欢迎你在评论区写下你的思考,也欢迎把这篇文章分享给你的朋友或者同事,一起交流一下。