← 返回全栈资料库

📊 生产数据概念

QPS / TPS / RT / 并发量 / 带宽 / 数据量 —— 这些数字到底多大才算正常?面试问你系统多大规模,你需要有概念

QPS / TPS(每秒处理多少请求)
什么是 QPS / TPS
QPS(Queries Per Second)= 每秒处理多少个请求。
TPS(Transactions Per Second)= 每秒处理多少个事务(一个事务可能包含多个请求)。
面试一般问 QPS。回答时用 QPS 即可。
不同业务规模的 QPS 参考
系统类型日常 QPS峰值 QPS什么概念
个人博客/官网10~50200一秒钟十几个人在看,小网站
企业内部系统50~200500公司几百人用的 OA/CRM/审批系统
中型电商/APP500~20005000日活几十万的APP,有用户在浏览下单
大型电商(京东/淘宝级)5000~2000010万+双11秒杀级别,万级并发
国民级应用(微信/抖音)10万+百万级亿级日活,超高并发
一台服务器能扛多少 QPS
场景单机QPS参考瓶颈在哪
纯静态接口(Nginx直接返回)5万~10万网卡带宽
简单查询(Redis 直接返回)5万~10万Redis 单线程瓶颈
读DB(有索引,单表查询)1000~3000DB 连接数 / 索引效率
写DB(INSERT/UPDATE)500~1500DB 锁 / IO
复杂业务(调多个服务+DB+Redis)200~800下游依赖RT累加
秒杀场景(极端写压力)100~500DB 写锁 + 库存竞争
面试怎么说:「我们的合规系统日常 QPS 约 200~500,大促时峰值 2000 左右。用 4 台 4C8G 的机器扛,单机 QPS 约 500。瓶颈在 MySQL 查询,加了 Redis 缓存后 DB 压力降了 70%。」
RT / 响应时间(接口要多快)
用户能接受的响应时间
RT 范围用户感受常见场景
< 100ms极快,感觉不到延迟Redis 查询、静态资源
100~300ms流畅有索引的 DB 查询、缓存命中
300~500ms正常,可接受复杂业务(多表JOIN+聚合)
500ms~1s有点慢,用户会注意报表导出、大数据量查询
1~3s慢,用户会不耐烦需要优化了
> 3s超时,用户离开严重问题,必须修
P50 / P95 / P99 是什么意思
面试说接口 RT 不能只说平均值,要说分位值
P50(中位数)= 50% 的请求在这个时间内完成。
P95 = 95% 的请求在这个时间内完成(有 5% 比这慢)。
P99 = 99% 的请求在这个时间内完成(有 1% 比这慢,这些是长尾请求)。

为什么要看 P99:平均值会被大量快请求拉低。比如 99 个请求 50ms + 1 个请求 5s,平均才 100ms 看起来不错,但那 1 个用户等了 5 秒。P99 会暴露这个长尾问题。
指标参考值含义
P50< 100ms大部分用户体验流畅
P95< 300ms95% 用户正常
P99< 500ms99% 用户正常(1% 长尾可容忍)
超时阈值3s超过 3s 直接超时返回失败
面试怎么说:「我们接口 P50 大约 80ms,P95 约 200ms,P99 偶尔到 500ms。P99 长尾主要是偶尔有慢SQL,加了索引和 Redis 缓存后好了很多。」
并发量(同时在处理的请求数)
QPS 和并发量的关系
并发量 = QPS × RT(秒)
举例:QPS = 1000,RT = 0.2s → 并发量 = 1000 × 0.2 = 200
意思是:同一时刻有 200 个请求正在被处理。

反推:如果你的服务器并发能力是 200,RT = 0.2s → 能扛 QPS = 200 / 0.2 = 1000
不同层级的并发能力参考
组件能扛并发怎么提升
Nginx5万~10万worker_processes + worker_connections
Redis10万 QPS单线程,靠纯内存+IO多路复用
MySQL1000~5000 QPS(读写分离后更高)连接池 / 索引 / 读写分离
Tomcat默认200线程 → 约200~1000并发server.tomcat.threads.max=500
Java 应用取决于线程池+DB连接池+下游RT线程池调优 / 异步化
关键认知:并发能力不是无限提升的。线程太多 → CPU 上下文切换开销大 → 反而更慢。找到最优线程数(CPU密集型=N+1,IO密集型=2N~10N)比盲目加大更重要。
容量估算(系统设计面试必考)
面试官问"你的系统多大规模",你怎么算
从用户量推 QPS 的公式:
步骤公式举例(日活100万的APP)
日活用户已知100万
每日请求总量日活 × 每人每天请求次数100万 × 50 = 5000万次/天
日均QPS每日请求 / 86400秒5000万 / 86400 ≈ 580 QPS
峰值QPS日均QPS × 3~10倍(看业务,秒杀可能100倍)580 × 5 ≈ 2900 QPS
需要多少台机器峰值QPS / 单机QPS2900 / 500 ≈ 6台(加2台冗余 = 8台)
存储量估算
数据类型单条大小每日增量一年存储
用户数据1KB新增1万用户 = 10MB3.6GB
订单数据2KB10万订单 = 200MB72GB
操作日志500B1000万条 = 5GB1.8TB → 考虑冷热分离
图片(头像/商品图)200KB1万张 = 2GB730GB → 上OSS
带宽(网络要多大)
带宽和数据量的换算
带宽实际速度什么概念
1 Mbps128 KB/s下载一个 1MB 图片要 8 秒
10 Mbps1.25 MB/s小网站最低配置
100 Mbps12.5 MB/s中型应用标准配置
1 Gbps(千兆)125 MB/s大型应用 / 内网服务器
10 Gbps(万兆)1250 MB/s数据中心内网互联
注意单位:带宽说 Mbps(兆比特),下载速度说 MB/s(兆字节)。1 Byte = 8 bit → 100M带宽的实际下载速度约 12.5MB/s(除以8)。
带宽够不够怎么算
QPS = 1000,每个请求返回数据 10KB →
每秒传输 = 1000 × 10KB = 10MB/s → 需要 100Mbps 带宽(10MB × 8 = 80Mbps)

图片/视频是带宽杀手。一张高清图 500KB,100人同时看 → 50MB/s → 需要 500Mbps 带宽。所以图片走CDN,不占服务器带宽。
数据库相关数据
MySQL 性能参考值
指标参考值说明
单表行数建议<2000万超过后B+树索引变高,查询变慢
单表存储建议<10GB超过考虑分表
连接池大小20~200HikariCP 默认10,生产建议50~100
慢查询阈值>1秒超过1秒就该优化(加索引/改SQL)
单机QPS(读)3000~5000有索引的简单查询
单机QPS(写)500~1500INSERT/UPDATE,受锁影响
读写分离后QPS1万~3万1主3从,读分到从库
Redis 性能参考值
指标参考值说明
单机QPS8万~10万单线程,纯内存,IO多路复用
单Key大小建议<10KB太大阻塞其他操作
单实例内存建议<10GB太大 → RDB/AOF 持久化慢 → fork 卡
缓存命中率>95%低于95%说明缓存设计有问题
过期时间加随机抖动同时过期 → 缓存雪崩
JVM 相关数据
指标参考值说明
堆内存(4C8G机器)Xmx=4G~5G留2~3G给OS+堆外+元空间
堆内存(8C16G机器)Xmx=8G~12G超过12G GC停顿明显
Young GC 频率每秒几次~几十次正常YGC 很快(几ms),频繁也没事
Full GC 频率不应该频繁出现几小时一次还行,几分钟一次就有问题
Full GC 停顿<200ms(G1)超过500ms用户能感知到卡
线程数200~500超过1000要排查是否有线程泄漏
线程池大小CPU密集=N+1 / IO密集=2NN=CPU核数
一张表记住所有关键数字
指标记住这个数一句话
Redis QPS10万单机Redis能扛10万QPS
MySQL QPS3000读/1000写读写分离后能到1万+
MySQL单表2000万行/10GB超过考虑分表
Java单机QPS500~1000复杂业务,简单查询更高
接口RTP99<500ms超过1s就该优化
峰值QPS日均×5~10秒杀场景×100
堆内存机器内存的60~70%留余量给OS
Full GC几小时一次几分钟一次=有问题
缓存命中率>95%低于说明缓存设计有问题
连接池50~100HikariCP默认10太小
面试怎么说:「我们的合规系统日活约5万,日常QPS约300,峰值约1500。4台4C8G应用机器 + 1主2从MySQL + 3节点Redis集群。接口P50约80ms、P99约300ms。缓存命中率97%。MySQL单表最大约800万行,还没到分表的程度。」

不用编造,但要对数字有概念。面试官问"你的系统能扛多少QPS",你能答出量级(几百/几千/几万)就够了。
压测(压力测试)
什么时候需要压测
场景为什么要压什么时候做
大促/秒杀前预估能不能扛住峰值流量活动前1~2周
新系统上线前验证系统在预期负载下的表现上线前
性能优化后验证加了缓存/改了SQL,效果到底多少优化完立即压
扩容评估需要多少台机器才能扛目标QPS容量规划时
定位瓶颈系统先撑不住的是CPU/内存/DB/带宽哪个发现问题但不知道卡哪
压测压什么(4种类型)
类型怎么压验证什么参考指标
基准测试单接口,低并发(1~10),跑稳定后看RT这个接口的"底子"有多快RT应该是最快的(几ms~几十ms)
负载测试逐步加并发(10→100→500→1000),看什么时候开始变慢找到系统的拐点(QPS到多少开始RT飙升)RT从50ms涨到200ms的那个点
压力测试直接打超过预期的并发,看系统什么时候崩系统的极限在哪、崩了怎么恢复错误率从0%变成1%的那个点
稳定性测试中等并发长时间跑(几小时~几天)有没有内存泄漏、连接泄漏、性能衰减RT和内存应该稳定不涨
压测工具
工具适合场景难度
JMeter最通用,HTTP/数据库/MQ都能压,有GUI中(需要写测试计划)
Wrk / Ab命令行快速压一个HTTP接口低(一行命令搞定)
Gatling代码写压测脚本,报告漂亮,适合CI集成高(要写Scala/Java)
全链路压测阿里造的概念,模拟真实用户从入口到DB的全链路极高(需要影子库+流量录制)
# wrk 快速压测示例:100并发,持续30秒
wrk -t4 -c100 -d30s http://localhost:8080/api/orders?page=1&size=20

# 输出示例:
# Requests/sec:  1247.53   ← QPS约1247
# Latency:       78.32ms   ← 平均RT 78ms
#   50%:   65ms
#   90%:   120ms
#   99%:   340ms          ← P99 340ms
# Non-2xx or 3xx responses: 0  ← 错误率0%
压测结果怎么看(面试常问"你怎么判断系统扛得住")
指标怎么看达标标准
QPS压测工具输出的 Requests/sec≥ 预估峰值QPS的1.5倍(留余量)
RT(P99)压测工具输出的延迟分位P99 < 500ms(或业务要求值)
错误率非2xx响应占比0%(出现错误说明到极限了)
CPU使用率压测时看监控(top / Grafana)< 70%(超过说明到瓶颈了)
内存压测时看 Heap 曲线稳定不持续涨(涨=泄漏)
DB连接数看 MySQL SHOW PROCESSLIST 或监控< 连接池最大值的80%
DB慢查询压测时看慢查询日志不应该大量出现(有就优化)
面试怎么说:「大促前我们做了全链路压测,目标QPS 3000。结果在2000 QPS时MySQL CPU到85%、P99到600ms。定位到是订单查询没走索引,加了联合索引+Redis缓存后,3000 QPS下P99降到200ms,MySQL CPU降到60%。最终留了50%余量上线。」
数据库性能拐点(多少数据开始变慢)
MySQL 单表性能拐点
数据量性能表现要做什么
< 100万行正常,有索引查询<10ms不用管
100~500万行基本正常,偶尔慢查询检查索引是否合理,优化慢SQL
500~2000万行复杂查询开始变慢,大表DDL卡归档历史数据 / 加缓存 / 预估是否要分表
2000~5000万行明显变慢,索引也可能慢,DDL几个小时考虑分表(按时间/用户ID拆)
> 5000万行几乎所有操作都慢,运维痛苦必须分库分表
为什么是2000万?B+树索引3层能存约2000万行(每页16KB,非叶子节点存指针,叶子存数据)。超过2000万后B+树变成4层,多一次磁盘IO,查询明显变慢。2000万不是绝对值(行宽大的表可能500万就慢),但作为经验参考。
什么操作会让数据库变慢
操作为什么慢什么时候触发怎么解决
没索引的查询全表扫描,逐行比对WHERE条件字段没建索引加索引
大分页(LIMIT 100万,10)要扫描前100万行再丢弃列表页翻到很后面游标分页(WHERE id > last_id)
SELECT *读取不需要的列+无法用覆盖索引图省事写SELECT *只查需要的列
N+1查询循环里每次查一次DB遍历列表时关联查详情JOIN / 批量IN查询
大表DDL(ALTER TABLE)要锁表重建,几百万行卡几分钟加字段/改字段类型用pt-online-schema-change(不锁表)
大事务持锁时间长,阻塞其他事务批量更新没有分批拆小事务(每批1000条)
LIKE '%关键词%'左模糊无法走索引搜索功能用ES做全文搜索
ORDER BY + LIMIT大偏移要排序大量数据再取几条排行榜/最新列表用Redis ZSet做排行榜
怎么判断数据库该优化了
信号说明参考阈值
慢查询数突然增多慢查询日志里 >1秒的SQL数量上涨每天 >100条慢查询就该查
DB CPU 持续偏高Grafana看MySQL CPU曲线持续 >70%不回落
连接池经常打满应用报"Could not get JDBC Connection"活跃连接数 = 连接池最大值
接口RT和DB有关联变慢APM链路追踪里DB段耗时占比大DB段 > 总RT的50%
InnoDB行锁等待SHOW ENGINE INNODB STATUS 有大量锁等待lock_wait >0 且频繁
磁盘IO打满iostat看 %util%util持续 >80%
生产观测指标(面试官爱问"你怎么知道系统健不健康")
日常巡检看什么(每天扫一眼)
指标正常值告警值说明
QPS日常波动范围内突然飙升3倍或跌到0飙升=被刷/被攻击/bug,跌到0=挂了
错误率<0.1%>1%突然升高=有bug或下游挂了
P99 RT<300ms>1s变慢=GC/DB/下游慢
CPU使用率30~60%>80%持续5分钟高=流量大/GC/死循环
内存使用率40~70%>85%高=泄漏/OOM前兆
Full GC几小时一次1分钟内 >3次频繁=内存不够/泄漏
DB连接数<连接池80%= 连接池最大值打满=慢SQL/大事务/连接泄漏
Redis内存<maxmemory 80%>90%高=需要扩容或清理
Redis命中率>95%<90%掉=缓存设计有问题/key过期了
磁盘使用率<70%>85%高=日志/数据需要清理
MQ积压量接近0(消费跟上)>1万条持续不降积压=消费者挂了/处理太慢
连通性测试(接口探活)
除了业务指标,还要监控基础设施是否通
检测项怎么检测多久检测一次
HTTP接口探活GET /health 返回200每10~30秒
DB连通性SELECT 1(最简单的SQL能跑通)每30秒
Redis连通性PING → PONG每30秒
下游服务连通性调下游的/health接口每30秒
外部API连通性调第三方/health或ping每1分钟
证书是否过期检查HTTPS证书到期时间每天
面试怎么说:「我们用 Prometheus+Grafana 看日常指标,关键指标(QPS/错误率/P99/CPU/DB连接数)配了钉钉告警。健康检查接口 /health 检测 DB+Redis+下游连通性,K8s 每10秒探活,失败3次自动重启Pod。」
全链路测试
什么是全链路测试
不是只压一个接口,而是模拟真实用户从入口到最终结果的完整路径。比如电商:浏览商品 → 加购物车 → 下单 → 支付 → 查看订单。每一步都走通才算成功。
测试类型验证什么什么时候做
全链路功能测试用户从入口到完成操作,每一步都能走通每次发版前
全链路压测高并发下整条链路是否扛得住(哪个环节先撑不住)大促前
全链路回归改了A模块,B/C/D模块不受影响发版前
故障注入(混沌工程)故意杀掉一个服务/DB,看链路是否能降级不死稳定性演练
全链路压测的难点
难点说明怎么解决
压测数据不能污染生产压测产生的订单不能混进真实订单压测数据打标(标记压测请求)+ 影子库/影子表
第三方接口不能真调不能真的调支付/短信Mock 或挡板(返回假数据)
链路太长不好编排10个服务的调用链,手动编排很痛苦录制真实流量回放(流量录制+回放)
瓶颈定位难慢了不知道卡在哪个服务全链路APM(SkyWalking traceId串联)
生产数据概念 · QPS/RT/并发/容量/带宽/压测/DB拐点/观测指标 · 全栈资料库