星图导航
首页 文章 排行榜 申请收录 友链申请 关于
首页 / 文章资讯 / 网站运营 / 网站到底能扛多少并发:压测入门

网站到底能扛多少并发:压测入门

星图导航配图

站点上线之后,最怕的一种情况是:平时没人来,一切正常;某天被某个大号推了一下,流量涨十倍,站直接趴了。压测就是为了提前知道这条线在哪儿,别等真出事才明白。

压测到底在测什么

很多人以为压测是测“能扛多少人”,其实不是。它测的是在固定资源下,你的站点每秒能处理多少请求,以及超过这个量之后会发生什么。

会发生什么比能扛多少更重要。有的站超载之后变慢,用户等几秒还能打开;有的站直接 502,一个都进不来。前者是降级,后者是崩溃,两者体验差得远。

压测还能暴露隐藏的瓶颈。你以为瓶颈在 CPU,压出来发现在数据库连接数;你以为要加内存,压出来发现是磁盘 IO 打满了。

所以压测的产出不是“我的站能扛一千并发”这种结论,而是一张表:什么条件下、哪个指标先到顶、到顶之后页面变成什么样。

先压对地方,别压错对象

先搞清楚你的页面类型。纯静态页面的瓶颈在网络和 nginx,动态页面的瓶颈通常在数据库和 PHP 进程数。

一个页面里如果有一半请求是图片和 css,那压测重点应该是静态资源的并发能力。如果一个页面每次都要查数据库,重点就是 SQL 和连接池。

还要区分“读”和“写”。登录、提交表单这类写操作,压测方式和只读页面完全不一样,写操作还要考虑锁和事务。

别拿首页当唯一目标。首页往往有缓存,压起来数字很好看,实际用户点的详情页才是瓶颈所在。至少挑三个有代表性的地址一起压。

用什么工具,怎么装

ab 最简单,apache 自带的,一条命令就能跑,适合快速看个大概。缺点是功能少,不支持并发模型复杂的场景。

wrk 更现代,多线程加事件驱动,压高并发时资源占用低,能压出更高的数字。编译安装稍微麻烦一点,但值得。

siege 和 hey 也是常用选择,hey 用法最直观,一个 URL 加参数就完事,适合单接口测试。

我的建议是手上留两个:ab 用来快速验证,wrk 用来做正式测试。别装一堆,装了自己也记不住参数。

几个参数必须理解

并发数指的是同时保持多少个连接,不是每秒多少请求。很多人把这两个概念混着说,看报告的时候就会误判。

持续时间决定结果稳不稳。跑十秒的结果波动很大,跑一分钟以上才有参考价值。有条件跑三分钟。

请求间隔不要设为零以外的东西,除非你在模拟真实用户。真实用户不会连着点,但压测要看极限,就别加间隔。

还有超时设置。默认超时往往很长,压到后面一堆请求挂着不返回,统计出来的数字是假的。把超时设成两三秒,超过就算失败,数据才真实。

怎么读结果

先看每秒完成的请求数,这是吞吐量。再看平均响应时间,但平均没用,要看 P95 和 P99,也就是最慢的百分之五和百分之一的请求有多慢。

如果 P99 比平均高十倍,说明有部分请求被卡住了,通常是数据库慢查询或者锁等待。这个指标比平均值有价值得多。

再看失败率。失败率超过百分之一就要停下来查原因,是连接被打满还是 PHP 进程不够。

压测过程中同步盯着服务器:top 看 CPU、free 看内存、iostat 看磁盘、ss 看连接数。哪个先到顶,瓶颈就在哪。只看压测工具的报告,你只知道慢,不知道为什么慢。

压出来的数字怎么看

压测环境和生产环境往往不一样。你在本地压出来的数字,放到线上可能差好几倍,因为 CPU 核数、网络、磁盘都不同。

所以压测最好在接近生产的机器上做,或者干脆就在生产机上做但选在低峰期,并且严格控制时长。

还有一个陷阱:第一次压测的结果往往不准。冷缓存、首次编译、数据库还没预热,数字会偏低。跑两轮取第二轮的结果更可信。

压测的数字要留档。以后改代码、加功能,再压一次做对比,就知道这次改动是不是拖慢了性能。

压完之后要做什么

如果瓶颈在 PHP 进程数,去调 php-fpm 的 pm.max_children。这个值不是越大越好,开太多会吃光内存导致 OOM,按内存除以单进程占用来算。

如果瓶颈在数据库,先看慢查询日志,把没走索引的 SQL 补上索引。多数站点的数据库瓶颈都是缺索引,不是机器不够。

如果瓶颈在静态资源,上缓存或者 CDN。图片压缩、开启浏览器缓存、加一层 nginx 的 expires,这三样做完往往能提升一大截。

如果压测发现某个接口特别慢,优先优化它而不是加机器。加机器是最后的手段,优化代码才是根本。

最后,压测结论要落成一条线:在什么配置下、多少并发时、响应时间开始超过两秒。这条线就是你的容量上限,超过它就要提前扩容或者限流。

别在生产上乱压

压测本身是攻击行为,几百个并发打过去,服务器资源会被吃满,真实用户会受到直接影响。生产环境压测必须满足三个条件:低峰期、有人盯着、随时能停。

压测前先看一眼有没有防护。很多服务器装了防火墙或者云厂商的 DDoS 防护,压测流量可能被判成攻击,直接把你的 IP 封了。

压测脚本要能一键停。Ctrl C 是最基本的,但如果用分布式压测,得提前准备好停所有节点的办法。

还有,压测产生的日志会非常大,几百个并发跑一分钟可能就几百兆。压完记得清,不然磁盘被填满,反而把站搞挂了。