后台导致在线网站受到攻击,首页被强行刷屏,导致服务器节点性能过载,影响用户正常访问页面。粗略架构:client发起请求-->node(作为中间件,访问后端API渲染页面)-->java(处理业务逻辑)-->数据库现象&问题现象存疑的Nodejscup满载不匹配Nodejs高性能?对比Node,后端Java负载的性能如何能优于Nodejs?让node和java做一个简单的测试(娱乐为主)。前期测试准备模拟一个在线获取用户信息的接口,如下:node直接连接mysqlnode,调用java接口获取数据。Framework:koa+koa-router+sequelize+request+pm2备注:由于后台业务数据的取值逻辑不清晰,响应数据尽量还原,会有一定的包偏差。简码router.all('/api/java',asyncfunction(ctx,next){letuid=ctx.cookies.get('uid');//请求代理到后端javaAPI接口ctx.body=awaitnewHttp({ctx}).request({url:'/user/getbalance'})})router.all('/api/node',asyncfunction(ctx,next){letuid=ctx.cookies.get('uid');//通过sequelize从mysql查询letdata=awaitPromise.all([user.balance(uid),user.integral(uid),user.coupon(uid),user.memberProp(uid)]);ctx.body=数据});Grouptest&conclusion在测试环境下,直接局域网ab测试,避免网络io丢失。测试不同的并发条件(100->200->500->1k->2k),1w个请求的总耗时;同时node增加核数(1核->2核->4核->8核)Java测试(Node代理java)再次注意:通过node访问java接口。(模拟线上环境,java负载会因为node的瓶颈而过低)node测试node直接连接数据库java&node直接访问java接口,头对头测试结论node的优势处理非阻塞异步IO,但是因为是单进程,虽然request数增加了↑,而实际对java应用的请求数被限制在一个峰值max,这就解释了图1中的红柱:当cpu1核时,数并发增加,耗时不变。知道了节点cpu瓶颈的原因,通过pm2增加核心数,让java获得更多的资源去处理。图1深蓝色和浅蓝色:CPU核数增加,耗时缩短。当CPU值增加到8核时(测试环境满核),node基本不会hold住任何请求(top不到50%),直接丢给java端,到达java请求。但是由于java语言的特性(同步阻塞型)和外部因素(复杂的测试环境),时间没有减少反而有上升的趋势。图1橙色:有依赖多核性能的上升趋势。Node充分利用了硬件资源。核心数量增加↑,执行能力按比例增加↑。图2:耗时随CPU核数增加,乘法减少。处理速度)图3:node性能优于java,但是并发2k时,两者还是不分伯仲,或者两者结合使用,应该在不同的场景下使用(注:由于数据库等原因,java时是处理业务,会出现jdbc等大量问题)改进方案使用pm2修改节点运行环境,增加节点端处理能力,解决节点瓶颈,重新设计架构。以后条件允许的时候,可以横向扩展节点,避免单机cpu瓶颈,能够离线应对峰值压力&恶意攻击,详细了解节点性能问题apachab简单介绍apacheab运行脚本:ab+numberofrequests+并发数+测试地址[root@localhostpressure_analysis]#ab-n10000-c1000http://127.0.0.1:3301/anal/api/java参数说明:索引值说明ConcurrencyLevel1000ConcurrencyCompleterequests10000Completerequests测试时间7.907秒661[ms](均值)单次请求平均耗时(ConcurrencyLevel*Timetakenfortests)Transferrate355.71[Kbytes/sec]receiveddatapackettransmissionrateabtoolusedsomeproblemsapr_socket_recv:Connectionresetbypeer(104)sysctl命令用于在内核运行时动态修改内核的运行参数,可用的内核参数在/proc/sys目录下。它包括一些TCP/IP堆栈和虚拟内存系统的高级选项,使有经验的管理员能够显着提高系统性能。[root@localhostpressure_analysis]#vim/etc/sysctl.confnet.ipv4.tcp_syncookies=0[root@localhostpressure_analysis]#sysctl-psocket:Toomanyopenfiles(24)ulimit用于限制系统用户对shell资源的访问#注意打开文件限制1024[root@localhostpressure_analysis]#ulimit-acorefilesize(blocks,-c)0datasegsize(kbytes,-d)unlimitedschedulingpriority(-e)0filesize(blocks,-f)unlimitedpending信号(-i)257702最大锁定内存(千字节,-l)64最大内存大小(千字节,-m)无限打开文件(-n)1024管道大小(512字节,-p)8POSIX消息队列(字节,-q)819200实时优先级(-r)0stacksize(kbytes,-s)10240cputime(seconds,-t)unlimitedmaxuserprocesses(-u)257702virtualmemory(kbytes,-v)unlimitedfilelocks(-x)unlimited#modifyconfiguration[root@localhost压力_analysis]#ulimit-n5000参考linux命令sysctlulimit
