线上网站遭受攻击,首页被强刷,致使服务器node性能过载,影响用户正常页面访问。html
大体架构:客户端发起请求 --> node(充当中间件,访问后端API渲染页面) --> java(处理业务逻辑)--> databasejava
现象 | 疑惑 |
---|---|
Nodejs cup 满负载 | 与Nodejs高性能不符? |
后端 Java 的负载和Node相反 | 怎么性能会优于Nodejs? |
分别用如下方式模拟一个线上获取用户信息的接口:node
框架:koa+koa-router+sequelize+request+pm2mysql
备注:因为不太清楚后端业务数据取值逻辑,尽量还原response data,会存在必定的数据包误差。linux
简要代码sql
router.all('/api/java', async function(ctx, next) { let uid = ctx.cookies.get('uid'); // request代理给后端java API接口 ctx.body = await new Http({ctx}).request({ url: '/user/getbalance' }) })
router.all('/api/node', async function(ctx, next) { let uid = ctx.cookies.get('uid'); // 经过sequelize从mysql查询 let data = await Promise.all([ user.balance(uid), user.integral(uid), user.coupon(uid), user.memberProp(uid) ]); ctx.body = data });
在测试环境,直接局域网ab测试,避免网络io损耗。
测试不一样并发条件(100->200->500->1k->2k),1w请求总耗时;同时node增长核数(1核->2核->4核->8核)shell
再次备注:经过node访问java接口。(要模拟线上环境,会由于node的瓶颈形成java负载太低)数据库
node直连数据库apache
直接访问java接口,硬碰硬vim
运行脚本:ab + 请求数量 + 并发数量 + 测试地址
[root@localhost pressure_analysis]# ab -n 10000 -c 1000 http://127.0.0.1:3301/anal/api/java
参数说明:
指标 | 数值 | 说明 |
---|---|---|
Concurrency Level | 1000 | 并发数量 |
Complete requests | 10000 | 所有完成的请求数量 |
Time taken for tests | 7.907 seconds | 运行测试脚本总用时 |
Total transferred | 2880000 bytes | 数据包大小 |
Requests per second | 1264.76 [#/sec] (mean) | 平均每秒请求数量(Complete requests/Time taken for tests) |
Time per request | 790.661 [ms] (mean) | 单个请求平均耗时(Concurrency Level*Time taken for tests) |
Transfer rate | 355.71 [Kbytes/sec] received | 数据包传输速率 |
sysctl命令被用于在内核运行时动态地修改内核的运行参数,可用的内核参数在目录/proc/sys中。它包含一些TCP/ip堆栈和虚拟内存系统的高级选项, 这可让有经验的管理员提升引人注目的系统性能。
[root@localhost pressure_analysis]# vim /etc/sysctl.conf net.ipv4.tcp_syncookies = 0 [root@localhost pressure_analysis]# sysctl -p
ulimit用来限制系统用户对shell资源的访问
# 注意到open files限制1024 [root@localhost pressure_analysis]# ulimit -a core file size (blocks, -c) 0 data seg size (kbytes, -d) unlimited scheduling priority (-e) 0 file size (blocks, -f) unlimited pending signals (-i) 257702 max locked memory (kbytes, -l) 64 max memory size (kbytes, -m) unlimited open files (-n) 1024 pipe size (512 bytes, -p) 8 POSIX message queues (bytes, -q) 819200 real-time priority (-r) 0 stack size (kbytes, -s) 10240 cpu time (seconds, -t) unlimited max user processes (-u) 257702 virtual memory (kbytes, -v) unlimited file locks (-x) unlimited # 修改配置 [root@localhost pressure_analysis]# ulimit -n 5000