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

整机:top

代码

public class JavaDemo2 {
public static void main(String[] args) {
while (true){
System.out.println(new java.util.Random().nextInt(77778888));
}
}
}

top命令查看

[root@192 ~]# top
top - 11:28:50 up 7 min, 2 users, load average: 0.73, 0.39, 0.18
Tasks: 230 total, 1 running, 229 sleeping, 0 stopped, 0 zombie
Cpu(s): 1.0%us, 2.3%sy, 0.0%ni, 96.7%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st
Mem: 1906280k total, 649948k used, 1256332k free, 21164k buffers
Swap: 2097148k total, 0k used, 2097148k free, 203820k cached PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
3672 root 20 0 3158m 94m 11m S 15.6 5.1 0:13.67 java
3397 root 20 0 100m 5388 3396 S 9.3 0.3 0:09.00 sshd
39 root 20 0 0 0 0 S 1.7 0.0 0:00.25 events/4
37 root 20 0 0 0 0 S 1.0 0.0 0:00.39 events/2
35 root 20 0 0 0 0 S 0.3 0.0 0:01.27 events/0
36 root 20 0 0 0 0 S 0.3 0.0 0:00.34 events/1
41 root 20 0 0 0 0 S 0.3 0.0 0:00.24 events/6
[root@192 ~]# uptime
11:29:09 up 7 min, 2 users, load average: 0.52, 0.36, 0.18

CPU:vmstat

[root@192 ~]# 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
0 0 0 1313028 21228 203868 0 0 54 3 112 1620 0 1 98 0 0
0 0 0 1312732 21228 203896 0 0 0 0 2579 25940 1 3 96 0 0
0 0 0 1312856 21228 203896 0 0 0 0 2677 24290 1 3 97 0 0

id:处于空闲的CPU百分比

wa:系统等待IO的CPU时间百分比

st:来自于一个虚拟机偷取的CPU时间百分比

查看额外的CPU信息

所有CPU核信息

[root@192 ~]# mpstat -P  ALL 2
Linux 2.6.32-642.el6.x86_64 (192.168.1.101) 08/05/2019 _x86_64_ (8 CPU) 11:42:40 AM CPU %usr %nice %sys %iowait %irq %soft %steal %guest %idle
11:42:42 AM all 1.07 0.00 2.89 0.00 0.00 0.00 0.00 0.00 96.04
11:42:42 AM 0 0.00 0.00 1.52 0.00 0.00 0.00 0.00 0.00 98.48
11:42:42 AM 1 6.09 0.00 9.14 0.00 0.00 0.00 0.00 0.00 84.77
11:42:42 AM 2 0.50 0.00 4.02 0.00 0.00 0.00 0.00 0.00 95.48
11:42:42 AM 3 1.00 0.00 2.00 0.00 0.00 0.00 0.00 0.00 97.00

每个进程使用CPU的用量分解信息

[root@192 ~]# pidstat -u 1 -p 3790
Linux 2.6.32-642.el6.x86_64 (192.168.1.101) 08/05/2019 _x86_64_ (8 CPU) 11:45:00 AM PID %usr %system %guest %CPU CPU Command
11:45:01 AM 3790 6.00 10.00 0.00 16.00 7 java
11:45:02 AM 3790 4.00 11.00 0.00 15.00 7 java
11:45:03 AM 3790 9.00 15.00 0.00 24.00 7 java
11:45:04 AM 3790 7.00 14.00 0.00 21.00 7 java

内存:free

应用程序可用内存数

推荐使用free -m

[root@192 ~]# free -g
total used free shared buffers cached
Mem: 1 0 1 0 0 0
-/+ buffers/cache: 0 1
Swap: 1 0 1
[root@192 ~]# free -m
total used free shared buffers cached
Mem: 1861 553 1308 1 20 199
-/+ buffers/cache: 333 1528
Swap: 2047 0 2047

查看额外

[root@192 ~]# pidstat -p 3823 -r 2
Linux 2.6.32-642.el6.x86_64 (192.168.1.101) 08/05/2019 _x86_64_ (8 CPU) 11:51:16 AM PID minflt/s majflt/s VSZ RSS %MEM Command
11:51:18 AM 3823 1.00 0.00 3234728 47068 2.47 java
11:51:20 AM 3823 2.50 0.00 3234728 47068 2.47 java
11:51:22 AM 3823 0.50 0.00 3234728 47068 2.47 java
11:51:24 AM 3823 2.50 0.00 3234728 47068 2.47 java
11:51:26 AM 3823 0.50 0.00 3234728 47068 2.47 java

硬盘:df

查看磁盘剩余空间

[root@192 ~]# df -h
Filesystem Size Used Avail Use% Mounted on
/dev/sda2 15G 5.6G 8.4G 41% /
tmpfs 931M 72K 931M 1% /dev/shm
/dev/sda1 190M 39M 142M 22% /boot

磁盘IO:iostat

[root@192 ~]# iostat -xdk 2 3
Linux 2.6.32-642.el6.x86_64 (192.168.1.101) 08/05/2019 _x86_64_ (8 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
scd0 0.00 0.00 0.38 0.00 1.50 0.00 8.00 0.00 0.67 0.67 0.00 0.67 0.03
sda 34.33 4.94 47.36 3.18 1631.23 32.44 65.84 0.07 1.38 1.22 3.72 0.88 4.43 Device: rrqm/s wrqm/s r/s w/s rkB/s wkB/s avgrq-sz avgqu-sz await r_await w_await svctm %util
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
sda 0.00 0.00 0.50 0.00 4.00 0.00 16.00 0.00 1.00 1.00 0.00 1.00 0.05 Device: rrqm/s wrqm/s r/s w/s rkB/s wkB/s avgrq-sz avgqu-sz await r_await w_await svctm %util
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
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

查看额外

[root@192 ~]# pidstat -d 2 -p 3485
Linux 2.6.32-642.el6.x86_64 (192.168.1.101) 08/05/2019 _x86_64_ (8 CPU) 02:16:10 PM PID kB_rd/s kB_wr/s kB_ccwr/s Command
02:16:12 PM 3485 0.00 0.00 0.00 java
02:16:14 PM 3485 0.00 0.00 0.00 java
02:16:16 PM 3485 0.00 0.00 0.00 java
02:16:18 PM 3485 0.00 0.00 0.00 java
02:16:20 PM 3485 0.00 0.00 0.00 java
02:16:22 PM 3485 0.00 0.00 0.00 java
02:16:24 PM 3485 0.00 0.00 0.00 java

网络IO:ifstat

默认本地没有,需要下载ifstat

安装ifstat

[root@192 ifstat-1.1]# yum install flex byacc  libpcap ncurses ncurses-devel libpcap-devel gcc-c++
wget http://gael.roualland.free.fr/ifstat/ifstat-1.1.tar.gz
tar xzvf ifstat-1.1.tar.gz
cd ifstat-1.1
./configure
make
make install
[root@192 ifstat-1.1]# ifstat 1
eth0
KB/s in KB/s out
0.06 0.13
0.06 0.12
0.06 0.12
0.06 0.12
0.06 0.12
0.06 0.12
0.12 0.17
0.06 0.12

生产环境出现CPU占用过高,分析思路和定位

public class JavaDemo2 {
public static void main(String[] args) {
while (true){
System.out.println(new java.util.Random().nextInt(77778888));
}
}
}

先用top命令找出CPU占比最高的

  PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND
4294 root 20 0 3158m 37m 11m S 16.6 2.0 0:03.28 java
3428 root 20 0 100m 5444 3396 S 14.3 0.3 0:22.85 sshd
35 root 20 0 0 0 0 S 1.0 0.0 0:03.18 events/0
41 root 20 0 0 0 0 S 0.3 0.0 0:00.52 events/6
2012 root 20 0 199m 5192 4288 S 0.3 0.3 0:00.32 ManagementAgent
1 root 20 0 19344 1544 1228 S 0.0 0.1 0:01.83 init
2 root 20 0 0 0 0 S 0.0 0.0 0:00.02 kthreadd

ps -ef或者jps进一步定位

[root@192 ifstat-1.1]# jps
4320 Jps
4294 JavaDemo2

定位到具体线程或者代码

[root@192 ifstat-1.1]# ps -mp 4294 -o THREAD,tid,time
USER %CPU PRI SCNT WCHAN USER SYSTEM TID TIME
root 18.6 - - - - - - 00:00:15
root 0.0 19 - futex_ - - 4294 00:00:00
root 15.6 19 - n_tty_ - - 4295 00:00:13
root 0.2 19 - futex_ - - 4296 00:00:00
root 0.2 19 - futex_ - - 4297 00:00:00
root 0.3 19 - futex_ - - 4298 00:00:00
root 0.2 19 - futex_ - - 4299 00:00:00
root 0.3 19 - futex_ - - 4300 00:00:00
root 0.3 19 - futex_ - - 4301 00:00:00
root 0.3 19 - futex_ - - 4302 00:00:00
root 0.2 19 - futex_ - - 4303 00:00:00
root 0.0 19 - futex_ - - 4304 00:00:00
root 0.0 19 - futex_ - - 4305 00:00:00
root 0.0 19 - futex_ - - 4306 00:00:00
root 0.0 19 - futex_ - - 4307 00:00:00
root 0.0 19 - futex_ - - 4308 00:00:00
root 0.1 19 - futex_ - - 4309 00:00:00
root 0.0 19 - futex_ - - 4310 00:00:00
root 0.0 19 - futex_ - - 4311 00:00:00
root 0.0 19 - futex_ - - 4312 00:00:00
root 0.0 19 - futex_ - - 4313 00:00:00

-m:显示所有的线程

-p: pid进程使用CPU的时间

-o:该参数后是用户自定义格式

线程ID转换为16进制格式(英文小写格式)

[root@192 ifstat-1.1]# printf "%x\n" 4295
10c7

jstack 进程ID|grep tid(16进制线程ID小写英文) -A60

[root@192 ifstat-1.1]# jstack 4294 | grep 10c7 -A60
"main" #1 prio=5 os_prio=0 tid=0x00007f7f68009000 nid=0x10c7 runnable [0x00007f7f6f117000]
java.lang.Thread.State: RUNNABLE
at java.io.FileOutputStream.writeBytes(Native Method)
at java.io.FileOutputStream.write(FileOutputStream.java:326)
at java.io.BufferedOutputStream.flushBuffer(BufferedOutputStream.java:82)
at java.io.BufferedOutputStream.flush(BufferedOutputStream.java:140)
- locked <0x00000000e2e0e6e0> (a java.io.BufferedOutputStream)
at java.io.PrintStream.write(PrintStream.java:482)
- locked <0x00000000e2e0bbd8> (a java.io.PrintStream)
at sun.nio.cs.StreamEncoder.writeBytes(StreamEncoder.java:221)
at sun.nio.cs.StreamEncoder.implFlushBuffer(StreamEncoder.java:291)
at sun.nio.cs.StreamEncoder.flushBuffer(StreamEncoder.java:104)
- locked <0x00000000e2e0e800> (a java.io.OutputStreamWriter)
at java.io.OutputStreamWriter.flushBuffer(OutputStreamWriter.java:185)
at java.io.PrintStream.newLine(PrintStream.java:546)
- eliminated <0x00000000e2e0bbd8> (a java.io.PrintStream)
at java.io.PrintStream.println(PrintStream.java:737)
- locked <0x00000000e2e0bbd8> (a java.io.PrintStream)
at JavaDemo2.main(JavaDemo2.java:4) "VM Thread" os_prio=0 tid=0x00007f7f68080000 nid=0x10d0 runnable "GC task thread#0 (ParallelGC)" os_prio=0 tid=0x00007f7f6801e800 nid=0x10c8 runnable "GC task thread#1 (ParallelGC)" os_prio=0 tid=0x00007f7f68020000 nid=0x10c9 runnable "GC task thread#2 (ParallelGC)" os_prio=0 tid=0x00007f7f68022000 nid=0x10ca runnable "GC task thread#3 (ParallelGC)" os_prio=0 tid=0x00007f7f68024000 nid=0x10cb runnable "GC task thread#4 (ParallelGC)" os_prio=0 tid=0x00007f7f68025800 nid=0x10cc runnable "GC task thread#5 (ParallelGC)" os_prio=0 tid=0x00007f7f68027800 nid=0x10cd runnable "GC task thread#6 (ParallelGC)" os_prio=0 tid=0x00007f7f68029800 nid=0x10ce runnable "GC task thread#7 (ParallelGC)" os_prio=0 tid=0x00007f7f6802b000 nid=0x10cf runnable "VM Periodic Task Thread" os_prio=0 tid=0x00007f7f680e8000 nid=0x10d9 waiting on condition JNI global references: 5

参考

找到最耗CPU的java线程 - - ITeye博客

本文由博客一文多发平台 OpenWrite 发布!

Linux性能分析的更多相关文章

  1. 【转】一文掌握 Linux 性能分析之网络篇(续)

    [转]一文掌握 Linux 性能分析之网络篇(续) 在上篇网络篇中,我们已经介绍了几个 Linux 网络方向的性能分析工具,本文再补充几个.总结下来,余下的工具包括但不限于以下几个: sar:统计信息 ...

  2. 【转】一文掌握 Linux 性能分析之网络篇

    [转]一文掌握 Linux 性能分析之网络篇 比较宽泛地讲,网络方向的性能分析既包括主机测的网络配置查看.监控,又包括网络链路上的包转发时延.吞吐量.带宽等指标分析.包括但不限于以下分析工具: pin ...

  3. 【转】一文掌握 Linux 性能分析之 I/O 篇

    [转]一文掌握 Linux 性能分析之 I/O 篇 这是 Linux 性能分析系列的第三篇,前两篇分别讲了 CPU 和 内存,本篇来看 IO. IO 和 存储密切相关,存储可以概括为磁盘,内存,缓存, ...

  4. 【转】一文掌握 Linux 性能分析之内存篇

    [转]一文掌握 Linux 性能分析之内存篇 前面我们已经学习了 CPU 篇,这篇来看下内存篇. 01 内存信息 同样在分析内存之前,我们得知到怎么查看系统内存信息,有以下几种方法. 1.1 /pro ...

  5. 【转】一文掌握 Linux 性能分析之 CPU 篇

    [转]一文掌握 Linux 性能分析之 CPU 篇 平常工作会涉及到一些 Linux 性能分析的问题,因此决定总结一下常用的一些性能分析手段,仅供参考. 说到性能分析,基本上就是 CPU.内存.磁盘 ...

  6. 一文掌握 Linux 性能分析之网络篇(续)

    本文首发于我的公众号 Linux云计算网络(id: cloud_dev),专注于干货分享,号内有 10T 书籍和视频资源,后台回复「1024」即可领取,欢迎大家关注,二维码文末可以扫. 这是 Linu ...

  7. 一文掌握 Linux 性能分析之网络篇

    本文首发于我的公众号 Linux云计算网络(id: cloud_dev),专注于干货分享,号内有 10T 书籍和视频资源,后台回复「1024」即可领取,欢迎大家关注,二维码文末可以扫. 这是 Linu ...

  8. 【原创】一文掌握 Linux 性能分析之 I/O 篇

    本文首发于我的公众号 Linux云计算网络(id: cloud_dev),专注于干货分享,号内有 10T 书籍和视频资源,后台回复「1024」即可领取,欢迎大家关注,二维码文末可以扫. 一文掌握 Li ...

  9. 一文掌握 Linux 性能分析之 CPU 篇

    本文首发于我的公众号 Linux云计算网络(id: cloud_dev),专注于干货分享,号内有 10T 书籍和视频资源,后台回复「1024」即可领取,欢迎大家关注,二维码文末可以扫. 平常工作会涉及 ...

  10. Linux 性能分析工具汇总合集

    出于对Linux操作系统的兴趣,以及对底层知识的强烈欲望,因此整理了这篇文章.本文也可以作为检验基础知识的指标,另外文章涵盖了一个系统的方方面面.如果没有完善的计算机系统知识,网络知识和操作系统知识, ...

随机推荐

  1. mysql 时间与字符串相互转换

    时间.字符串.时间戳之间的相互转换:date转字符串.date转时间戳.字符串转date.字符串转时间戳.时间戳转date,时间戳转字符串用法 涉及的函数 date_format(date, form ...

  2. 【SQL server初级】SQL索引(一)

    SQL索引[一](此文章为“数据库性能优化二:数据库表优化”附属文章之一) SQL索引在数据库优化中占有一个非常大的比例, 一个好的索引的设计,可以让你的效率提高几十甚至几百倍,在这里将带你一步步揭开 ...

  3. CMD的最佳“代替品”

    让CMD成为历史 Windows用户大多都使用过"cmd",cmd被称为"阉割版"的DOS系统~ 很多用户除此之外,还喜欢Linux命令行~但是CMD的命令和L ...

  4. wordpress安装主题、插件需要FTP用户名密码

    修改主目录wordpress下的wp-config.php文件,在最结尾加上 define("FS_METHOD", "direct"); define(&qu ...

  5. Event Hub小白入门指南

    Event Hub事件中心 本文的目的在于用最白的大白话,让你从“完全不懂”开始,理解什么是分布式大数据流平台Event Hub,并且理解它的关键概念,并且初步理解其收发数据API. 定义,Event ...

  6. golang面试题--string操作

    题目: 请实现一个算法,确定一个字符串的所有字符[是否全都不同].这里我们要求[不允许使用额外的存储结构].给定一个string,请返回一个bool值,true代表所有字符全都不同,false代表存在 ...

  7. .NET Core ❤ gRPC

    这篇内容主要来自Microsoft .NET团队程序经理Sourabh Shirhatti的博客文章:https://grpc.io/blog/grpc-on-dotnetcore/, .NET Co ...

  8. icon font在sketch中的下载与安装

    icon font的下载安装: 1.首先打开sketch--插件--管理插件--获取插件--搜索 icon font--点击icon font--clone or download--下载的是一个sk ...

  9. maven在线自动更新太慢怎么办?

    使用IDEA和Eclipse开发maven项目时,maven在添加一项新的依赖时,如果发现本地仓库没有,就会向位于国外服务器的中央仓库下载.如果所处网络没有翻墙,下载速度会慢到你想原地爆炸. 这个时候 ...

  10. 在SRAM、FLASH中调试代码的配置方法(附详细步骤)

    因为STM32的FLASH擦写次数有限(大概为1万次),所以为了延长FLASH的使用时间,我们平时调试时可以选择在SRAM中进行硬件调试.除此之外,SRAM 存储器的写入速度比在内部 FLASH 中要 ...