伏威谈淘宝网的高并发处理与压力测试

其实到现在为止距离淘宝双十一事件已经过去蛮多天了,但在整个技术圈里面大家还是津津乐道。我这次在采访之前在和一些网友做沟通的时候,他们也提出了非常多非常有意思的问题,包括一些高并发的,一些压力测试的等等,那我希望也代表这些网友和你做一个交流。那第一个问题就是,在那么大的访问量,淘宝的技术团队是如何做到一个高并发处理的?
对于高并发处理,简单来说呢,就是如何通过集群方式去并发处理用户的请求,那说复杂它是一个比较完整的体系,那可能我就没有办法一一的把它说全了。我可以从前往后给大家说几个点:

比如说我们的CDN,你如何把静态的图片,还有静态的JS文件和一些HTML文件放在用户最近的一个节点上让他去最快的访问?那当用户要去访问淘宝主站,要去做交易的时候,我们如何去平均的分他用户的请求,把他放到后台的应用机群里面去均衡的做处理?在这个过程中还有一个问题,你用户的登录状态你怎么去记录,那这个关键点你还要去把它处理。每一次去处理你请求的服务器可能是不一样的,它不可能记录你每个人的状态,那这时候状态处理如何去处理?那在应用机群内部呢,应用机群和服务之间,他如何去调度的?因为服务本身它也是一个机群,那你用应用机群和后端的服务机群之间,你如何均衡的处理它的访问请求?

还有服务器,就是你核心服务和数据库之间,还有这种之间分布式缓存之间,或者说分布式存储之间,和分布式数据库之间,是如何去交互的,平均的分摊压力的?这个就是从前到后的,它其实都有很多点去对应的做处理的。那对于处理这种高频发还有一个很关键的点,如何做到水平扩容,也是因为这一个点,你每次做一个系统的时候,你都是可以去做到的,只有你可以做到水平扩容,你才能在你流量大增的情况下,通过增加机器去解决问题,你没有办法做到水平共容的话,可能你当时增加机器已经没有用了,这时候只有等死了。
一个比较具体的问题就是像高并发访问页面数据,如果说实时更新的话,它应该是如何去做到实时的同步?
对于淘宝这种电子商务系统,除了我们的图片和一些JS文件,其他基本上都是动态数据。而这种数据呢,可能大家不相信,它的存储的语言和访问的语言是一样的。所以说我们根本就不需要说去做两个数据之间的同步,就是存储数据和访问数据同步式是不需要去做的。

那刚才我们之前提到过就是我们做的读写分离。那读写分离的话,它就是两个元素不在一起的。其实当时我们也是做了实时,但是这个实时上面是要打一个问号的,比如说我们可以在十毫秒、二十个毫秒,就保证我们两个数据机群之间的数据就同步了,那这样子,就保证了前端,他看到的这个数据就很快是一致的,就是基本上没有存在任何差别。

至于说我们数据库层面的读写分离如何去做呢?我也可以简单介绍一下,第一个层面应用就是你有时候数据可以同时写两份,或者通过消息去做异步的一个复制,或者甚至去做数据库本身日志的一个分析,因为我们对文本分析的成本和代价是最小的,而且准确率是最高的,当这个数据库它把它的日志存储下来以后,我们对它其分析发现那些数据发生变更了,就同步到另外一个机群里面去,这些手段都是可以去用的,那具体用那一个手段,要看你当时的整个应用的场景。
那我们来谈一谈就是一些关于压力集成测试的问题,很多网友他想了解一下在淘宝双十一事件之前,淘宝的整个技术支撑团队,有没有对网站做一些比较大的压力集成测试?
没有,因为很难,淘宝是不算是一个耦合性很弱的一个系统,它很难去做到说对整个系统去做一次大型的压力测试,因为这个测试只能当你有现实的访问请求你才知道的。设想一下,你要把整个淘宝复制一份,然后又要去模拟那么多用户真实的访问请求,这是很难做到的。但是我们自己有一些经验,比如说我们可以把每个系统独立开来,对他进行做性能测试,然后我们可以对整个核心系统去做分析。做分析什么?找到短板,然后对它的短板进行压测,然后通过这一系列的压测的结果来分析你整个系统的支撑量是多少,这其实就是由那个短板决定的。那你那个短板是什么?你一定要去发现。而对这种单个系统,你如何去模拟线上的压力,也是一个很重要的研究课题,比如说很简单一个道理,你用户中心要做压测,你怎么把它真实的现状压测出来?那我们的性能测试团队,就是经过了半年摸索,建立了这样的一套大型的系统压测模型。

我们可以做到什么程度呢?我们现在可以把数据库的缺陷点压测出来,把JVM的缺陷给压测出来,只要在线上高峰期可能出现的一些波段导致一些后台系统之间的一些BUG,我们现在基本上都可以模拟出来。那这个模拟就比较复杂了,包括成本和包括人力投入还是蛮大的,因为你要模仿线上的压力,你必须有线上的那批机器,硬件条件要是一样的,你系统部署要是一样的。几乎要尽可能去模拟真实的场景,这是一个方式,就是我们通过大型的一个性能压缩的模拟。还有一个模式是什么呢?

我们在线上做了一件事情,就是在交易非高峰期引流量,就是把几台机器的流量引到一台机器上,对这台机器进行大规模的压测,就是用线上真实的一个应用场景对他进行压测,这个也是可以做得,但是你一定要清楚它的风险在那里。因为你这样做如果出现问题的话,会导致部分用户的访问受损。但是我们尽量通过这种方式可以模拟出来一个不要在这个上面去追求极限数字,比如说现有的能力上,我们是不是能支撑200%的能力,只要到200%我们就觉得OK,这个压力测试是可行的,那我们就可以把这些就是释放掉了,就把它恢复原状,这样也可以做得。
经过这个压力测试,包括对数据库,对JVM,包括对操作系统,可能都会它们的缺陷给找出来,那么你们会针对这些缺陷会调整它们的系统参数吗?
肯定会的。因为就是包括JVM、你的 LINUX的内核,还有你数据库的MySQL,还有一些,第二方厂商或者第三方厂商,他们提供的一些应用服务,或者硬件,或者软件,其实都有参数的。但是什么参数是最优的呢?是你需要去探索的,那这也要依赖于我们的大型的性能压测的模型,只有在这个压测模型下,你每调整一个参数,它所起的作用,它产生的风险,它带来的好处才能体现出来。当你通过这种压测,你会找到配置是最优的一个均衡点,这时候这些配置才会定下来,在线上去实际的运营,去实践,然后如果发现问题,我们再通过压测再去做,它是一个这样的一个过程。所以说我看到有网友问到说,我们在就是双十一那天有没有去调整系统参数?没有的。我们就是要追求12个参数就是最优的,所以说我们是之前做的工作来保证双十一,如果说当时还要去调系统参数的话,那我觉得当时我们之前的工作是不到位的,我们工作没有做到平时。
其实在双十一事件之前,你们也做了很多的预案,当然对访问量也做了一些预估,有些人就想了解一下,如何对访问量做预估,能够让它的准确性更高。因为你准确性更高的话,这样你才能准备更多的机器包括一些存储设备来应付这样的情况?
我想我们的网友是想要知道,在双十一那天,淘宝能不能准确的预估到当天的流量是多少,就是带来的增量是多少。这是很难去预估的,因为我们很难预估我们的会员,他的整个购物热情能高涨到什么程度,但是我们可以做的是什么呢?因为我们根据历史数据,都知道整个系统的压力情况和压力的配比情况,那我们可以预估说,比如说我们系统压力增长50%,我们需要预留多少台机器给这个系统,我们增长100%的时候,我们要预留多少台机器给这个系统,我们会根据这个压力的情况去做预估。但双十一那天我们只预估了很少的一个量,幸好我们有刚好到了一批机器可以临时的去用,否则的话,当天风险也挺高的,但是还是撑住了,还挺好。
那么大的访问量有运用到一些像虚拟化技术或者云计算技术这样的一些技术吗?
虚拟化技术,现在我们所有的服务器,全是运行在虚拟机上的,就是我们一台实体机会被分割成三到四台虚拟机,在这个上面去就是搭建在这些系统。但是你说具体用到云,从我这个层面,我感觉还没有真正到云那个程度,就是我可以随时的去划分一部分服务,就是那个机器为这个服务去提供扩容等等,这个还是做不到,我们为了单台的系统,还是要去加机器,当然是加虚拟机了,把它应用上去,然后让它整个系统领域去扩充。

我觉得云计算和云服务是淘宝将来的一个未来,一个技术方向。但是我们能做到哪一步呢?这个只能期待了,在我们自己的观点里面,我们渴望,但不强求,因为你任何一个应用场景,任何一家公司都有你客观存在的现实情况,你只能根据这个现实,和你的业务等等来决定你的技术方向。但是我觉得淘宝有希望,因为淘宝有这么大的用户群体,有这么高的访问量,双十一中已经体现出来了,真的是震惊业界。
那面对这么高的访问量,淘宝技术团队是怎么来监控各个关键点压力的?就是如果说某一个节点上出现压力或者故障,如何去比较平滑的去切换处理?
这可能要从几个方向来说:

第一淘宝有一个监控中心,他会对包括网络流量,包括系统的压力情况,还有包括访问量等等,做一个监控,我们会设置预警点。这个预警的机制是江枫构建的,后面你会采访江枫,他可以给你们介绍一下。这是一个大的方面。

但是我们要求每个系统的服务团队,你的支撑团队必须要有自己的监控和预警的机制,你不能依赖于整体的那一个。因为只有你对自己的这个系统最了解的,只有你自己才知道它里面的细节和你能支撑的量是多大。那这时候我们要求你要做到心中有数,你要自己能够去监控个系统的压力,或者系统的访问量等等。我们甚至允许他自己就这个团队自己,去建自己的一套监控体系来做这个系统服务架构。如果你做不到,你这个团队是不到位的,你做的工作是不到位的。那现在我们每一个系统,都有自己这样一套体系,可能方法上或灵活一点,或笨拙一点,但他们都知道自己这个系统支撑量可以到什么程度。然后我们要求他们,当你的系统发生风险的时候,你一定要反馈回来,告诉我们整个的“战地指挥所”。

如果不是双十一你要汇报给你的Leader,然后你的Leader应该要配合你这个系统去做技术改造,让他可以支持更大的量,所以说他不是一个点去做监控的,他是多个点去做监控的,而且我们是要求全员负责的,你负责这个系统你就不要丢下负责人。然后至于说根据压力做一些水平的可能访问的一些流量等等,这些是会做的。但是还是那句话,工作要在平时。就是在平时,你能够支撑更大的量,就不用去做拆分,因为那个时候你去做的这种服务,就是那个切分,风险是很高的。所以说我们还是希望在你平时你本身就可以支撑那么大的量,当然你也需要去做一些预警的措施,或者说预案,当你超过这个量的情况下,你服务如何去降级。
我听过一些传言说,如果说这个交易再持续那么几分钟,那整个的系统可能就会出现问题,有没有这么回事?
这个问题不太准确,因为从我来说时间不是问题,当我们支撑过去的时候,你三十分钟,三个小时和三天是没有任何区别的,他是在量上区别。当我们这个在高峰期的交易量再上涨10%到20%,那可能我们真的就倒掉了。

所以说这也是我们那天比较庆幸的地方,没有朝那个量上去。但也不庆幸,就是我们还是希望看到交易量越高越好,但是如果说真的再涨10%到20%,周边合作的一些公司的系统,包括银行,包括支付宝,包括旺旺,以及淘宝的一些系统,可能都会崩溃掉,这个很正常。这个也是双十一给我们带来的冲击之一,打破了我们很多以前已有的经验。在原来当天超过200%、300%这种系统压力也是有希望的情况下,我可能我在设想明年是不是一天超过百分之四百,那可能明年我们整个预案也要为百分之四百、五百去做努力而准备,所以说那个问题不太准确,几分钟是垮不了的,但是再上涨10%到20%的那个流量和压力,我们这里就垮掉了。
整个实践来讲还是比较平滑的。那我们想了解一下,作为整个淘宝研发团队的负责人之一,在未来淘宝在做一些技术改造的时候,它应该沿着一种什么样的方向去走,有没有什么样的一种思路?
对淘宝自己来说,我们就希望保证整个交易的核心系统是稳定的,是可水平扩容的。基于这个交易核心系统的基础上,我们有一些更多的额外的服务,因为业务是多样化的,我们必须去支持这种业务多样化。

为了支持这种业务多样化,我们会增加很多很多的一些额外的系统,它是附属于核心系统的。那么在必要的情况下,这些核心系统是可以做剥离的,如果简单来说就是我们是不是可插拔。但是SOA可插拔概念又不太一样,因为这种可插拔可能会只是提供服务,做展示而已,它会更灵活,更直接。那在某种程度下在我们支撑下的交易组合性也是可行的。

另外一个方向就是之前我也提到过,现在我们单打独斗的时代已经结束了,就是我们的技术人员在做方案的时候,我们必须要预估到本身他的业务会给技术带来什么样的一个压力,而技术对后端、对网络有什么要求,技术对后端的存储有什么要求,他是要综合考虑的,就是他需要看得更广的一个范围,否则也没有办法为我们这个整个系统去提供服务。

我举一个很简单的例子,UIC,我们称之为用户中心,如果说你只是做好UIC应用本身,现在已经不行了。因为他包括后台的存储,你说和DBI的合作,还有和网络的合作,那这大家可能都不可预估是吧。我们在之前,就是在一个月两个月之前,我们做了一次Review,发现UIC应用服务器和缓存服务器之间它的一个路由器到瓶颈了,所以说你连这种网络拓扑图你都要知道。所以我们还是强调说你在做方案的整体性,单打独斗说实在真的结束了,我们就是要靠整体去取胜,这可能也算是技术方案的方向之一。因为这个问题的确比较难回答,因为它的范围太广,太细了,而且针对不同的团队,比如搜索团队,比如说我们的DB的存储团队,比如说我们应用团队,比如网络运围团队,他都有自己的方向,还是一个整体,可能真的是要看整体去做,但他们里面每一个人的每个部分的细节是不一样的,所以这个问题蛮难回答。
那总结一下就是核心系统要比较精巧,外围系统可以稍微复杂一点。但是另外就是非常讲究一个整体性的一个往前推进?
对,是的。
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 在socket epoll高并发项目中,我们可以使用以下方法来测试高并发性: 1. 压力测试:可以使用工具如Apache JMeter或wrk等进行压力测试,模拟多个并发请求发送到服务器。可以设置并发连接数和请求频率,观察服务器的响应时间和处理能力。 2. 性能测试:可以使用工具如Apache Bench或siege等进行性能测试,发送多个并发请求并记录服务器的响应时间、吞吐量等指标。可以通过调整并发连接数和请求的大小来测试服务器的性能极限。 3. 负载均衡测试:如果项目中使用了负载均衡器来分流请求,可以模拟多个并发请求发送到负载均衡器,观察负载均衡器的转发能力和服务器的响应时间。 4. 异常情况测试:可以模拟网络延迟、断连、异常数据等异常情况,观察服务器的容错能力和恢复能力。 5. 数据库测试:如果项目中有涉及数据库的操作,可以模拟并发读写请求,观察数据库的性能和并发处理能力。 6. 监控和分析:在测试过程中,可以使用监控工具来实时监测服务器的CPU、内存、网络等指标,以及检查是否有内存泄漏或资源泄漏等问题。 通过以上的测试方法和手段,我们可以评估高并发项目的性能和稳定性,找出性能瓶颈和优化空间,提高系统的并发处理能力。 ### 回答2: 在进行socket epoll高并发项目的测试时,可以采取以下几个步骤来测试高并发性: 1. 设计并发测试场景:根据项目的需求和设计,确定需要模拟的并发用户数、每个用户的请求频率和请求类型。可以使用工具如Apache JMeter或自行编写脚本来模拟并发请求。 2. 配置并发环境:在测试机器上进行并发测试,需要增加网络带宽、增加计算资源,比如使用高性能的服务器和网络设备,确保能够支持大量并发连接。 3. 编写测试程序:根据项目的需求,在测试程序中实现模拟并发请求的逻辑,通过socket epoll模型建立大量并发连接,并发送模拟请求进行测试。 4. 监控并发连接数和响应时间:使用系统工具如netstat、top等来监控服务器端的并发连接数和系统资源使用情况。同时,使用性能监控工具如zabbix、grafana等来监控服务器的吞吐量、响应时间等指标。 5. 数据验证和压力测试:在并发测试中,确保数据的一致性,对接收到的响应进行验证。并逐步增加并发连接数,直至达到系统的极限,观察系统响应时间的变化情况和可能出现的性能瓶颈。 6. 多样化的测试场景:在测试过程中,可以尝试不同的测试场景,如不同的请求类型、不同大小的数据包等,验证系统在各种情况下的高并发性能。 7. 异常处理:在测试中,需要注意处理一些异常情况,如客户端异常断开连接、网络异常等,确保系统对异常情况的处理能力。 通过以上步骤,可以对socket epoll高并发项目进行有效的测试,找出系统的性能瓶颈,及时进行优化和调整,提升系统的高并发性能。 ### 回答3: 在socket epoll高并发项目中,为了测试高并发性能,可以采取以下几种方式: 1. 压力测试工具:使用一些专业的压力测试工具,如JMeter、Apache Bench或wrk等,来模拟大量的并发请求。可以设置并发数、每秒请求数和总请求量等参数,对系统进行压力测试,观察系统在高并发情况下的性能表现。 2. 自动化测试脚本:编写自动化测试脚本,通过多线程或多进程进行模拟并发请求,向服务器发送大量的请求。可以使用Python的模块,如requests、multiprocessing等,实现并发请求的测试。 3. 网络负载生成工具:使用网络负载生成工具,比如Locust、Gatling等,来模拟真实的网络负载情况。可以设置请求频率、并发数和持续时间等参数,模拟多种场景下的高并发情况。 4. 并发性能监控工具:使用一些并发性能监控工具,如Grafana、Prometheus等,来监控系统的并发性能。通过收集CPU、内存、网络等指标数据,可以分析和评估系统在高并发场景下的性能瓶颈。 5. 随机性测试:在测试过程中,引入随机性因素,模拟真实场景下的随机请求。可以设计不同类型的请求和不同请求参数的组合,观察系统在随机请求下的并发性能表现。 需要注意的是,在进行高并发性能测试时,要合理设置测试参数,以真实场景为依据,同时监控系统各项指标,及时发现并解决性能瓶颈。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值