目录
分析过程
优化报告
1 背景
2 用户访问示意图
3 存在的问题
4、分析
5 解决方案
6 服务器升级方案
首页 后端开发 php教程 一次生产事故的优化经历

一次生产事故的优化经历

Mar 12, 2017 pm 04:24 PM

在一次正常的活动促销之后,客服开始陆续反馈有用户反应在抢标的时候打不开网页或者APP,在打开的时候标的就已经被抢光了,刚开始没有特别的上心,觉得抢标不就是这样吗,抢小米手机的时候也不就这样吗?随着活动继续推进,有更多的用户强烈抗议,用户领了加息卷或者抵现卷之后抢不上标的,认为是平台作假故意不让使用以达到节省资源。

分析过程

其实以前也会有陆续的用户反馈不减少,给客户以小米抢手机为例子忽悠了过去,这次用户反馈太过强烈,才让我们重视了起来。我们前端一共三款产品,app、官网、H5,其中app使用量最大,官网其次,H5平时使用量极少但是做活动期间流量会暴增(活动一般都是H5游戏居多,H5也便于推广营销),前端的三款产品都是分别使用lvs负载到后端的两台web服务器中(如下图),这次用户反馈基本在web和app端,所以重点观察这四台服务器。

一次生产事故的优化经历

首先怀疑网络带宽是否被涌满,找到网络工程师通过工具来监控,在抢标的时候带宽最高使用率只有70%左右,随排除之;再次怀疑web服务器是否抗不住了,使用top命令查看官网负载的两台服务器,在抢标的瞬间会飙到6-8左右,抢标后也慢慢的恢复了正常,app两台服务器高峰到10-12,随后也恢复正常。

跟踪web服务器业务日志,发现在数据库更新层报请求不到新的数据库连接或者数据库连接已经用完,认为是数据库的最大连接数太小,于是调整mysql数据库最大连接数为以往的3倍;下次抢标的时候继续观察业务日志,发现已经不报数据库链接的相关错误了,但还是很多用户反馈抢标时候打不开页面。

继续跟踪web服务器,在抢标时使用命令(ps -ef|grep httpd|wc -l)查看httpd得连接数有1千左右,随机查看apache配置文件中设置的最大连接数为1024(apache默认的最大连接数为256),原来抢标期间连接数已经到达最大连接数,很多用户在抢标的过程中已经获取不到http连接导致页面无响应或者app一直在等待中。于是调整apache配置文件中的最大连接数为1024*3。

在抢标过程中继续观察,apache的连接数在抢标的时候仍然可以飙到2600-2800之间,根据客服反馈,仍然有很多用户反馈抢标的问题,但比之前稍微好一点,但是有零星的用户反馈已经抢到标的,最后又给回退了。然后继续观察数据库服务器,使用top命令和MySQLWorkbench查看mysql主库和从库的各项负载吓一跳(如下图),mysql服务器主库的各项指标均已经达到峰值,而从库几乎没有太大压力。

一次生产事故的优化经历

跟踪代码发现,三端的业务代码全部连接主库,从库只有后台的查询业务在使用,于是立刻启动改造;将除过抢标过程中的查询外,其它页面或者业务的所有查询改造为查询从库,改造之后观察,发现主库的压力明显减少,从库的压力开始上来了。如下图:

一次生产事故的优化经历

根据客服的反馈,改造之后抢到标回退的问题几乎没有了,抢标过程中页面打不开或者打开慢的问题有一定的缓解但仍有部分用户反馈此问题,根据上面各项目分析结果得出:

  • 1 负载的两台服务器均已经达到处理的极限,需要配置更多的服务器来负载。

  • 2 mysql主库的压力明显减少,但是从库的压力却上去了,需要将现在的一主一从已从改为一主多从的模式

  • 3 彻底解决这些问题,需要综合考虑平台的整体优化,如:业务优化(去掉业务中热点)、增加缓存、部分页静态化(可以使用雅虎和谷歌的前端优化规则,网上也有很多的测试网站可以评测)等等。

当时根据这些情况写了一份优化的报告,见下文:

优化报告

1 背景

随着公司业务不断发展,业务量和用户量的激增,官网pv也从最初的xxx-xxx到现在的xxx-xxxx,APP活跃用户更是大幅增加;因此也对平台目前的技术架构有了更大的挑战。特别是近期平台标源紧张的情况下,满标的时间更是越来越短。服务器的压力也越来越大;因此需要升级目前的系统架构,以支持更大的用户量和业务量。

2 用户访问示意图

一次生产事故的优化经历

目前平台有三款产品面对用户,平台官网、平台APP、平台小网页;其中平台官网和平台APP的压力比较大。

3 存在的问题

用户抢标的时候问题集中在以下几个方面
1、网页或者APP打不开
2、网站或者APP打开慢
3、抢标过程中转账成功后,因为服务器负责压力大更新失败,再次退款
4、数据库连接数用完,导致满标后添加投资记录失败,回退标的进度

4、分析

通过对近期的服务器参数,并发量,以及系统日志等进行深入的分析,得出:
1、平台官网、平台APP抢标过程中服务器压力巨大,其中平台APP问题更加突出,抢标高峰期间单台APP服务器apache最大连接数已经接近2600,接近apache最大的处理能力

2、数据库服务器压力巨大。数据库压力主要在两个时期比较突出
1)当平台做活动的时候,官网、小网页、APP访问量巨增,导致数据查询量跟着巨增,当到达数据库处理极限时,就会表现出网站打开慢等问题;
2)当用户抢标的时候,用户抢标的压力又分为两个阶段:抢标前和抢标中。抢标前,因为满标速度很快,用户提前打开抢标页面不断刷新,这样数据库的查询压力会不断增大,如果抢标的用户量非常大,会导致在抢标之前将数据库连接数用完;抢标中,单次购买大概会涉及15张左右表进行更改查询,每个标的份额1000万大概每次会有100-200人左右购买完成满标,以中间值150人计算,在几秒的时间内需要对数据更新2000-3000次(仅仅是更新,不包括查询 ),产生大量并发,可能会导致更新失败或者连接超时,从而影响到用户投标和系统正常满标。

5 解决方案

1、web服务器解决方案
单个用户访问web服务的示意图

一次生产事故的优化经历

目前网站和平台APP均是采用了两台服务来做均衡负责,每台服务器中安装了apache来做服务端接受处理,每台apache最大可以处理大约2000条连接。因此理论上目前网站或者APP可以处理大于4000个用户请求。如果要支持同时1万的请求,则需要5台apache服务器来支持,因此目前缺少6台web服务器。
升级服务器后的访问示意图
一次生产事故的优化经历

2、数据库解决方案
当前数据库的部署方案
一次生产事故的优化经历

1)主从分离解决主库80%的查询压力。目前平台官网、APP均连接mysql主库导致主库压力倍增,把服务中的查询全部迁移到从数据库可以大量减轻主库的压力。

2)增加缓存服务器。当从库查询到达峰值的时候,也会影响主从的同步,从而影响交易,因此对用户经常使用的查询进行缓存以达到减少数据库的请求压力。需要新增三台缓存服务器搭建redis集群。
一次生产事故的优化经历

3、其它优化
1)官网首页静态化,从cnzz统计来分析,首页占比网站的整体访问量的15%左右,对于首页不经常变动的数据通过静态化来处理,提升官网打开的流畅度。

2)apache服务器的优化,开启gzip压缩,配置合理的链接数等

3) 去掉投资过程中的更新热点:标的进度表。每次投标成功或者失败都需要对标的进度表进行更新,多线程更新的时候就会出现乐观锁等问题。去掉过程中的更新,只在满标后将标的进度信息保存在标的进度表,优化投资过程中对数据库的压力。

6 服务器升级方案

1、平台最大的压力来自于数据库,需要将现在的一主一从,改为一主四从。官网/app/小网页产生的大量查询,由虚IP分发到三台从库,后台管理查询走另外的一个从库。数据库需要新增三台服务器
数据库升级后的示意图
一次生产事故的优化经历

2、增加缓存减少数据的压力,需要新增两台大内存的缓存服务器
一次生产事故的优化经历

3、需要新增三台web服务器分解用户访问请求

app需要新增两台服务器
在抢标过程中app服务器压力最大,需要新增两台服务器,配置完成后的示意图
一次生产事故的优化经历

官网需要新增一台服务器
官网在抢标过程也有一定的压力,需要新增一条服务器,完成后示意图如下:
一次生产事故的优化经历

总合计之后需要购置8台服务器,其中有两台要求有大内存(64G以上)

点击下载优化报告word版本

备注:所有优化方案投产后,问题解决,抢标无忧!


作者:纯洁的微笑
出处:http://www.php.cn/
版权归作者所有,转载请注明出处

以上是一次生产事故的优化经历的详细内容。更多信息请关注PHP中文网其他相关文章!

本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover

AI Clothes Remover

用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

Video Face Swap

Video Face Swap

使用我们完全免费的人工智能换脸工具轻松在任何视频中换脸!

热工具

记事本++7.3.1

记事本++7.3.1

好用且免费的代码编辑器

SublimeText3汉化版

SublimeText3汉化版

中文版,非常好用

禅工作室 13.0.1

禅工作室 13.0.1

功能强大的PHP集成开发环境

Dreamweaver CS6

Dreamweaver CS6

视觉化网页开发工具

SublimeText3 Mac版

SublimeText3 Mac版

神级代码编辑软件(SublimeText3)

会话如何劫持工作,如何在PHP中减轻它? 会话如何劫持工作,如何在PHP中减轻它? Apr 06, 2025 am 12:02 AM

会话劫持可以通过以下步骤实现:1.获取会话ID,2.使用会话ID,3.保持会话活跃。在PHP中防范会话劫持的方法包括:1.使用session_regenerate_id()函数重新生成会话ID,2.通过数据库存储会话数据,3.确保所有会话数据通过HTTPS传输。

在PHP API中说明JSON Web令牌(JWT)及其用例。 在PHP API中说明JSON Web令牌(JWT)及其用例。 Apr 05, 2025 am 12:04 AM

JWT是一种基于JSON的开放标准,用于在各方之间安全地传输信息,主要用于身份验证和信息交换。1.JWT由Header、Payload和Signature三部分组成。2.JWT的工作原理包括生成JWT、验证JWT和解析Payload三个步骤。3.在PHP中使用JWT进行身份验证时,可以生成和验证JWT,并在高级用法中包含用户角色和权限信息。4.常见错误包括签名验证失败、令牌过期和Payload过大,调试技巧包括使用调试工具和日志记录。5.性能优化和最佳实践包括使用合适的签名算法、合理设置有效期、

描述扎实的原则及其如何应用于PHP的开发。 描述扎实的原则及其如何应用于PHP的开发。 Apr 03, 2025 am 12:04 AM

SOLID原则在PHP开发中的应用包括:1.单一职责原则(SRP):每个类只负责一个功能。2.开闭原则(OCP):通过扩展而非修改实现变化。3.里氏替换原则(LSP):子类可替换基类而不影响程序正确性。4.接口隔离原则(ISP):使用细粒度接口避免依赖不使用的方法。5.依赖倒置原则(DIP):高低层次模块都依赖于抽象,通过依赖注入实现。

在PHPStorm中如何进行CLI模式的调试? 在PHPStorm中如何进行CLI模式的调试? Apr 01, 2025 pm 02:57 PM

在PHPStorm中如何进行CLI模式的调试?在使用PHPStorm进行开发时,有时我们需要在命令行界面(CLI)模式下调试PHP�...

如何在系统重启后自动设置unixsocket的权限? 如何在系统重启后自动设置unixsocket的权限? Mar 31, 2025 pm 11:54 PM

如何在系统重启后自动设置unixsocket的权限每次系统重启后,我们都需要执行以下命令来修改unixsocket的权限:sudo...

解释PHP中的晚期静态绑定(静态::)。 解释PHP中的晚期静态绑定(静态::)。 Apr 03, 2025 am 12:04 AM

静态绑定(static::)在PHP中实现晚期静态绑定(LSB),允许在静态上下文中引用调用类而非定义类。1)解析过程在运行时进行,2)在继承关系中向上查找调用类,3)可能带来性能开销。

如何用PHP的cURL库发送包含JSON数据的POST请求? 如何用PHP的cURL库发送包含JSON数据的POST请求? Apr 01, 2025 pm 03:12 PM

使用PHP的cURL库发送JSON数据在PHP开发中,经常需要与外部API进行交互,其中一种常见的方式是使用cURL库发送POST�...

See all articles