包含linux统计qps命令的词条

Linux查看日志文件写入速度的4种方法有时,我们需要查看某个文件的增长速度 , 如日志文件,以此来感受系统的负载情况 , 因为一般情况下,日志写入越快,说明系统负载越重 。
本文就来介绍下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命令,会更简单一些,如下:
系统压测时CPU达到100%但是QPS却很低线上系统,正在做压力测试 , 刚开始10并发进行压测,cpu压到了100%但是系统最大qps才200多 。通过JVM监控查看JVM younggc很频繁 , fullGC数量为零 。
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一个对象
面试官之问:知道你的接口“QPS”是多少吗? 怎么办 QPS是什么
我们先回忆一下,QPS的概念如下所示:
QPS(Query Per Second):每秒请求数,就是说服务器在一秒的时间内处理了多少个请求 。

推荐阅读