重庆分公司,新征程启航
为企业提供网站建设、域名注册、服务器等服务
线上系统,正在做压力测试,刚开始10并发进行压测,cpu压到了100%但是系统最大qps才200多。通过JVM监控查看JVM younggc很频繁,fullGC数量为零。
创新互联建站是一家专注于网站设计制作、成都网站建设与策划设计,海陵网站建设哪家好?创新互联建站做网站,专注于网站建设十年,网设计领域的专业建站公司;建站业务涵盖:海陵等地区。海陵做网站价格咨询:028-86922220
cpu 达到100% 则先看cpu使用率最高是哪个进程,可以直接通过linux命令 top查看,找到对应的进程ID,发现正是压测的java系统进程ID,找到进程ID后,然后在查找该进程下CPU使用率最高是哪个线程,可以通过top -p 进程ID -H 命令显示线程使用cpu信息,效果如下:
图片中PID列则为十进制显示的线程ID,然后转换为16进制通过jstack 系统进程ID | grep 16进制线程ID 可以找到对应的线程信息如下,也就是该线程占用了一半左右的cpu
Finalizer线程是个单一职责的线程。这个线程会不停的循环等待java.lang.ref.Finalizer.ReferenceQueue中的新增对象。一旦Finalizer线程发现队列中出现了新的对象,它会弹出该对象,调用它的finalize()方法,将该引用从Finalizer类中移除,因此下次GC再执行的时候,这个Finalizer实例以及它引用的那个对象就可以回垃圾回收掉了。
说明Finalizer的队列中有许多的等待回收的垃圾对象,可以通过命令查看等待回收的对象都有哪些;
jmap -finalizerinfo 进程ID
执行命令后显示结果如下
发现有好多的自定义对象,通过类名可以看到这些对象都是通过CGLIB动态代理创建的,而这些动态代理类都默认实现了finalize方法,导致这些对象在进行垃圾回收时必须先要执行finalize方法,所以都积压到了finalizer的队列中。
1.不要使用cglib来给那些需要频繁进行垃圾回收的对象创建动态代理,这些对象大量创建的同时,也会创建相等数量的动态代理对象,使得内存占用迅速增长,并且不断进行垃圾回收,由于代理类重写了finalize方法,给垃圾回收带来了额外的压力。
2.尽量能够复用对象,不要每次都new一个对象
有时,我们需要查看某个文件的增长速度,如日志文件,以此来感受系统的负载情况,因为一般情况下,日志写入越快,说明系统负载越重。
本文就来介绍下Linux中查看日志增长速度的几种方法,如下:
首先要介绍的是dd,因为dd命令几乎所有主流发行版都自带,无需额外安装,如下:
如上,使用 tail -F 获取新写入的数据,然后用管道将数据交给dd,dd将数据拷贝到 /dev/null ,其中 status=progress 是用来显示拷贝速度的,可见,我们日志的写入速度是 471 kB/s 。
pv命令可以看做是带进度的cp,如下:
原理与dd类似,不过命令换成了pv。
由于日志数据都是程序(如java)写入的,而在如下的伪文件中,存放着程序打开的文件信息,如下:
于是定期的读取这个offset就可以知道文件的写入速度了,这也是cv命令的实现原理,如下:
通过写一个小脚本,定期观察文件大小,也可查看文件写入速度,如下:
通过watch再加上观察,也能大致看出速度,如下:
其实转念一想,如果我们在某个函数中打上日志,然后通过grep过滤出此日志,然后我们只要计算每秒输出的日志行数,这岂不就是函数执行的QPS了!
这里可以通过 151/15 计算出QPS是10,由于没有超过1000,所以看到的是0.0kB/s,如果使用pv命令,会更简单一些,如下:
QPS是什么
我们先回忆一下,QPS的概念如下所示:
QPS(Query Per Second):每秒请求数,就是说服务器在一秒的时间内处理了多少个请求。
那我们怎么估出每秒钟能处理多少请求呢?
OK,用日志来估计!那日志怎么记录呢
此时,你访问一次/home/index地址,会有下面这样日志
那么,你就可以根据日志中,该记录的出现次数,统计index接口的QPS。
假设,你这会日志已经拿到手了,名字为xxx.log。
假设日志内容如下
这个时候,你执行一串命令长下面这样的,进行统计就行!
出来等结果就是
然后你就知道,原来在20:40:44 分。。这个接口的QPS最高,达到了惊人的2QPS!
现在,来讲一下命令什么意思!
那么,如果是其他日志格式,无外乎 ”cut语句“的处理不同而已,道理类似!此法可以估算出单机的某接口的 “QPS” 是多少!
估算
我们现在估计出了单机的QPS。接下来,估算集群的QPS。
这就要根据负载均衡的策略来估计!
比如,你部署了32台机器,负载均衡的策略恰巧为轮询,那集群的QPS就是单机的QPS乘32就好了。
所以,根据具体的策略,来估计整个集群的QPS多大!
多嘴一句,一般2000QPS够了!