系统容量估计

容量预估往往也是系统架构设计的关键步骤。容量(流量带宽、并发量、数据量)设计是架构师必备的技能之一

指标说明

QPS

Queries Per Second意思是每秒查询率,每秒能够响应的查询次数,注意这里的查询是指用户发出请求到服务器做出响应成功的次数

原理:每天80%的访问集中在20%的时间里,这20%时间叫做峰值时间。

公式:( 总PV数 * 80% ) / ( 每天秒数 * 20% ) = 峰值时间每秒请求数(QPS) 。

TPS

Transactions Per Second 的缩写,每秒处理的事务数。一个事务是指一个客户机向服务器发送请求然后服务器做出反应的过程。

客户机在发送请求时开始计时,收到服务器响应后结束计时,以此来计算使用的时间和完成的事务个数。

区别

  • 针对单接口而言,TPS可以认为是等价于QPS的,

  • 比如访问一个页面/index.html,是一个TPS(因为客户机只是主动发了一次请求),而访问/index.html页面可能请求了3次服务器比如css、js、index接口,产生了3个QPS。

带宽

举个例子,你的网络都是基于 100M 带宽标准搭建的。那么此时如果每一秒会产生 10240 次数据传输,平均每个数据包大小是 10KB,我们来看下是否会遇到瓶颈。

100M 带宽的理论传输速率是 12.5MB/ 秒。那么现在每一秒需要传输:10240 次 / 秒 * 10KB = 100MB/ 秒。很明显,带宽远远不够了。

网站带宽= PV / 统计时间(换算到S)平均页面大小(单位KB) 8s

1B(字节)=8b(位)

PV/UV

PV(Page View): 页面访问量,即页面浏览量或点击量,用户每次刷新即被计算一次

UV(Unique Visitor): 独立访客,统计1天内访问某站点的用户数(以cookie为依据,如同一个用户)

  • PV 统计:nginx日志,一般是对所有访问日志数量,进行求和统计
  • UV 统计:nginx日志,对remote_addr进行统计,排除remote_addr重复值,进行求和统计。

场景模拟

  • 100万人,平均每人80次请求,返回5MB静态资源,阅读速率50%,5小时内
  • 假设只有50%人阅读内容

静态资源

\[总流量: 100万\ast80\ast5MB\ast50\%\approx199.7TB\]

数据库压力

\[数据量: 100万\ast80\]

假设每条数据1KB

\[\mathrm{数据总量}:8000万\;\ast1KB=76.29GB\]

5个小时数据8000万,峰值要写入4444条/秒 ,mysql单点压力太大

API接口访问压力

峰值是均值10~20倍

\[\mathrm{并发量/TPS}:\;100万\ast80\ast50\%/(3600秒\ast5\mathrm{小时})\approx2222人/秒\]

假设请求+响应约等于3KB

\[\mathrm{带宽}:8000万\;\ast3KB\approx6.5MB\]

不同API带宽峰值叠加

假设机器抗2000TPS

\[\mathrm{需要机器台数}:\;总TPS\;\ast\;(\mathrm{每台机子}TPS\ast80\%\mathrm{冗余})\]

带宽压力

\[\mathrm{静态资源带宽均值预估}:\;2222人/秒\;\ast\;5MB\approx10.8GB\]

一般带宽峰值是均值10~20倍

优化

  • 请求收发报文压缩,调整服务器带宽
  • 调整业务逻辑,异步,分表分库,集群
  • 静态资源使用CDN,不要占用服务器带宽
  • 数据存储分级,减轻底层数据库压力