当前位置: 首页 > news >正文

系统设计基本功:流量与存储需求估算

欢迎来到啾啾的博客🐱。
记录学习点滴。分享工作思考和实用技巧,偶尔也分享一些杂谈💬。
有很多很多不足的地方,欢迎评论交流,感谢您的阅读和评论😄。

目录

  • 引言
  • 一、如何估算系统流量?
    • 经典练习
    • 估算小技巧
  • 二、估算对应的服务器需求
    • 使用QPS估算服务器配置
      • 服务器CPU
        • 数据库服务器
      • 内存估算
    • 估算存储需求

引言

总所周知,没有评估就没有调优,而没有标准就不能评估。

系统最基础的估算就是流量估算与存储需求。

流量估算有以下三种统计指标:

  • 每秒事务数-TPS (Transaction per Second)
    TPS是衡量信息系统吞吐量的最终标准。每秒钟原子操作的次数。
  • 每秒请求数-HPS (Hit per Second)
    HPS从指客户端发向服务端的请求数,client->server的次数。
    不等同于web点击数,一个web点击可能向server发送多个请求。
  • 每秒查询数-QPS (Query per Second)
    QPS是指一台服务器能够响应的查询次数。

存储需求则一般与流量紧密结合。

资料引用:《搞定系统设计》

一、如何估算系统流量?

经典练习

一个经典的练习,假设:

  • 推特有3亿月活用户。
  • 50%的用户每天都使用推特。
  • 用户平均每天发两条推文。
  • 10%的推文包含多媒体数据。
  • 数据要存储5年。

要怎么估算发贴模块QPS与存储需求?

估算QPS

  • 每日活跃用户(DAU)=300000000 x 50% = 1.5亿
  • 推文QPS=150000000 x 2 / 24小时 / 3600 秒 ≈ 3500
  • 峰值QPS=2 x 推文QPS ≈ 7000

估算存储需求

  • 平均推文大小:

    • tweet_id:64字节
    • 文本:140字节
    • 多媒体文件:1MB
  • 多媒体数据存储量=150000000 x 2 x 10% x 1MB = 30TB/天

  • 五年的多媒体数据存储量 = 30TB x 365 x5 ≈ 55PB

一般来说QPS是<=TPS的,还是以推文QPS为例。
用户发推文=发推文+更新后台数据+其他…
此时 TPS ≈ 2 x QPS。

用户发推文需要点击一下,此时
HPS = QPS

估算小技巧

估算是一个大致的操作。只需要依据行为抽象、大致存储大小进行大致估算就可以了。
比如大小没必要真的按照1024去计算,1000也是可以的。

二、估算对应的服务器需求

  • 基础(技术栈)
    以主流的Linux系统为基础进行估算,在Java21之前,我们的Java线程和操作系统内核线程是**一对一模型(1:1 Threading)。

  • 性能基准: 在估算前,最理想的情况是通过压力测试获取API的基础信息,如果无法测试,则需要基于经验做出明确的假设

    • 单次请求平均CPU消耗时间。
    • 单次请求平均内存消耗。
    • 数据库交互模式(读写次数、事务复杂度等)。

使用QPS估算服务器配置

服务器CPU

主要是需要考虑服务器CPU和内存配置。考虑CPU需要先辨别任务类型,是计算密集型还是I/O密集型。
所以我们的线程可能处于运行中、就绪、阻塞/等待,这些状态中的一种。即我们的线程大部分时间不会在CPU上运行。
这里假设我们的CPU有一个核心,其可能同时在处理10个请求,然后10个请求都在1S后完成。
所以,使用QPS计算CPU要注意,QPS≠CPU核数。

在上面的例子中,服务器需满足峰值 7000QPS,并留有冗余(如 20%-50%)以应对突发流量。
多数的请求和发推文一样,不是存储的CPU计算,中间有等待网络、数据库、磁盘等操作。

计算公式如下:
CPU核数 = (QPS * 平均单次请求的CPU消耗时间) / 单核CPU的目标使用率。
假设平均单次请求的CPU消耗时间为0.1s,单核CPU目标使用率为70%。
那么满足7000QPS的配置为 7000 x 0.1 /0.7=1000

7000QPS需要1000核。

数据库服务器

数据库服务器主要考虑连接数与处理能力。在分布式架构中还需要考虑主从架构读写分离模式,需要将请求读写分离做计算。

  • 处理能力(TPS):由服务器的CPU、内存、磁盘I/O性能和数据库自身的优化水平决定。这是它的“内功”。
  • 最大连接数(max_connections):是数据库配置的一个参数,它规定了“最多能有多少个客户端同时连着我”。这更像是一个资源限制,防止连接过多耗尽内存。
  1. 确定总TPS和读写比例:
    • 总TPS = 14,000 (假设为QPS的两倍)
    • 假设读写比为 10:1 (互联网常见场景)
    • 写TPS = 14,000 / 11 ≈ 1270
    • 读TPS = 14,000 * 10 / 11 ≈ 12730
  2. 评估单机能力并计算所需服务器数:
    • 主库(写): 写操作通常压力最大,且由单台主库处理。假设一台高性能的数据库服务器(高主频CPU、NVMe SSD)可以稳定处理 2000 写TPS
      • 所需主库数量: 1270 / 2000 = 0.635 -> 1 台主库 (足够)
    • 从库(读): 读操作可以通过增加从库来水平扩展。假设一台从库服务器可以处理 5000 读TPS
      • 所需从库数量: 12730 / 5000 = 2.54 -> 3 台从库

在我们的例子中,7000QPS对应14000TPS,都是写请求。数据库服务器可以处理3500TPS,那么我们最终需要4台数据库写服务器。

内存估算

没什么好说的。
内存=(基础内存 + QPS * 内存/请求) * 冗余

估算存储需求

主要考虑存储方式与多媒体带宽。

小的结构化的数据可以使用关系型数据库如MySQL进行安全存储,保证事务和一致性。
需要支持大数据量统计的,可以使用列式存储数据库。

使用集群进行数据安全冗余。

  • 存储I/O
    还是以前面的7000QPS峰值计算,每个请求带1MB文件,那么每秒要上传7000MB文件。
    一般分布式存储多节点并行写入,需要副本保障安全,实际带宽可能要 x3。

相关文章:

  • 力扣HOT100之堆:295. 数据流的中位数
  • Django项目QQ授权登录报错:redirect uri is illegal(100010) 解决方法
  • Android WebView 深色模式适配方案总结
  • P2842 纸币问题 1
  • java复习 08
  • 企业如何科学的选择WMS仓储管理系统
  • 【Python打卡Day33】简单神经网络@浙大疏锦行
  • 多模态大语言模型arxiv论文略读(116)
  • 知识图谱和图数据库Neo4j
  • ETLCloud中数据生成规则使用技巧
  • DDoS攻防实战:从应急脚本到AI云防护系统
  • 系统入侵排查实战指南:从Windows到Linux的应急响应与溯源分析​
  • 6.10【Q】网络安全期末复习
  • Mac电脑 SSH客户端 - Termius
  • 【电路物联网】SDN架构与工作原理介绍
  • leetcode 135. 分发糖果
  • 由编译osgEarth源码引发的一系列问题(三)利用vcpkg安装osg与OSGEarth
  • Spring Boot 完整教程 - 从入门到精通(全面版)
  • Seaborn入门到上头:让数据可视化变成享受的艺术(附防秃指南)
  • 在WordPress中彻底关闭生成缩略图的方法
  • 做网站开发学什么内容/360优化大师最新版的功能
  • 福州电子商务网站建设/seo网上培训多少钱
  • 在什么网站做兼职翻译/做个公司网站大概多少钱
  • 怎样做网站关键字/统计网站访问量
  • 网站开发网站设计素材/大数据营销名词解释
  • 网站做打鱼游戏挣钱吗/自己怎么做网站