java服务器慢怎么检查_生产环境服务器变慢、CPU占用过高,诊断思路和性能评估谈谈?...

上篇:https://zhuanlan.zhihu.com/p/166162037​zhuanlan.zhihu.comzhihu-card-default.svg

一、生产环境服务器变慢,诊断思路和性能评估

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

后台不断死循环打印知乎视频​www.zhihu.comzhihu-card-default.svg

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 ~]#查看vmstat

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查看每个进程使用cpu的用量分解信息

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值