写点什么

第七周作业总结

用户头像
于江水
关注
发布于: 2020 年 07 月 15 日

作业

#!/usr/bin/env node
const program = require('commander');
const axios = require('axios');
program
.option('--url, <value>', 'url')
.option('--con, <value>', 'concurrence')
.option('--number, <value>', 'total number');
program.parse(process.argv);
function SimpleQueue() {
let queue = [];
let currentJobs = [];
return {
push: item => {
queue.push(item);
},
start: (con, handler, done) => {
function run() {
if (!queue.length && !currentJobs.length) {
done();
} else if (currentJobs.length < con) {
if (queue.length) {
for (let i = 0; i < con - currentJobs.length; i++) {
currentJobs.push(queue.shift());
}
}
currentJobs
.filter(item => !!item)
.filter(item => {
return !item.__started;
})
.forEach((item, index) => {
item.__started = true;
handler(item).then(() => {
currentJobs.splice(index, 1);
run();
});
});
}
}
run();
},
};
}
const queue = SimpleQueue();
const con = parseInt(program.con);
const number = parseInt(program.number);
for (let i = 0; i < number; i++) {
queue.push({
url: program.url,
});
}
let results = [];
queue.start(
con,
item => {
const currentTime = Date.now();
return axios
.get(item.url)
.then(() => {
results.push(Date.now() - currentTime);
})
.catch(err => {
console.log('err');
});
},
() => {
console.log('done', results);
console.log(
'AVG: ',
results.reduce((acc, cur) => {
return acc + cur;
}, 0) / number
);
console.log('95:', results.sort()[94]);
}
);



使用命令:node index.js --url https://baidu.com/ --con 10 --number 100

学习总结

性能优化的前提是先做性能测试,建立基线,之后才可以得知问题所在进行优化。

性能测试

性能测试关注指标

  • 响应时间:从请求发出到最后响应数据收到所需要的时间。

  • 并发数:系统能同时处理请求的数字,相当于同时提交请求的用户数目。

  • 吞吐量:单位时间内系统处理的请求数量。请求数/秒 或者 页面数/秒。TPS、QPS 、HPS(每秒 HTTP 请求数量)。关系:吞吐量 =(1000/响应时间ms)* 并发数

  • 辅助指标:System Load、线程数、进程数、内存、CPU、磁盘和网络 IO



性能测试方法

  • 性能测试:模拟请求,施加压力,查看是否可以满足预期。

  • 负载测试:加大压力直到能力开始下降,得到临界值。

  • 压力测试:超过安全负载的压力,直接压到崩溃,获得最大压力承受能力。

  • 稳定性测试:长期的进行测试,来观察长期的稳定性。压测只能持续数分钟。

性能优化

  • 性能测试,获取性能指标和当前状态

  • 分析指标,发现瓶颈

  • 分层分析,寻找性能和瓶颈的关键所在

  • 针对性优化和处理

  • 性能测试,继续循环



分层分析

可以将业务流程针对不同层次进行分层,然后在分析数据的时候分别进行思考和 check,从而发现是否存在问题。常见的层次:

  • 机房和网络:宽带等,针对全球业务建立跨地区机房

  • 服务器和硬件:硬盘、内存、CPU、网卡等,网络传输遇到瓶颈可以更换网卡升级内部宽带

  • 操作系统:Linux、Windows 以及各种版本的差异和系统级配置,查看系统对 CPU 的占用等

  • 虚拟机:JVM 等程序运行环境,一些 GC 逻辑等可能会产生阻塞

  • 基础组件:Web 服务器等,基础组件的升级可以无需改动业务代码带来相应提升

  • 软件架构:框架等,具体看框架的实现,有的框架天生就是为了高性能而研发的,当然更快

  • 软件代码:业务逻辑,主要通过缓存、异步和集群进行优化,需要添加相应的逻辑和组件

操作系统

程序代码会放在磁盘上,属于死代码。当需要执行的时候,操作系统会创建一个进程然后加载进入执行,同时会在内存中创建堆内存、栈内存等存储执行。

进程会不断被分配 CPU 时间片来执行。同时进程也有几种状态:运行、就绪、阻塞。

进程 VS 线程

切换进程的消耗比较大,因此服务器主要使用单进程多线程的模式来实现,开销会小一些。

线程会共享进程的内存地址空间,拥有自己的私有内存地址范围,有自己的堆栈从而有自己的作用空间,互不干扰。

线程栈溢出通常是两种情况:栈就是太小了 或者 递归死循环了。



发布于: 2020 年 07 月 15 日阅读数: 64
用户头像

于江水

关注

还未添加个人签名 2018.07.08 加入

还未添加个人简介

评论

发布
暂无评论
第七周作业总结