一、生产环境服务器变慢,诊断思路和性能评估
1、在Linxu准备数据
(1)在Linux创建一个java循环类(方便测试),代码如下:
package com.study.gc;
public class javaDemo02 {
public static void main(String[] args) {
while (true) {
System.out.println(new java.util.Random().nextInt(77778888));
}
}
}
(2)由于带了包名,所以先编译
[root@spark2 demo]# javac -d . javaDemo02.java
(3)再次去查看,发现多了"com"的包名
[root@spark2 demo]# ll
total 8
drwxr-xr-x. 3 root root 19 Aug 1 17:36 com
-rw-r--r--. 1 root root 196 Aug 3 19:27 javaDemo02.java
[root@spark2 demo]#
(4)运行程序
[root@spark2 demo]# java com.study.gc.javaDemo02
后台不断死循环打印
2、命令操作
LInux命令之top
后台打印,我们可以使用”top“命令,前台查看进程:查看系统的整机命令
[root@spark2 ~]# top
top - 19:37:08 up 22 min, 2 users, load average: 0.13, 0.07, 0.09 //系统负载均衡
Tasks: 109 total, 2 running, 107 sleeping, 0 stopped, 0 zombie
%Cpu(s): 2.0 us, 5.0 sy, 0.0 ni, 93.0 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
KiB Mem : 3861484 total, 2610840 free, 964692 used, 285952 buff/cache
KiB Swap: 4063228 total, 4063228 free, 0 used. 2628116 avail Mem
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
10185 root 20 0 2957456 46776 11764 S 6.3 1.2 0:29.01 java
10086 root 20 0 158768 5616 4268 R 1.0 0.1 0:04.06 sshd
10235 root 20 0 162116 2224 1544 R 0.7 0.1 0:00.07 top
1 root 20 0 127984 6540 4136 S 0.0 0.2 0:02.19 systemd
2 root 20 0 0 0 0 S 0.0 0.0 0:00.00 kthreadd
3 root 20 0 0 0 0 S 0.0 0.0 0:00.19 ksoftirqd/0
5 root 0 -20 0 0 0 S 0.0 0.0 0:00.00 kworker/0:0H
7 root rt 0 0 0 0 S 0.0 0.0 0:00.00 migration/0
8 root 20 0 0 0 0 S 0.0 0.0 0:00.00 rcu_bh
9 root 20 0 0 0 0 S 0.0 0.0 0:01.59 rcu_sched
10 root 0 -20 0 0 0 S 0.0 0.0 0:00.00 lru-add-drain
11 root rt 0 0 0 0 S 0.0 0.0 0:00.21 watchdog/0
13 root 20 0 0 0 0 S 0.0 0.0 0:00.00 kdevtmpfs
14 root 0 -20 0 0 0 S 0.0 0.0 0:00.00 netns
15 root 20 0 0 0 0 S 0.0 0.0 0:00.00 khungtaskd
16 root 0 -20 0 0 0 S 0.0 0.0 0:00.00 writeback
17 root 0 -20 0 0 0 S 0.0 0.0 0:00.00 kintegrityd
18 root 0 -20 0 0 0 S 0.0 0.0 0:00.00 bioset
19 root 0 -20 0 0 0 S 0.0 0.0 0:00.00 bioset
20 root 0 -20 0 0 0 S 0.0 0.0 0:00.00 bioset
21 root 0 -20 0 0 0 S 0.0 0.0 0:00.00 kblockd
22 root 0 -20 0 0 0 S 0.0 0.0 0:00.00 md
23 root 0 -20 0 0 0 S 0.0 0.0 0:00.00 edac-poller
24 root 0 -20 0 0 0 S 0.0 0.0 0:00.00 watchdogd
30 root 20 0 0 0 0 S 0.0 0.0 0:00.00 kswapd0
31 root 25 5 0 0 0 S 0.0 0.0 0:00.00 ksmd
32 root 39 19 0 0 0 S 0.0 0.0 0:05.96 khugepaged
33 root 0 -20 0 0 0 S 0.0 0.0 0:00.00 crypto
41 root 0 -20 0 0 0 S 0.0 0.0 0:00.00 kthrotld
43 root 0 -20 0 0 0 S 0.0 0.0 0:00.00 kmpath_rdacd
44 root 0 -20 0 0 0 S 0.0 0.0 0:00.00 kaluad
45 root 0 -20 0 0 0 S 0.0 0.0 0:00.00 kpsmoused
46 root 20 0 0 0 0 S 0.0 0.0 0:00.88 kworker/0:2
47 root 0 -20 0 0 0 S 0.0 0.0 0:00.00 ipv6_addrconf
60 root 0 -20 0 0 0 S 0.0 0.0 0:00.00 deferwq
说明:
load average:0.13,0.07,0.09:系统负载均衡的负载值,若想求出负载值,这3个值相加除以3再乘100%,若求的是60%,系统值还是够的,没什么压力。
查看系统的整机命令:
[root@spark2 ~]# uptime
19:43:24 up 28 min, 2 users, load average: 0.26, 0.12, 0.0
Linux之cpu查看vmstat
查看额外
[root@spark2 ~]# vmstat -n 2 3
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
r b swpd free buff cache si so bi bo in cs us sy id wa st
3 0 0 2610884 2108 283856 0 0 119 14 200 391 2 4 93 1 0
0 0 0 2610900 2108 283888 0 0 0 0 257 322 3 5 92 0 0
0 0 0 2610900 2108 283888 0 0 0 0 266 328 3 6 92 0 0
[root@spark2 ~]#
Linux之cpu查看pidstat
[root@spark2 ~]# ps -ef|grep java
root 10185 10145 7 19:30 pts/0 00:01:32 java com.study.gc.javaDemo02
root 10245 10203 0 19:52 pts/1 00:00:00 grep --color=auto java
[root@spark2 ~]# pidstat -u 1 -p 10185
-bash: pidstat: command not found //没有这个插件,下载即可
[root@spark2 ~]# yum install sysstat
Linux之内存查看ferr和pidstas
内存:free
(1)应用程序可用内存数
[root@spark2 ~]# free
total used free shared buff/cache available
Mem: 3861484 969036 2473168 11860 419280 2619044
Swap: 4063228 0 4063228
[root@spark2 ~]#
[root@spark2 ~]# free -g
total used free shared buff/cache available
Mem: 3 0 2 0 0 2
Swap: 3 0 3
[root@spark2 ~]#
[root@spark2 ~]# free -m
total used free shared buff/cache available
Mem: 3770 946 2415 11 409 2557
Swap: 3967 0 3967
[root@spark2 ~]#
(2)查看额外
pidstat -p 进程号 -r 采样间隔秒数
Linux之硬盘查看
硬盘:df(查看磁盘剩余空闲数)
[root@spark2 ~]# df -h
Filesystem Size Used Avail Use% Mounted on
/dev/mapper/centos-root 36G 7.3G 28G 21% /
devtmpfs 1.9G 0 1.9G 0% /dev
tmpfs 1.9G 0 1.9G 0% /dev/shm
tmpfs 1.9G 12M 1.9G 1% /run
tmpfs 1.9G 0 1.9G 0% /sys/fs/cgroup
/dev/sda1 1014M 146M 869M 15% /boot
tmpfs 378M 0 378M 0% /run/user/0
[root@spark2 ~]#
Linux之磁盘IO查看iostat和pidstat
磁盘IO:iostat
(1)磁盘I/O性能评估
[root@spark2 ~]# iostat -xd 2 3
Linux 3.10.0-957.el7.x86_64 (spark2.x) 08/03/2020 _x86_64_ (1 CPU)
Device: rrqm/s wrqm/s r/s w/s rkB/s wkB/s avgrq-sz avgqu-sz await r_await w_await svctm %util
sda 0.00 0.07 1.91 0.44 78.54 16.63 81.28 0.03 12.06 13.87 4.13 5.25 1.23
scd0 0.00 0.00 0.00 0.00 0.25 0.00 114.22 0.00 2.00 2.00 0.00 1.61 0.00
dm-0 0.00 0.00 1.35 0.51 70.63 16.12 93.53 0.03 14.78 18.79 4.11 6.50 1.21
dm-1 0.00 0.00 0.02 0.00 0.60 0.00 54.67 0.00 0.32 0.32 0.00 0.19 0.00
Device: rrqm/s wrqm/s r/s w/s rkB/s wkB/s avgrq-sz avgqu-sz await r_await w_await svctm %util
sda 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
scd0 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
dm-0 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
dm-1 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
Device: rrqm/s wrqm/s r/s w/s rkB/s wkB/s avgrq-sz avgqu-sz await r_await w_await svctm %util
sda 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
scd0 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
dm-0 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
dm-1 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
[root@spark2 ~]#
(2)查看额外
pidstat -d 采样间隔秒数 -p 进程号
pidstat -d 2 -p 10185
Linux之网络IO查看ifstat
网络IO:ifstat
(1)默认本地没有,下载ifstat
//下载
[root@spark2 ~]# wget http://gael.roualland.free.fr/ifstat/ifstat-1.1.tar.gz
//解压
[root@spark2 ~]# tar -zxvf ifstat-1.1.tar.gz
//进入解压文件目录及编译
[root@spark2 ifstat-1.1]# ./configure
//编译下载
[root@spark2 ifstat-1.1]# make
[root@spark2 ifstat-1.1]# make instal
(2)查看网络IO
[root@spark2 ifstat-1.1]# ifstat 1
二、假如生产环境出现CPU占用过高,请谈谈你的分析思路和定位?
1、结合Linux和JDK命令一块分析
2、案例步骤
(1)先用top命令找出CPU占比最高的
(2) ps -ef或者jps进一步定位,得知是一个怎么样的一个后台程序
[root@spark2 ifstat-1.1]# jps -l
11363 sun.tools.jps.Jps
10185 com.study.gc.javaDemo02
10171 -- process information unavailable
[root@spark2 ifstat-1.1]# ps -ef |grep -v grep
root 10185 10145 7 19:30 pts/0 00:05:24 java com.study.gc.javaDemo02
(3)定位到具体线程或者代码
ps -mp 进程 -o THREAD,tid,time
[root@spark2 ifstat-1.1]# ps -mp 10185 -o THREAD,tid,time
USER %CPU PRI SCNT WCHAN USER SYSTEM TID TIME
root 7.0 - - - - - - 00:05:40
root 0.0 19 - futex_ - - 10185 00:00:00
root 6.8 19 - - - - 10186 00:05:34
root 0.0 19 - futex_ - - 10187 00:00:01
root 0.0 19 - futex_ - - 10188 00:00:00
root 0.0 19 - futex_ - - 10189 00:00:00
root 0.0 19 - futex_ - - 10190 00:00:00
root 0.0 19 - futex_ - - 10191 00:00:00
root 0.0 19 - futex_ - - 10192 00:00:00
root 0.0 19 - futex_ - - 10193 00:00:00
root 0.0 19 - futex_ - - 10194 00:00:04
[root@spark2 ifstat-1.1]#
参数解释
-m 显示所有线程
-p pid进程使用cpu的时间
-o 该参数后是用户自定义格式
(4)将需要的线程ID转换为16进制格式(英文小写格式)
cmd窗口执行“calc”切换计算机“程序员”
(5)jstack 进程ID | grep tid(16进制线程ID小写英文) -A60
[root@spark2 ifstat-1.1]# jstack 10185| grep 27C9 -A60
原文连接:https://zhuanlan.zhihu.com/p/166394360