监控服务器系统负载,内存以及实战java线程耗时长
查看cup load average
- uptime
- top
- cat /proc/loadavg
前两个命令可以看到load average有三个值
load average: 0.06, 0.12. 0.13
这三个值分别代表 1分钟,5分钟,15分钟的cpu load情况。(如果5,15分钟负载持续高需要密切关注原因)
load average: 一段时间内处于可运行状态和不可中断状态的进程平均数量。(可运行分为正在运行进程
和正在等待cpu的进程,状态为R;不可中断则是它正在做某些工作不能被中断比如等待磁盘Io等,其状态为D)
理解cup load的含义
一个cpu的每个核心同时只能处理一个进程,所以单核CPU的最大负载是1,2核CPU最大负载是2。所以单核cpu负载100%,在2核CPU负载只是50%。
所以我们看load average时,需要结合CPU的核心数来得出cpu的负载是否高。
查看cpu数核心数
总核数 = 物理CPU个数 * 每个物理CPU的核心数
总逻辑CPU数 = 物理Cpu个数 * 每个物理CPU的核心数* 超线程数
// 查看物理个数
cat /proc/cpuinfo| grep "physical id"| sort |uniq |wc -l
// 查看每个物理CPU中的核心数
cat /proc/cpuinfo| grep "cpu cores"| sort |uniq |wc -l
// 查看逻辑CPU的个数(云服务器我们一般说的几核)
cat /proc/cpuinfo| grep "processor"| sort |uniq |wc -l
//查看系统核数
grep ^processor /proc/cpuinfo | wc -l
cpu使用率
cpu使用率表示进程在占用CPU时是否使用了CPU的计算能力。假如某个进程占用了CPU一分钟,其中15秒在等待磁盘,45秒使用CPU处理从磁盘得到的数据,那么这一分钟CPU的使用率就是45/60 = 75%,但是CPU的负载这一分钟是1。
CPU负载高利用率低: 表示等待的任务进程太多,可能有些进程僵死了。
CPU利用高负载低: 表示执行的任务少,但是任务的执行时间长,有可能是程序有问题,或者任务的计算比较重。
top命令
top - 10:56:14 up 358 days, 16:19, 4 users, load average: 0.59, 0.76, 0.81
Tasks: 195 total, 1 running, 193 sleeping, 1 stopped, 0 zombie
%Cpu(s): 0.4 us, 1.0 sy, 0.0 ni, 97.8 id, 0.2 wa, 0.0 hi, 0.3 si, 0.3 st
KiB Mem : 32780560 total, 356628 free, 5764344 used, 26659588 buff/cache
KiB Swap: 0 total, 0 free, 0 used. 24893124 avail Mem
-
top - 10:56:14 [系统当前时间]
-
up 358 days, 16:19 [系统已经持续运行358天16小时19分钟]
-
4 users [4个当前登陆用户]
-
load average: 0.59, 0.76, 0.81 [系统负载,1分钟0.59,5分钟0.76,15分钟0.81]
-
Tasks: 195 total [总进程数]
-
1 running [1个正在运行的进程]
-
193 sleeping [193个睡眠的进程]
-
1 stopped [一个停止的进程]
-
0 zombie [0个冻结的进程]
-
%Cpu(s): 0.4 us [用户空间占用cpu百分比]
-
1.0 sy [内核空间占CPU百分比]
-
0.0 ni [用户进程空间改变过优先级的进程占用CPU百分比]
-
97.8 id [空闲cpu百分比]
-
0.2 wa [等待输入输出的CPU时间百分比]
-
0.0 hi [硬中断占CPU的百分比]
-
0.3 si [软中断占CPU百分比]
-
0.3 st [虚拟CPU占CPU的百分比]
-
KiB Mem : 32780560 total [物理内存总量]
-
356628 free [空闲内存总量]
-
5764344 used [使用的物理内存总量]
-
26659588 buff/cache [用作内核缓存的内存量]
-
KiB Swap: 0 total [交换区总量]
-
0 free [空闲交换区总量]
-
0 used [使用的交换区总量]
-
24893124 avail Mem [缓冲的交换区总量]
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
19326 root 20 0 9.9g 4.8g 7740 S 2.0 15.4 4472:47 java
- PID [进程id]
- USER [启动进程的用户]
- PR [进程的调度优先级]
- NI [进程的优先级,越小优先级越高]
- VIRT [进程使用的虚拟内存]
- RES [驻留内存大小,驻留内存是任务使用的非交换物理内存大小]
- SHR [进程使用的共享内存]
- S [进程的状态, D: 不可中断的睡眠态 R: 运行态 S: 睡眠态 T: 被跟踪或已停止 Z: 僵尸态]
- %CPU [自从上一次更新时到现在任务所使用的CPU时间百分比]
- %MEM [进程使用的可用物理内存的百分比]
- TIME+ [任务启动后到现在所使用的全部CPU时间 单位秒]
- COMMAND [运行进程所使用的命令]
iostat
命令解释
iostat(i/o statistics) 对整个系统的磁盘操作活动进行监视。
如果没有这个命令安装:
yum install sysstat
执行命令输出
[root]# iostat
Linux 3.10.0-514.26.2.el7.x86_64 (SZC-L0073138) 06/05/2020 _x86_64_ (8 CPU)
avg-cpu: %user %nice %system %iowait %steal %idle
7.97 0.00 1.11 0.94 0.00 89.98
Device: tps kB_read/s kB_wrtn/s kB_read kB_wrtn
sdb 37.04 413.24 1840.76 28168131487 125472363526
sdc 48.71 1056.95 1883.60 72045187756 128392365997
sda 9.61 214.57 82.09 14625692844 5595728123
dm-0 3.74 165.84 5.23 11304534785 356496815
dm-1 18.78 40.90 34.24 2787646788 2333633548
dm-2 64.57 1056.95 1883.60 72045186116 128392365997
dm-3 53.26 413.24 1840.76 28168129831 125472363526
dm-4 0.00 0.00 0.00 21823 262492
dm-5 1.58 6.07 41.12 413599842 2802705388
dm-6 0.30 1.63 1.50 111166136 102557567
sdd 56.20 431.84 1723.21 29435883909 117459864144
dm-7 105.49 431.84 1723.21 29435879685 117459864104
-
avg-cpu: %user [用户空间占CPU的时间百分比]
-
%nice [ cpu处于带nice(用户进程空间改变过优先级的进程)的时间百分比]
-
%system [CPU处于系统模式下的时间百分比]
-
%iowait [CPUd等待输入输出完成时间的百分比] [过高表示磁盘io存在瓶颈]
-
%steal [虚拟cpu的无意识等待时间百分比]
-
%idle [CPU空闲时间百分比]
-
tps [该设备每秒的传输次数]
-
kB_read/s [每秒从设备读取的数据量]
-
kB_wrtn/s [每秒从设备写入的数据量]
-
kB_read [读取的总数据量]
-
kB_wrtn [写入的总数据量]
Device: 系统挂载设备情况
lsblk : 显示Linxu的列表块设备(也就是所挂载的磁盘),可以看到sdb这些
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sda 8:0 0 60G 0 disk
|-sda1 8:1 0 1000M 0 part /boot
-sda2 8:2 0 59G 0 part
|-VolGroup00-LVroot 253:0 0 19.7G 0 lvm /
|-VolGroup00-LVswap 253:1 0 3.9G 0 lvm [SWAP]
|-VolGroup00-LVhome 253:4 0 500M 0 lvm /home
|-VolGroup00-LVtmp 253:5 0 10G 0 lvm /tmp
-VolGroup00-LVvar 253:6 0 25G 0 lvm /var
sdb 8:16 0 500G 0 disk
-VolGroup1-LVdata1 253:3 0 500G 0 lvm /data2
sdc 8:32 0 500G 0 disk
-VolGroup2-LVdata2 253:2 0 500G 0 lvm /data1
sdd 8:48 0 1000G 0 disk
-vg03-LVdata3 253:7 0 1000G 0 lvm /data3
sr0 11:0 1 1024M 0 rom
查看dm-0这种
dmsetup info /dev/dm-0 : 查看挂载的dm-0背后的磁盘
Name: VolGroup00-LVroot
State: ACTIVE
Read Ahead: 8192
Tables present: LIVE
Open count: 1
Event number: 0
Major, minor: 253, 0
Number of targets: 1
UUID: LVM-aZ9CubesFTEDMStyzoLz15X6Ow5AM0dMY7x52EGdsOx
lvdisplay : 查看磁盘逻辑卷详情
--- Logical volume ---
LV Path /dev/VolGroup00/LVroot
LV Name LVroot
VG Name VolGroup00
LV UUID Y7x52E-GdsO-x50y-hAtq-RbE1-QFg1-b2gu2c
LV Write Access read/write
LV Creation host, time localhost, 2017-09-08 11:25:06 +0800
LV Status available
# open 1
LV Size 19.65 GiB
Current LE 5031
Segments 1
Allocation inherit
Read ahead sectors auto
- currently set to 8192
Block device 253:0
dstat
dstat和iostat的功能基本是相同的,dstat的目标是替换iostat这种监控工具。
----total-cpu-usage---- -dsk/total- -net/total- ---paging-- ---system--
usr sys idl wai hiq siq| read writ| recv send| in out | int csw
8 1 90 1 0 0|2117k 5530k| 0 0 | 41k 34k| 962 2684
13 0 86 0 0 0| 0 0 |1426B 1451B| 0 0 |2232 2142
- system int [系统中断次数]
- system csw [上下文切换次数]
- total-cpu-usage [cpu统计]
- dsk/total [磁盘统计]
- net/total [网络流量统计]
- paging [系统的分页活动,分页指的是一种内存管理技术用于查找系统
场景,一个较大的分页表明系统正在使用大量的交换空间,或者说内存非常分散
,大多数情况下你都希望看到in(换入)和out(换出)的值是0 0 ]
排查java线程负载异常的堆栈
-
top 命令找到java的进程
-
top -p javaPid -H
可以看到进程下的线程id,以及cpu,内存使用情况
使用jstack 打印进程的堆栈信息(在输出的信息中搜索上面占用高的线程id)
(这里最好多打印几次日志,一般3~5次,执行jstack命令打印的堆栈信息是瞬时的) -
jstack javaPid > javaLog1.txt
3.1 jstat -gc pid (顺便输出一下GC的信息)
输出一次虚拟机的新生代,老年代内存情况,以及YGC以及FullGC的情况。
jstat -gc pid 1s 10
间隔1S输出10次堆信息
- 重启应用保证线上服务持续可用
参考
https://www.cnblogs.com/rexcheny/p/9382396.html
https://www.cnblogs.com/xrq730/p/11041741.html
https://blog.csdn.net/u013565163/article/details/87310957
https://wangchujiang.com/linux-command/c/top.html
https://www.cnblogs.com/mushang1hao/p/10767062.html
https://www.cnblogs.com/ftl1012/p/iostat.html