架构师训练营 第 7 周作业

用户头像
Glowry
关注
发布于: 2020 年 07 月 22 日
  1. 性能压测的时候,随着并发压力的增加,系统响应时间和吞吐量如何变化,为什么?

首先,需要知道 吞吐量、响应时间、并发数 三种的关系:

吞吐量=(1000 / 响应时间ms)* 并发数



随着并发数(并发用户数)的增加,响应时间会经历三个阶段:

  • 最佳运行区间:这个阶段的系统资源充足,这时候并发压力的增加对响应时间基本不影响,系统响应时间最快,系统性能最好;

  • 随着并发压力的增加,到达系统最大负载点c,系统资源达到临界点,CPU的能力趋于饱和,从该点开始,响应时间随着并发压力的增大而明显增长,系统性能迅速下降;

  • 当并发压力到达系统崩溃点d时,系统资源耗尽,机器很有可能已宕机,性能将失去响应,响应时间无限大





  1. 用你熟悉的编程语言写一个web性能压测工具,输入参数:URL,请求总数,并发数。输出参数:平均响应时间,95%响应时间。用这个工具以10、100并发测试www.baidu.com。



import P from 'bluebird'
import { request } from 'urllib'
import { Histogram } from 'measured-core'
import minimist from 'minimist'
import assert from 'assert'
const argv = minimist(process.argv.slice(2))
const histogram = new Histogram()
class Benchmark {
private total = argv.n
private url = argv.u
public async exec(concurrency) {
histogram.reset()
await P.map(
Array(this.total).fill(0),
async () => {
const start = Date.now()
await request(this.url)
histogram.update(Date.now() - start)
},
{ concurrency }
)
const metrics = histogram.toJSON()
console.log(`mean: ${metrics.mean}ms, p95: ${metrics.p95}ms`)
}
}
async function main() {
assert(argv.c && argv.u && argv.n, `node index.ts -n 1000 -u 'https://test.com' -c 10`)
await new Benchmark().exec(argv.c)
}
main().then(() => {
process.exit(0)
})



运行:
  • 并发10

TSNODEFILES=true node -r ts-node/register benchmark/index.ts -n 1000 -u 'https://www.baidu.com' -c 10

  • 并发100

TSNODEFILES=true node -r ts-node/register benchmark/index.ts -n 1000 -u 'https://www.baidu.com' -c 100



压测结果:
  • 并发10

mean: 52.95ms

p95: 82.94999999999999ms



  • 并发100

mean: 367.64ms

p95: 509.95ms



用户头像

Glowry

关注

还未添加个人签名 2019.02.13 加入

还未添加个人简介

评论

发布
暂无评论
架构师训练营 第7周作业