前言
这篇文章的主题是记录一次性能优化,在优化的过程中遇到的问题,以及如何去解决的。为大家提供一个优化的思路,首先要声明的一点是,我的方式不是唯一的,大家在性能优化之路上遇到的问题都绝对不止一个解决方案。
如何优化
首先大家要明确的一点是,脱离需求谈优化都是耍流氓,所以有谁跟你说在xx机器上实现了百万并发,基本上可以认为是不懂装懂了,单纯的并发数完全是无意义的。其次,我们优化之前必须要有一个目标,需要优化到什么程度,没有明确目标的优化是不可控的。再然后,我们必须明确的找出性能瓶颈在哪里,而不能漫无目的的一通乱搞。
需求描述
这个项目是我在上家公司负责一个单独的模块,本来是集成在主站代码中的,后来因为并发太大,为了防止出现问题后拖累主站服务,所有由我一个人负责拆分出来。对这个模块的拆分要求是,压力测试QPS不能低于3万,数据库负载不能超过50%,服务器负载不能超过70%, 单次请求时长不能超过70ms,错误率不能超过5%。
环境的配置如下:
服务器:4核8G内存,centos7系统,ssd硬盘
数据库:Mysql5.7,最大连接数800
缓存: redis, 1G容量。
以上环境都是购买自腾讯云的服务。
压测工具:locust,使用腾讯的弹性伸缩实现分布式的压测。
需求描述如下:
用户进入首页,从数据库中查询是否有合适的弹窗配置,如果没有,则继续等待下一次请求、如果有合适的配置,则返回给前端。这里开始则有多个条件分支,如果用户点击了弹窗,则记录用户点击,并且在配置的时间内不再返回配置,如果用户未点击,则24小时后继续返回本次配置,如果用户点击了,但是后续没有配置了,则接着等待下一次。
重点分析
根据需求,我们知道了有几个重要的点,
1、需要找出合适用户的弹窗配置,
2、需要记录用户下一次返回配置的时间并记录到数据库中,
3、需要记录用户对返回的配置执行了什么操作并记录到数据库中。
调优
我们可以看到,上述三个重点都存在数据库的操作,不只有读库,还有写库操作。从这里我们可以看到如果不加缓存的话,所有的请求都压到数据库,势必会占满全部连接数,出现拒绝访问的错误,同时因为sql执行过慢,导致请求无法及时返回。所以,我们首先要做的就是讲写库操作剥离开来,提升每一次请求响应速度,优化数据库连接。整个系统的架构图如下:
(ca, 还是没地方上传图片)
应用层:安卓+IOS+Web
接入层:LB
服务层: 主服务-》消息队列-》redis
|
DB
将写库操作放到一个先进先出的消息队列中来做,为了减少复杂度,使用了redis的list来做这个消息队列。
然后进行压测,结果如下:
QPS在6000左右502错误大幅上升至30%,服务器cpu在60%-70%之间来回跳动,数据库连接数被占满tcp连接数为6000左右,
很明显,问题还是出在数据库,经过排查sql语句,查询到原因就是找出合适用户的配置操作时每次请求都要读取数据库所导致的连接数被用完。因为我们的连接数只有800,一旦请求过多,势必会导致数据库瓶颈。
好了,问题找到了,我们继续优化,更新的架构如下
应用层:安卓+IOS+Web
接入层:LB
服务层: 主服务-》消息队列-》redis
| | |
DB ------------------------
我们将全部的配置都加载到缓存中,只有在缓存中没有配置的时候才会去读取数据库。
接下来我们再次压测,结果如下:
QPS压到2万左右的时候就上不去了,服务器cpu在60%-80%之间跳动,数据库连接数为300个左右,每秒tpc连接数为1.5万左右。
这个问题是困扰我比较久的一个问题,因为我们可以看到,我们2万的QPS,但是tcp连接数却并没有达到2万,我猜测,tcp连接数就是引发瓶颈的问题,但是因为什么原因所引发的暂时无法找出来。
这个时候猜测,既然是无法建立tcp连接,是否有可能是服务器限制了socket连接数,验证猜测,我们看一下,在终端输入ulimit -n命令,显示的结果为65535,看到这里,觉得socket连接数并不是限制我们的原因,为了验证猜测,将socket连接数调大为100001.
再次进行压测,结果如下:
QPS压到2.2万左右的时候就上不去了,服务器cpu在60%-80%之间跳动,数据库连接数为300个左右,每秒tpc连接数为1.7万左右。
虽然有一点提升,但是并没有实质性的变化,接下来的几天时间,我发现都无法找到优化的方案,那几天确实很难受,找不出来优化的方案,过了几天,再次将问题梳理了一遍,发现,虽然socket连接数足够,但是并没有全部被用上,猜测,每次请求过后,tcp连接并没有立即被释放,导致socket无法重用。经过查找资料,找到了问题所在,
tcp链接在经过四次握手结束连接后并不会立即释放,而是处于timewait状态,会等待一段时间,以防止客户端后续的数据未被接收。
好了,问题找到了,我们要接着优化,首先想到的就是调整tcp链接结束后等待时间,但是linux并没有提供这一内核参数的调整,如果要改,必须要自己重新编译内核,幸好还有另一个参数net.ipv4.tcp_max_tw_buckets, timewait 的数量,默认是 180000。我们调整为6000,然后打开timewait快速回收,和开启重用,完整的参数优化如下
#timewait 的数量,默认是 180000。
net.ipv4.tcp_max_tw_buckets = 6000
net.ipv4.ip_local_port_range = 1024 65000
#启用 timewait 快速回收。
net.ipv4.tcp_tw_recycle = 1
#开启重用。允许将 TIME-WAIT sockets 重新用于新的 TCP 连接。
net.ipv4.tcp_tw_reuse = 1
我们再次压测,结果显示:
QPS5万,服务器cpu70%,数据库连接正常,tcp连接正常,响应时间平均为60ms,错误率为0%。
结语
到此为止,整个服务的开发、调优、和压测就结束了。
回顾这一次调优,得到了很多经验,最重要的是,深刻理解了web开发不是一个独立的个体,而是网络、数据库、编程语言、操作系统等多门学科结合的工程实践,这就要求web开发人员有牢固的基础知识,否则出现了问题还不知道怎么分析查找。
相关推荐
1. **负载均衡**:专用网关可以实现对多个服务器的负载均衡,将来自SDK的请求分散到不同的后端服务器,避免单点压力过大,从而提高QPS处理能力。 2. **请求合并**:对于某些短时高并发的请求,网关可以采用批量处理...
服务器端性能优化是IT行业中一个至关重要的议题,尤其是在WEB服务器端开发领域,其目标在于有效提升QPS(Query-per-second,每秒查询率)和RT(Response-time,响应时间)。本文将深入探讨如何通过合理利用资源如CPU...
本资料包“基于JAVA简单简洁的压力测试, QPS测试工具.zip”提供了一种使用Java实现的压力测试解决方案,旨在帮助开发者快速评估其应用的QPS性能。 首先,我们要理解QPS的概念。QPS代表每秒查询率,是衡量一个系统在...
在MySQL性能优化和监控过程中,QPS(Queries Per Second,每秒查询量)和TPS(Transactions Per Second,每秒事务量)是两个非常关键的性能指标。 QPS指的是系统每秒钟能处理的查询量,这个指标直接反映了系统的...
QPS:Queries Per Second 查询量/秒,是一台服务器每秒能够相应的查询次数,是对一个特定的查询服务器在规定时间内所处理查询量多少的衡量标准。 TPS : Transactions Per Second 是事务数/秒,是一台数据库...
【服务器端性能优化-提升QPS:RT1】主要探讨的是如何通过优化服务器性能来提升QPS(每秒查询率)和降低RT(响应时间),从而实现系统效率的最大化。以下将详细介绍相关知识点: 1. **优化方向**: - 首先,要找到...
【QPS289Setup 2.04】是一款针对对讲机频率编程的专业软件,主要功能是帮助用户对对讲机进行写频操作。在无线电通信领域,对讲机的频率设定至关重要,因为它决定了设备之间的通信范围和质量。这款软件的版本号为2.04...
基于ELK的nginx-qps监控解决方案 在现代网络架构中,监控和日志分析是非常重要的组件之一。ELK(Elasticsearch、Logstash、Kibana) stack是当前最流行的日志分析解决方案之一。今天,我们将讨论基于ELK的nginx-qps...
awk测试从nginx查询qps的测试日志
在对MySQL进行性能优化时,理解QPS和TPS至关重要,它们可以帮助我们识别性能瓶颈,调整系统配置,甚至改进查询语句以提升整体性能。结合源码分析和工具使用,我们可以更有效地管理和监控MySQL数据库,确保其高效稳定...
【深度学习-轻量级骨干网-QPS】文档主要探讨了在深度学习中,如何选择适合实际业务的轻量级骨干网,通过在英伟达T4 GPU上测试QPS(Queries Per Second,即每秒处理查询数)来评估模型性能。本文主要涉及以下几个关键...
在IT行业中,尤其是在Java架构设计领域,理解和计算系统峰值、TPS(每秒事务数)、QPS(每秒查询率)以及并发数等指标对于优化系统性能至关重要。这些概念是评估系统负载能力和处理能力的标准。 1. **响应时间(RT...
QPS 高性能 qps 计数器安装$ npm install qps用法 var QPSCounter = require ( 'qps' ) ;var counter = new QPSCounter ( ) ;// plus onecounter . plus ( ) ;// current qpscounter . get ( ) ;应用程序接口...
在HBase这样的分布式列式数据库中,读性能的优化至关重要,因为它直接影响到应用程序的响应速度和用户体验。本文主要探讨了HBase服务器端的读性能优化策略,这些策略可以帮助解决读延迟大、资源消耗高和负载不均衡等...
Qimera 是一款易于使用但功能最强大的声纳数据处理应用程序。使用核心 QPS 技术构建而成,以及 QPS QINSy 项目,Qimera 支持主要的原始声呐文件格式,并且通过与 Dynamic Workflow™ 配合使用,它改变了数据处理方式...
QPS教程对于任何希望优化系统性能或者从事高性能应用开发的人员来说,都是一份极具价值的学习资料。 在QPS教程中,你将了解到以下关键知识点: 1. **QPS定义与理解**:QPS是系统在单位时间内处理查询请求的能力,...
《Quartus® Prime Standard Edition Handbook》是一本关于Quartus® Prime标准版软件的官方使用手册,由Altera公司出版。该手册详细介绍了如何利用Quartus® Prime软件进行FPGA和CPLD设计和编译的各种知识与技巧。...