常见性能分析命令
1.1 查看CPU使用
- pidstat
- vmstat
- mpstat
- sar
- top
统计机器总CPU使用情况
# 1.查看本机CPU个数和利用率
lscpu
CPU(s): 2 //总cpu数量
On-line CPU(s) list: 0,1 //在线的cpu的编号;
Thread(s) per core: 2 // 每个Core 核心的线程数
Core(s) per socket: 1 //每个cpu插槽核数
Socket(s): 1 //cpu插槽数
Model name: Intel(R) Xeon(R) CPU E5-2673 v4 @ 2.30GHz
CPU MHz: 2294.685 // cpu主频
L1d cache: 32K //一级高速缓存dcache存储数据
L1i cache: 32K //一级高速缓存 icache存储指令
//用top查看 cpu个数, 且显示每个cpu的使用率
top , 再按 1
// 查看指定CPU (编号0)的情况
mpstat -P 0 3,5 //查看指定编号CPU 0, 0, 1, ALL
# 2. 查看CPU平均数据
top // 本机资源实时利用, 第二行CPU资源信息;
sar -u 2 5 // 查看 CPU情况,
mpstat 2 5 // 查看ALL CPU的平均统计信息
vmstat 3 5 // 汇总3秒内的CPU/Memory等资源情况;
# 3. 查看各进程的CPU使用情况:
top // 对各进程的CPU等资源占用进行排序;
pidstat -u 2 5 // -u查看CPU情况, 可省略; 统计2秒内;
ps // 查看前台进出
ps -aux //查看所有后台进程
统计某进程的CPU使用情况
// 查看某进程(PID)的资源使用
pidstat -p {pid} -u 3 5 // -p指定pid,
top -Hp {pid} // 查看指定进程内的线程
pstree {pid} // 查看某进程的pstree树关系
pstree {pid} -p -a // -p 显示其子进程; -a: 显示参数和命令;
1.2 内存Memory 监控
相关命令:
1.2.1 机器整体内存分析
sar -r 2 10 //查看本机内存
free -h -m
top , 再按E
vmstat -s -S M // -s 显示内存相关统计信息及多种系统活动数量;
* -S(大写): 指定显示单位; K, 1024, M 1024*1024;
// 其他工具, 少用;
nmon , dmidecode, hwinfo , lshw,inxi,glances 等其他命令;
某进程的内存监控
// 指定进程号{pid}
pidstat -r -p {pid} 2 5 // -r看内存,-p 指定pid
- t: 显示其所有线程;
top -Hp {pid} //
// 强大的内存映射命令: 支出其中每个内存位置;
pmap -d {pid} // -d:不显示头尾行; -x: 显示细节;
Address Kbytes Mode Offset Device
00007f234498e000 4K r--s- commons-logging-1.0.3.jar
* Address : 内存地址;
* Kbytes : 字节大小;
// 2. Java 内存分析工具
jstat -gc {pid} 3000 5
// gc统计
jstat -gcutil {pid} 3000 5
S0 年轻代中第一个survivor(幸存区)已使用的占当前容量百分比
S1 年轻代中第二个survivor(幸存区)已使用的占当前容量百分比
E 年轻代中Eden(伊甸园)已使用的占当前容量百分比
O old代已使用的占当前容量百分比
P perm代已使用的占当前容量百分比
YGC 从应用程序启动到采样时年轻代中gc次数
YGCT 从应用程序启动到采样时年轻代中gc所用时间(s)
FGC 从应用程序启动到采样时old代(全gc)gc次数
FGCT 从应用程序启动到采样时old代(全gc)gc所用时间(s)
GCT 从应用程序启动到采样时gc用的总时间(s)
jmap -heap {pid} // 查看其堆内存;
jcmd {pid} help // 查看哪些可查看项;
jcmd {pid} VM.native_memory // 查看堆外内存
// 其他Linux 内存分析工具:
valgrind, dtrace
查看磁盘Disk的使用
// # 查看磁盘
sar -d 2 10
// 查看磁盘情况
iostat -c 2 10
查看网络Network的使用
// 查看网络流量
sar -n DEV 2 5
其他命令
1. 查看机器负载
vmstat 2 10 -a
// 查看CPU 情况, 2秒间隔, 5次打印;
sar -r 2 10 # 查看内存
sar -n DEV 2 5 # 查看网络流量
1. 查看某进程 内存使用率
jstat -gcutil pid
jmap -heap pid
2. 查看进程的CPU使用率
jstat - pid
具体功能分析
jstack + top 分析进程中高耗线程
- 使用top命令分析出
1. 确定进程pid; 通过top/ jps等命令,确定要分析的进程pid:
top -c
jps
2. 查看该进程内, 有哪些线程,并对其cpu耗用排名: 可通过ps or top 等命令;
ps -Lfp pid
top -Hp pid
# 将占用CPU最高进程中的线程打印出来,可以用 top -bn1 -H -p <pid> 命令
ps -mp pid -o THREAD,tid,time|sort -k2r (推荐该命令)
#打印进程内线程CPU排名; 其他tid一栏为线程Id;
3. 利用jstat + grep 打印模板线程情况
printf "%x\n" tid
jstack pid |grep 十六进制tid -A 10
- jstack 1943 |grep 7c6 -A 10
# 查看该进程总共多少个线程
jstack 1943 |grep State |wc -l
监控分析工具的使用手册
Java Visual VM
连接远程 Visual VM办法:
启动jstatd 守护进程
在 JAVA_HOME/bin目录下, 新建 jstatd.all.policy 文件, 内如如下:
grant codebase "file:${java.home}/../lib/tools.jar" {
permission java.security.AllPermission;
};
后台启动jstatd 守护进程
nohup $JAVA_HOME/bin/jstatd -J-Djava.security.policy=jstatd.all.policy &
以自己制定jstatd的端口,加-p <port> 参数,默认端口为1099.
在特定的java应中, 添加如下JVM参数:
//
-Dcom.sun.management.jmxremote
// 这个是配置远程 connection 的端口号的,要确定这个端口没有被占用
-Dcom.sun.management.jmxremote.port=10991
//指定了 JMX 是否启用 ssl
-Dcom.sun.management.jmxremote.ssl=false
// 指定了JMX 是否启用鉴权(需要用户名,密码鉴权)
-Dcom.sun.management.jmxremote.authenticate=false
// 这个是配置 server 的 IP 的
-Djava.rmi.server.hostname=ldsver51
远程连接 1099端口;
直接点击: 远程 添加相应端口即可, 默认 10099
Linux时间设置和时间同步
Linux时间分成硬件时间和系统时间
- 硬件时间: RTC, real time clock,真实时间:
RTC在系统关机后, 仍然会计时; RTC是PC主板上的晶振及相关电路组成的时钟电路的生成脉冲主板上的晶振及相关电路组成的时钟电路的生成脉冲,RTC经过8254电路的变频产生一个频率较低一点的OS(系统)时钟TSC,系统时钟每一个cpu周期加一周期加一,每次系统时钟在系统初起时通过RTC初始化。8254本身工作也需要有自己的驱动时钟(PIT)
- 系统时间: (System Clock): 系统时钟就是操作系统的kernel所用来计算时间的时钟. 它从1970年1月1日00:00:00 UTC时间到目前为止秒数总和的值。在开机的时候会和硬件时间同步,之后也就各自独立运行了; 系统时间,是用CPU tick来维持的;
- 时间差异原因: 默认情况下,系统时间和硬件时间,并不会自动同步, 互不干扰。硬件时间的运行,是靠BIOS电池来维持,而系统时间,是用CPU tick来维持的。这也是系统时间长时间运行时会产生时间偏差的原因
查看好设置硬件时间RTC
hwclock
clock
timedatectl
// 修改RTC时间
clock --set --date='2018-03-12 08:30:45'
// 将系统时间,同步成RTC时间
timedatectl
clock --systohc //从硬件时钟设置系统时间
clock -s
clock -w // 从硬件时钟设置系统时间
hwclock -c // 查看与系统时间的间隔;
timedatectl
设置系统时间(Systemtime)
date
timedatectl
date -s '2018-03-23 04:30:45' // 设置系统时间;
clock -w //将RTC时间也设置成 当前系统时间;
关于时间同步
网络时间协议NTP(Network Time Protocol)是用于互联网中时间同步的标准互联网协议。是把计算机的时间同步到某些时间标准。目前采用的时间标准是世界协调时UTC
关于ntdp和Ntpdate
- ntpd不仅仅是时间同步服务器,它还可以做客户端与标准时间服务器进行同步时间,而且是平滑同步,一个是校准时间, ntpd在实际同步时间时是一点点的校准过来时间的,最终把时间慢慢的校正对。
- 关于ntpdate: ntpdate立即同步,在生产环境中慎用ntpdate,一个是调整时间。而ntpdate不会考虑其他程序是否会阵痛,直接调整时间。
关于chrony同步时间
chrony sources -v // 查看有哪些时间源
date -s '2015-03-02 18:09:03'
chronyc -a makestep //手动立马同步时间;
问题: 当系统时间与ntp时间差 > 10秒时, 就不能正常的更新时间了,需要设置 vim /etc/chrony.conf
默认情况下,chronyd通过减慢或加快时钟速度来逐渐调整时钟。如果时钟与实际时间偏差太大,则需要很长时间才能纠正错误。步进时钟(时间跳变)可以快速修正偏差较大的时间误差,但步进时钟(时间跳变)能会导致一些程序异常,
# 默认这个 1.0 1 不行, 需要后面设置成 -1;
makestep 1.0 1
makestep 10 -1
makestep 10 1
//解释 如果时间的误差小于10秒,则通过减慢或加快时钟速度来逐渐调整时钟。如果时间的误差大于10秒,在第1次更新时间时允许步进时间。
makestep 10 3 // 如果系统时钟的偏移量大于10秒,则允许在前三次更新中步进调整系统时钟