常用Linxu系统监控命令

一、常用监控命令
netstat -natp  :  查看对应的网络链接,关注下Recv-Q , Send-Q , State。
lsof -p pid :  查找对应pid的文件句柄
lsof -i : 80  : 查找对应端口被哪个进程占用
lsof  /tmp/1.txt :查找对应文件被哪个进程占用
ulimit -a: 系统限制设置

二、查看Linux下Java线程
1.ps -mp pid -o THREAD,tid,time 或 ps -Lfp pid   
含义:主要是可以获取到对应一个进程下的线程的一些信息。 比如你想分析一下一个java进程的一些运行瓶颈点,可以通过该命令找到所有当前Thread的占用CPU的时间,也就是这里的最后一列。
[bppf_bgw@devappdb001 /]$ ps -mp 16592 -o THREAD,tid,time
USER     %CPU PRI SCNT WCHAN  USER SYSTEM   TID     TIME
bppf_bgw  0.1   -    - -         -      -     - 00:00:03
bppf_bgw  0.0  19    - futex_    -      - 16592 00:00:00
bppf_bgw  0.0  19    - inet_c    -      - 16593 00:00:01
bppf_bgw  0.0  19    - futex_    -      - 16594 00:00:00
bppf_bgw  0.0  19    - futex_    -      - 16595 00:00:00
bppf_bgw  0.0  19    - futex_    -      - 16596 00:00:00
bppf_bgw  0.0  19    - futex_    -      - 16597 00:00:00
bppf_bgw  0.0  19    - futex_    -      - 16598 00:00:00



2.ps xH 查看所有存在的线程。

3.ps -mp 查看一个进程起的线程数。

4.pstree -pu 16592() 树状线程图

5.top -Hp pid 实时的跟踪并获取指定进程中最耗cpu的线程

三、定位I/O瓶颈
1.mpstat -P ALL 1 1000
[bppf_bgw@devappdb001 /]$ mpstat -P ALL 1 1000
Linux 2.6.32-131.0.15.el6.x86_64 (devappdb001)     2014年11月12日     _x86_64_    (16 CPU)

11时59分11秒  CPU    %usr   %nice    %sys %iowait    %irq   %soft  %steal  %guest   %idle
11时59分12秒  all    0.18    0.00    0.48    0.00    0.00    0.00    0.00    0.00   99.34
11时59分12秒    0    0.98    0.00    0.98    0.00    0.00    0.00    0.00    0.00   98.04
11时59分12秒    1    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00  100.00
11时59分12秒    2    0.00    0.00    0.97    0.00    0.00    0.00    0.00    0.00   99.03
11时59分12秒    3    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00  100.00
11时59分12秒    4    1.98    0.00    5.94    0.00    0.00    0.00    0.00    0.00   92.08
11时59分12秒    5    1.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00   99.00
11时59分12秒    6    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00  100.00
11时59分12秒    7    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00  100.00
11时59分12秒    8    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00  100.00
11时59分12秒    9    0.00    0.00    0.98    0.00    0.00    0.00    0.00    0.00   99.02
11时59分12秒   10    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00  100.00
11时59分12秒   11    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00  100.00
11时59分12秒   12    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00  100.00
11时59分12秒   13    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00  100.00
11时59分12秒   14    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00  100.00
11时59分12秒   15    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00  100.00



注意一下这里面的%iowait列,CPU等待I/O操作所花费的时间。这个值持续很高通常可能是I/O瓶颈所导致的。
通过这个参数可以比较直观的看出当前的I/O操作是否存在瓶颈

2. iostat命令
[bppf_bgw@devappdb001 /]$ iostat -m -x 1 1000
Linux 2.6.32-131.0.15.el6.x86_64 (devappdb001)     2014年11月12日     _x86_64_    (16 CPU)

avg-cpu:  %user   %nice %system %iowait  %steal   %idle
           0.71    0.00    0.69    0.03    0.00   98.57

Device:         rrqm/s   wrqm/s     r/s     w/s    rMB/s    wMB/s avgrq-sz avgqu-sz   await  svctm  %util
cciss/c0d0        0.68    21.53    0.86   49.56     0.03     0.28    12.45     0.06    1.09   0.10   0.49



同样可以观察对应的CPU中的%iowait数据,除此之外iostat还提供了一些更详细的I/O状态数据,比如比较重要的有:
avgqu-sz :  The average queue length of the requests that were issued to the device. (磁盘队列的请求长度,正常的话2,3比较好。可以和cpu的load一样的理解)
await : The average time (in milliseconds) for I/O requests issued to the device to be served. (代表一个I/O操作从wait到完成的总时间)
svctm和%util都是代表处理该I/O请求花费的时间和CPU的时间比例。 判断是否瓶颈时,这两个参数不是主要的
 
r/s w/s 和 rMB/s  wMB/s 都是代表当前系统处理的I/O的一些状态,前者是我们常说的tps,后者就是吞吐量。这也是评价一个系统的性能指标

3.pid命令
命令: pidstat -p pid -u -d -t -w -h 1 1000
[bppf_bgw@devappdb001 /]$ pidstat -p 24290 -u -d -t -w -h 1 1000
Linux 2.6.32-131.0.15.el6.x86_64 (devappdb001)     2014年11月12日     _x86_64_    (16 CPU)

#      Time      TGID       TID    %usr %system  %guest    %CPU   CPU   kB_rd/s   kB_wr/s kB_ccwr/s   cswch/s nvcswch/s  Command
 1415768183     24290         0    0.00    0.00    0.00    0.00     6      0.00      0.00      0.00      0.00      0.00  java
 1415768183         0     24290    0.00    0.00    0.00    0.00     6      0.00      0.00      0.00      0.00      0.00  |__java
 1415768183         0     24293    0.00    0.00    0.00    0.00     1      0.00      0.00      0.00      0.00      0.00  |__java
 1415768183         0     24294    0.00    0.00    0.00    0.00     6      0.00      0.00      0.00      0.00      0.00  |__java
 1415768183         0     24295    0.00    0.00    0.00    0.00    12      0.00      0.00      0.00      0.00      0.00  |__java
 1415768183         0     24296    0.00    0.00    0.00    0.00     1      0.00      0.00      0.00      0.00      0.00  |__java
 1415768183         0     24297    0.00    0.00    0.00    0.00     5      0.00      0.00      0.00      0.00      0.00  |__java
 1415768183         0     24298    0.00    0.00    0.00    0.00    10      0.00      0.00      0.00      0.00      0.00  |__java
 1415768183         0     24299    0.00    0.00    0.00    0.00    11      0.00      0.00      0.00      0.00      0.00  |__java



相当实用的一个命令,可以基于当个进程分析对应的性能数据,包括CPU,I/O,IR , CS等,可以方便开发者更加精细化的观察系统的运行状态。不过pidstat貌似是在2.6内核的一些较新的版本才有,需要安装sysstat包。
ubuntu下,可以通过sudo apt-get install sysstat进行安装。

4.dstat命令
命令:dstat -y --tcp 1 1000
[bppf_bgw@devappdb001 /]$ dstat -y --tcp 1 1000
---system-- ----tcp-sockets----
 int   csw |lis act syn tim clo
3006    40k|103 314   1  17  12
5757  7452 |103 311   1  20  12
3494  5368 |103 314   1  20  12
3224    12k|103 316   1  20  12
2962  4799 |103 313   2  18  12



通过dstat --tcp可以比较方便的看到当前的tcp的各种状态,不需要每次netstat -nat去看

四、Java定位CPU使用100%的方法
1:找到导致cpu高的线程
[bppf@CSHJ_QZJK2 ~]$ top -H -p 27927
top - 10:20:30 up 206 days, 22:21, 21 users,  load average: 0.73, 1.36, 0.80
Tasks:   1 total,   0 running,   1 sleeping,   0 stopped,   0 zombie
Cpu(s):  0.9%us,  2.0%sy,  0.0%ni, 96.8%id,  0.2%wa,  0.0%hi,  0.0%si,  0.0%st
Mem:  32866796k total, 26710720k used,  6156076k free,   500100k buffers
Swap: 16776184k total,  1008696k used    , 15767488k free,  4148764k cached

  PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND                                                                                                                 
27927 bppf_fas  20   0 51288  25m  24m S 22.0  0.1 160:48.62 fasadmin     

                                                          

 对应的线程id是十进制的,需要转换为十六进制的在threaddump文件中才可以看到

2:十进制转十六进制
[bppf@CSHJ_QZJK2 ~]$ printf "%x\n" 27927
6d17

3:找到对应的线程
jstack 27927 | less
查找:/0x6d17
找到对应的线程,把相关的方法找出来,可以精确到代码的行号,修改相关源码来fix bug。


你可能感兴趣的:(Linux,监控,iostat,Java,开发)