生产环境下是怎么排查问题的?常见的命令有哪些?
QPS和TPS多少可以进行压测,阿里云和腾讯云有压测服务,可以模拟几万人,几十万并发测试,花点小钱
性能是否遇到瓶颈 ?
物理层面:观察CPU、内存、磁盘、带宽的使用情况。
软件层面:观察JVM、GC、线程情况。
物理层面好解决,使用第三方压测服务,压测完会自动生成一个图表,包含QPS、TPS、CPU、内存、磁盘、带宽、请求超时、成功、失败的数量。
软件层面就自己使用JVM工具看
怎么抗的住性能压力 ?
通过判断性能瓶颈,那块不足提升哪块
如:CPU使用率才40%,但是内存使用率已经90%,那就增加内存。
如:某个线程耗时过长,那就优化这部分代码。
把单台服务器的配置发挥到极致,这样就能知道大概什么配置下服务器,它的QPS大概是什么情况,做到心中有数。剩下的就通过叠加服务器
1、 jmap -heap pid
输出当前进程JVM堆新生代、老年代、持久代等情况,GC使用的算法等信息。
2、jmap -histo:live {pid} | head -n 10
输出当前进程内存中所有对象包含的大小
输出当前进程内存中所有对象实例数 (instances) 和大小 (bytes), 如果某个业务对象实例数和大小存在异常情况,可能存在内存泄露或者业务设计方面存在不合理之处。
3、 jmap -dump:
命令如下:mkdir logs
jmap -dump:format=b,file=/tmp/logs/dump.hprof {pid}
5 1) 先利用top命令找到CPU占用高的进程pid
也可以通过ps -ef | grep 应用名 来快速定位自己应用的pid
显示pid:29080
(2) top -Hp pid
利用 top 命令可以查出占 CPU 最高的线程 pid (先找到该pid 29080下所有的线程数据)
printf '%x\n' 29173
(3). 占用率最高的线程 ID 为29173,将其转换为 16 进制形式 (因为 java native 线程以 16 进制形式输出)
jstack 29080 | grep '0x71f5' -A 50 —colo
(4) 利用 jstack 打印出 java 线程调用栈信息
GC情况用jstatjstat -gc 12538 5000