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

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

    • 整机 : top
    • CPU: vmstat
    • 内存: free
    • 硬盘: df 查看字盘剩余空间
    • 磁盘IO: iostat
    • 网络IO: ifstat
    • CPU过高,思路和定位

整机 : top

[root@tesm-jenkins-16-32 ~]# top
top - 15:05:02 up 38 days, 22:30,  1 user,  load average: 0.00, 0.01, 0.05
Tasks: 214 total,   2 running, 212 sleeping,   0 stopped,   0 zombie
%Cpu(s):  0.0 us,  0.0 sy,  0.0 ni,100.0 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
KiB Mem :  8174712 total,  2022928 free,  2040060 used,  4111724 buff/cache
KiB Swap:  8257532 total,  8233776 free,    23756 used.  5691080 avail Mem 

  PID USER      PR  NI    VIRT    RES    SHR S  %CPU %MEM     TIME+ COMMAND                                                                                                                                                             
 1148 root      20   0  916512  11028   2004 S   0.3  0.1  43:25.68 docker-containe                                                                                                                                                     
 2369 root      20   0  157728   2336   1552 R   0.3  0.0   0:00.09 top                                                                                                                                                                 
    1 root      20   0  191184   3080   2060 S   0.0  0.0  10:21.62 systemd                                                                                                                                                             
    2 root      20   0       0      0      0 S   0.0  0.0   0:00.45 kthreadd                                                                                                                                                            
    3 root      20   0       0      0      0 S   0.0  0.0   0:00.16 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.08 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 R   0.0  0.0   1:54.15 rcu_sched                                                                                                                                                           
   10 root      rt   0       0      0      0 S   0.0  0.0   0:10.07 watchdog/0                                                                                                                                                          
   11 root      rt   0       0      0      0 S   0.0  0.0   0:07.01 watchdog/1                                                                                                                                                          
   12 root      rt   0       0      0      0 S   0.0  0.0   0:00.07 migration/1                                                                                                                                                         
   13 root      20   0       0      0      0 S   0.0  0.0   0:00.15 ksoftirqd/1                                                                                                                                                         
   15 root       0 -20       0      0      0 S   0.0  0.0   0:00.00 kworker/1:0H                                                                                                                                                        
   16 root      rt   0       0      0      0 S   0.0  0.0   0:06.91 watchdog/2                                                                                                                                                          
   17 root      rt   0       0      0      0 S   0.0  0.0   0:00.08 migration/2        

主要查看 %CPU 、 %MEM
load average:1分钟 5分钟 15分钟平均负载值(3个值相加/3 * 100% 大于60%说明负载过重)

CPU: vmstat

[root@tesm-jenkins-16-32 ~]# 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
 1  0  23756 2024212      0 4111256    0    0     0     1    1    1  0  0 100  0  0
 0  0  23756 2024244      0 4111364    0    0     0     0  203  225  0  0 100  0  0
 0  0  23756 2024212      0 4111364    0    0     0     4  199  214  0  0 100  0  0

一般vmstat工具的使用是通过两个参数完成的,
第一个参数是采样的时间间隔数,单位是秒。
第二个参数是采样的次数

  • procs
  • r: 运行和等待CPU时间片的进程树,原则上1核的CPU的运行队列不要超过2,整个系统的运行队列不能超过总核数的2倍,否则代表系统压力过大。
  • b: 等待资源的进程数,比如正在等待磁盘I/O、网络I/O等
  • cpu
  • us: 用户进程消耗CPU时间百分比,us值高,用户进程消耗CPU时间多,如果长期大于50%,优化程序。
  • sy: 内核进程消耗的CPU时间百分比
  • id: 处于空闲的CPU百分比
  • wa:系统等待IO的CPU时间百分比
  • st: 来自于一个虚拟机偷取的CPU时间的百分比
    如果us+sy参考值为80%,说明可能存在CPU不足

额外的命令:
查看所有CPU核信息(每隔2秒): mpstat -P ALL 2

[root@tesm-jenkins-16-32 ~]# mpstat -P ALL 2
Linux 3.10.0-693.21.1.el7.x86_64 (tesm-jenkins-16-32)   06/13/2019      _x86_64_        (8 CPU)

03:21:27 PM  CPU    %usr   %nice    %sys %iowait    %irq   %soft  %steal  %guest  %gnice   %idle
03:21:29 PM  all    0.06    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00   99.94
03:21:29 PM    0    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00  100.00
03:21:29 PM    1    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00  100.00
03:21:29 PM    2    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00  100.00
03:21:29 PM    3    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00  100.00
03:21:29 PM    4    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00  100.00
03:21:29 PM    5    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00  100.00
03:21:29 PM    6    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00  100.00
03:21:29 PM    7    0.50    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00   99.50

03:21:29 PM  CPU    %usr   %nice    %sys %iowait    %irq   %soft  %steal  %guest  %gnice   %idle
03:21:31 PM  all    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00  100.00
03:21:31 PM    0    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00  100.00
03:21:31 PM    1    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00  100.00
03:21:31 PM    2    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00  100.00
03:21:31 PM    3    0.50    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00   99.50
03:21:31 PM    4    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00  100.00
03:21:31 PM    5    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00  100.00
03:21:31 PM    6    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00  100.00
03:21:31 PM    7    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00  100.00

每个进程使用CPU核信息(每个1秒): pidstat -u 1 -p 进程号

[root@tesm-jenkins-16-32 ~]# ps -ef | grep java
jenkins   1214     1  0 May05 ?        01:04:00 /etc/alternatives/java -Dcom.sun.akuma.Daemon=daemonized -Djava.awt.headless=true -DJENKINS_HOME=/opt/jenkins -jar /opt/jenkins/jenkins.war --logfile=/var/log/jenkins/jenkins.log --webroot=/var/cache/jenkins/war --daemon --httpPort=8080 --debug=5 --handlerCountMax=100 --handlerCountMaxIdle=20
root      3250  2304  0 15:22 pts/0    00:00:00 grep --color=auto java
[root@tesm-jenkins-16-32 ~]# pidstat -u 1 -p 1214
Linux 3.10.0-693.21.1.el7.x86_64 (tesm-jenkins-16-32)   06/13/2019      _x86_64_        (8 CPU)

03:22:52 PM   UID       PID    %usr %system  %guest    %CPU   CPU  Command
03:22:53 PM   997      1214    0.00    0.00    0.00    0.00     0  java
03:22:54 PM   997      1214    0.00    0.00    0.00    0.00     0  java
03:22:55 PM   997      1214    0.00    1.00    0.00    1.00     0  java
03:22:56 PM   997      1214    0.00    0.00    0.00    0.00     0  java
03:22:57 PM   997      1214    0.00    0.00    0.00    0.00     0  java
03:22:58 PM   997      1214    0.00    0.00    0.00    0.00     0  java

内存: free

free -m

[root@tesm-jenkins-16-32 ~]# free -m 
              total        used        free      shared  buff/cache   available
Mem:           7983        1992        1974          56        4015        5557
Swap:          8063          23        8040

每个进程使用内存信息(每个1秒): pidstat -r 1 -p 进程号

[root@tesm-jenkins-16-32 ~]# pidstat -r 1 -p 1214
Linux 3.10.0-693.21.1.el7.x86_64 (tesm-jenkins-16-32)   06/13/2019      _x86_64_        (8 CPU)

03:29:53 PM   UID       PID  minflt/s  majflt/s     VSZ    RSS   %MEM  Command
03:29:54 PM   997      1214      0.00      0.00 8033372 1636384  20.02  java
03:29:55 PM   997      1214      0.00      0.00 8033372 1636384  20.02  java
03:29:56 PM   997      1214      0.00      0.00 8033372 1636384  20.02  java
03:29:57 PM   997      1214      0.00      0.00 8033372 1636384  20.02  java

硬盘: df 查看字盘剩余空间

df -h

[root@tesm-jenkins-16-32 ~]# df -h
Filesystem               Size  Used Avail Use% Mounted on
/dev/mapper/centos-root   48G   24G   25G  50% /
devtmpfs                 3.9G     0  3.9G   0% /dev
tmpfs                    3.9G     0  3.9G   0% /dev/shm
tmpfs                    3.9G   57M  3.9G   2% /run
tmpfs                    3.9G     0  3.9G   0% /sys/fs/cgroup
/dev/sda1               1014M  210M  805M  21% /boot
/dev/mapper/centos-home   24G  8.4G   15G  36% /home
tmpfs                    799M     0  799M   0% /run/user/0

磁盘IO: iostat

iostat -xdk 2 3

[root@tesm-jenkins-16-32 ~]# iostat -xdk 2 3
Linux 3.10.0-693.21.1.el7.x86_64 (tesm-jenkins-16-32)   06/13/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
sda               0.00     0.02    0.05    0.32     1.03     9.55    57.10     0.00    7.22    5.69    7.48   0.54   0.02
dm-0              0.00     0.00    0.05    0.33     1.01     9.54    54.79     0.00    9.12    5.58    9.67   0.48   0.02
dm-1              0.00     0.00    0.00    0.00     0.00     0.01     8.39     0.00   51.80  178.42   13.19   5.43   0.00
dm-2              0.00     0.00    0.00    0.00     0.02     0.00    19.97     0.00    1.22    1.77    0.15   1.20   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.50    0.00     4.00     0.00    16.00     0.01   24.00   24.00    0.00  24.00   1.20
dm-0              0.00     0.00    0.50    0.00     4.00     0.00    16.00     0.01   24.00   24.00    0.00  24.00   1.20
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
dm-2              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    1.00     0.00     4.00     8.00     0.00    0.00    0.00    0.00   0.00   0.00
dm-0              0.00     0.00    0.00    1.00     0.00     4.00     8.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
dm-2              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

磁盘块设备分布
以上各列的含义如下:
rrqm/s: 每秒对该设备的读请求被合并次数,文件系统会对读取同块(block)的请求进行合并
wrqm/s: 每秒对该设备的写请求被合并次数
r/s: 每秒完成的读次数
w/s: 每秒完成的写次数
rkB/s: 每秒读数据量(kB为单位)
wkB/s: 每秒写数据量(kB为单位)
avgrq-sz:平均每次IO操作的数据量(扇区数为单位)
avgqu-sz: 平均等待处理的IO请求队列长度
await: 平均每次IO请求等待时间(包括等待时间和处理时间,毫秒为单位)
svctm: 平均每次IO请求的处理时间(毫秒为单位)
%util: 采用周期内用于IO操作的时间比率,即IO队列非空的时间比率
重点关注参数

1、iowait% 表示CPU等待IO时间占整个CPU周期的百分比,如果iowait值超过50%,或者明显大于%system、%user以及%idle,表示IO可能存在问题。

2、avgqu-sz 表示磁盘IO队列长度,即IO等待个数。

3、await 表示每次IO请求等待时间,包括等待时间和处理时间

4、svctm 表示每次IO请求处理的时间

5、%util 表示磁盘忙碌情况,一般该值超过80%表示该磁盘可能处于繁忙状态。
rkB/s、wkB/s根据系统应用不同会有不同的值,担忧规律遵循:长期、超大数据读写,肯定不正常,需要优化程序读取。
svctm 、await 的值很接近,标识巨虎没有I/O等待,磁盘性能好,如果await的值远高于svctm的值,则表示I/O队列等待太长,需要优化程序或更换磁盘。

每个进程使用磁盘信息(每个1秒): pidstat -d 1 -p 进程号

[root@tesm-jenkins-16-32 ~]# pidstat -d 1 -p 1214
Linux 3.10.0-693.21.1.el7.x86_64 (tesm-jenkins-16-32)   06/13/2019      _x86_64_        (8 CPU)

04:41:17 PM   UID       PID   kB_rd/s   kB_wr/s kB_ccwr/s  Command
04:41:18 PM   997      1214      0.00      0.00      0.00  java
04:41:19 PM   997      1214      0.00      8.00      0.00  java
04:41:20 PM   997      1214      0.00      0.00      0.00  java
04:41:21 PM   997      1214      0.00      0.00      0.00  java
04:41:22 PM   997      1214      0.00      0.00      0.00  java

网络IO: ifstat

1、卸载原装ifstat
find / -name ifstat
把/usr/sbin/ifstat、ifstat的man目录的.gz文件删除
2、下载安装
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
cp ifstat /usr/sbin/

[root@node3 ifstat-1.1]# ifstat 1
       eth0                eth1              docker0      
 KB/s in  KB/s out   KB/s in  KB/s out   KB/s in  KB/s out
    0.00      0.00     19.05   1377.84      0.00      0.00
    0.00      0.00     19.54   1388.09      0.00      0.00
    0.00      0.00     19.39   1282.41      0.00      0.00
    0.00      0.00     19.78   1392.49      0.00      0.00
    0.00      0.00     19.85   1403.73      0.00      0.00
    0.00      0.00     20.42   1383.93      0.00      0.00
    0.00      0.00     18.46   1278.94      0.00      0.00
    0.00      0.00     19.80   1399.47      0.00      0.00
    0.00      0.00     18.27   1271.58      0.00      0.00
    0.00      0.00     17.58   1268.47      0.00      0.00
    0.00      0.00     19.60   1392.27      0.00      0.00
    0.00      0.00     20.13   1393.69      0.00      0.00
    0.00      0.00     19.90   1386.89      0.00      0.00
    0.00      0.00     18.04   1277.04      0.00      0.00
    0.00      0.00     21.35   1513.58      0.00      0.00
    0.00      0.00     18.23   1283.19      0.00      0.00
    0.00      0.00     17.93   1275.76      0.00      0.00

各个网卡的in、out,观察网络负载情况,程序网络读写是否正常
–程序网络I/O优化
–增加网络I/O宽带

CPU过高,思路和定位

  1. 先用top命令找出CPU占比最高的
top - 09:11:37 up 21 min,  3 users,  load average: 0.54, 0.25, 0.16
Tasks:  94 total,   1 running,  93 sleeping,   0 stopped,   0 zombie
%Cpu(s):  3.0 us,  6.4 sy,  0.0 ni, 89.3 id,  0.0 wa,  0.0 hi,  1.3 si,  0.0 st
KiB Mem :   499428 total,    81452 free,   131984 used,   285992 buff/cache
KiB Swap:  1572860 total,  1572860 free,        0 used.   325184 avail Mem 

  PID USER      PR  NI    VIRT    RES    SHR S %CPU %MEM     TIME+ COMMAND                                                                                                                                                              
 2485 root      20   0 2024360  25616  12256 S  8.6  5.1   0:08.54 java                                                                                                                                                                 
 2436 root      20   0  154608   5500   4132 S  1.3  1.1   0:01.50 sshd                                                                                                                                                                 
  580 root      20   0  376240   9256   6804 S  0.3  1.9   0:00.20 NetworkManager                                                                                                                                                       
 1331 root      20   0       0      0      0 S  0.3  0.0   0:00.41 kworker/0:1                                                                                                                                                          
    1 root      20   0  128036   6604   4144 S  0.0  1.3   0:01.48 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.08 ksoftirqd/0                                                                                                                                                          
    5 root       0 -20       0      0      0 S  0.0  0.0   0:00.00 kworker/0:0H                                                                                                                                                         
    6 root      20   0       0      0      0 S  0.0  0.0   0:00.01 kworker/u2:0                                                                                                                                                         
    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:00.53 rcu_sched       
  1. ps -ef 或者jps进一步定位,得知是一个怎样的一个后台程序给我们惹事
[root@node3 ~]# jps -l
2516 sun.tools.jps.Jps
2485 com.wu.pratice.jvm.UnableCreateNewThreadDemo
1413 -- process information unavailable
7162 -- process information unavailable
[root@node3 ~]# ps -ef | grep java
root      2485  2440  8 09:09 pts/2    00:00:26 java com.wu.pratice.jvm.UnableCreateNewThreadDemo
root      2527  2495  0 09:14 pts/1    00:00:00 grep --color=auto java
  1. 定位到具体线程或代码
    ps -mp 进程 -o THREAD,tid,time
    -m 显示所有的线程
    -p 指定进程id
    -o 该参数后是用户自定义格式
[root@node3 ~]# ps -mp 2485 -o THREAD,tid,time
USER     %CPU PRI SCNT WCHAN  USER SYSTEM   TID     TIME
root      8.5   -    - -         -      -     - 00:00:30
root      0.0  19    - futex_    -      -  2485 00:00:00
root      8.3  19    - n_tty_    -      -  2486 00:00:29
root      0.0  19    - futex_    -      -  2487 00:00:00
root      0.0  19    - futex_    -      -  2488 00:00:00
root      0.0  19    - futex_    -      -  2489 00:00:00
root      0.0  19    - futex_    -      -  2490 00:00:00
root      0.0  19    - futex_    -      -  2491 00:00:00
root      0.0  19    - futex_    -      -  2492 00:00:00
root      0.0  19    - futex_    -      -  2493 00:00:00
root      0.0  19    - futex_    -      -  2494 00:00:00
  1. 将需要的线程ID转换为16进制格式(英文小写格式)
    printf “%x\n” 2486
    2486的16进制为9B6
  2. jstack 进程ID | grep tid(16进程线程ID小写英文) -A60
    -A 显示多少行
[root@node3 ~]# jstack 2485 | grep 9b6 -A60
"main" #1 prio=5 os_prio=0 tid=0x00007f165004b800 nid=0x9b6 runnable [0x00007f16590c3000]
   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 <0x00000000fac20580> (a java.io.BufferedOutputStream)
        at java.io.PrintStream.write(PrintStream.java:482)
        - locked <0x00000000fac18170> (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 <0x00000000fac18128> (a java.io.OutputStreamWriter)
        at java.io.OutputStreamWriter.flushBuffer(OutputStreamWriter.java:185)
        at java.io.PrintStream.newLine(PrintStream.java:546)
        - eliminated <0x00000000fac18170> (a java.io.PrintStream)
        at java.io.PrintStream.println(PrintStream.java:807)
        - locked <0x00000000fac18170> (a java.io.PrintStream)
        at com.wu.pratice.jvm.UnableCreateNewThreadDemo.main(UnableCreateNewThreadDemo.java:24)

"VM Thread" os_prio=0 tid=0x00007f16500cb800 nid=0x9b7 runnable 

"VM Periodic Task Thread" os_prio=0 tid=0x00007f165011a000 nid=0x9be waiting on condition 

JNI global references: 5

你可能感兴趣的:(运维,面试)