监控操作系统的CPU、内存、磁盘

Linux

  四大件:CPU、内存、磁盘、网络

CPU

  就像人的大脑,主要负责相关事情的判断以及实际处理的机制。

  CPU的性能主要体现在其运行程序的速度上。影响运行速度的性能指标包括CPU的工作频率、Cache容量、指令系统和逻辑结构等参数。  

  查询指令:cat /proc/cpuinfo 

[root@besttest ~]# cat /proc/cpuinfo
processor    : 0
vendor_id    : GenuineIntel
cpu family    : 6
model        : 60
model name    : Intel(R) Core(TM) i5-4200H CPU @ 2.80GHz
stepping    : 3
cpu MHz        : 2793.600
cache size    : 3072 KB
fdiv_bug    : no
hlt_bug        : no
f00f_bug    : no
coma_bug    : no
fpu        : yes
fpu_exception    : yes
cpuid level    : 13
wp        : yes
flags        : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts mmx fxsr sse sse2 ss nx pdpe1gb rdtscp lm constant_tsc up arch_perfmon pebs bts xtopology tsc_reliable nonstop_tsc aperfmperf unfair_spinlock pni pclmulqdq ssse3 fma cx16 pcid sse4_1 sse4_2 x2apic movbe popcnt aes xsave avx f16c rdrand hypervisor lahf_lm ida arat epb pln pts dts fsgsbase smep
bogomips    : 5587.20
clflush size    : 64
cache_alignment    : 64
address sizes    : 40 bits physical, 48 bits virtual
power management:

内存

  大脑中的记忆区块,将皮肤、眼睛等所收集到的信息记录起来的地方,以供CPU进行判断。

  影响内存的性能主要是内存主频、内容容量。
  查询指令:cat /proc/meminfo

[root@besttest ~]# cat /proc/meminfo
MemTotal:        1030684 kB
MemFree:          582612 kB
Buffers:           13980 kB
Cached:           203776 kB
SwapCached:            0 kB
Active:           220116 kB
Inactive:         172660 kB
Active(anon):     175152 kB
Inactive(anon):      828 kB
Active(file):      44964 kB
Inactive(file):   171832 kB
Unevictable:           0 kB
Mlocked:               0 kB
HighTotal:        141256 kB
HighFree:            280 kB
LowTotal:         889428 kB
LowFree:          582332 kB
SwapTotal:       2064376 kB
SwapFree:        2064376 kB
Dirty:                28 kB
Writeback:             0 kB
AnonPages:        175044 kB
Mapped:            35000 kB
Shmem:               956 kB
Slab:              38844 kB
SReclaimable:       7696 kB
SUnreclaim:        31148 kB
KernelStack:        2328 kB
PageTables:         4460 kB
NFS_Unstable:          0 kB
Bounce:                0 kB
WritebackTmp:          0 kB
CommitLimit:     2579716 kB
Committed_AS:    1906944 kB
VmallocTotal:     122880 kB
VmallocUsed:        4744 kB
VmallocChunk:     104020 kB
HugePages_Total:       0
HugePages_Free:        0
HugePages_Rsvd:        0
HugePages_Surp:        0
Hugepagesize:       2048 kB
DirectMap4k:       10232 kB
DirectMap2M:      897024 kB

磁盘

  大脑中的记忆区块,将重要的数据记录起来,以便未来再次使用这些数据。

  容量、转速、平均访问时间、传输速率、缓存。
  查询指令:fdisk -l (需要root权限)

[root@besttest ~]# fdisk -l 

Disk /dev/sda: 21.5 GB, 21474836480 bytes
255 heads, 63 sectors/track, 2610 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x000b18c2

   Device Boot      Start         End      Blocks   Id  System
/dev/sda1   *           1          64      512000   83  Linux
Partition 1 does not end on cylinder boundary.
/dev/sda2              64        2611    20458496   8e  Linux LVM

Disk /dev/mapper/vg_besttest-lv_root: 18.8 GB, 18832424960 bytes
255 heads, 63 sectors/track, 2289 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x00000000


Disk /dev/mapper/vg_besttest-lv_swap: 2113 MB, 2113929216 bytes
255 heads, 63 sectors/track, 257 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x00000000

CPU、内存、磁盘有什么依赖关系么?CPU只在内存里面工作, 内存大,运行的空间越大。CPU内部也有一块缓存,但是特别小,别指望它能有大作为,CPU也可以在缓存内干活,但是大部分是在内存里面干活。内存是临时的,掉电就会被清空。关系型数据库全部存磁盘,非关系型数据库作缓存就存放在内存里面,不做缓存就放硬盘上,像redis是在内存里面,数据从哪来?从mysql里面推过来。

举个例子:我们在加工生产,有工人、车间、仓库。工人类比成CPU,干活;车间类比成车间,工人在车间内工作生产,加工的材料就是仓库里面来的,相当于从磁盘拿数据,加工完成后放进仓库,也就是将数据放入硬盘;仓库类比成硬盘,最终存放产品放在仓库,相当于往磁盘存放数据;

比如说我们数据库的update和insert一下,操作是在内存里面做的,update/insert完成后,再从内存内写入到磁盘内部,后面只是个同步过程。

断电为什么容易丢数据?因为操作是在内存里面,内存断电会被释放,还来不及同步到数据库内,所以数据库内并未做任何更改,就形成了丢数据的现场。

再比方说觉得生产效率不高,想提高效率,要从哪几方面取提升???

最快的方法是人多,也就是CPU的颗粒数增多;车间够大,能处理的物料就更多,也就是内存大;仓库大,物料多。

Linux性能监控分析命令:

  • vmstat
  • sar
  • iostat
  • top
  • free
  • uptime
  • netstat
  • ps
  • strace
  • lsof

CPU

  1、top:看CPU使用率有没有问题(平均负载和cpu的us和sy)

top命令能够实时监控系统的运行状态,并且可以按照CPU、内存和执行时间进行排序,同时top命令还可以通过交互式命令进行设定显示,通过top命令可以查看即时活跃的进行。

命令行启动参数:
用法: top -hv | -bcisSHM -d delay -n iterations [-u user | -U user] -p pid [,pid ...]

    -b : 批次模式运行。通常用作来将top的输出的结果传送给其他程式或储存成文件
    -c : 显示执行任务的命令行
    -d : 设定延迟时间
    -h : 帮助
    -H : 显示线程。当这个设定开启时,将显示所有进程产生的线程
    -i : 显示空闲的进程
    -n : 执行次数。一般与-b搭配使用
    -u : 监控指定用户相关进程
    -U : 监控指定用户相关进程
    -p : 监控指定的进程。当监控多个进程时,进程ID以逗号分隔。这个选项只能在命令行下使用
    -s : 安全模式操作
    -S : 累计时间模式
    -v : 显示top版本,然后退出。
    -M : 自动显示内存单位(k/M/G)

1.全局命令

    回车、空格 : 刷新显示信息
    ?、h : 帮助
    = : 移除所有任务显示的限制
    A : 交替显示模式切换
    B : 粗体显示切换
    d、s : 更改界面刷新时间间隔
    G : 选择其它窗口/栏位组
    I : Irix或Solaris模式切换
    u、U : 监控指定用户相关进程
    k : 结束进程
    q : 退出top
    r : 重新设定进程的nice值
    W : 存储当前设定
    Z : 改变颜色模板

2.摘要区命令

    l : 平均负载及系统运行时间显示开关
    m : 内存及交换空间使用率显示开关
    t : 当前任务及CPU状态显示开关
    1 : 汇总显示CPU状态或分开显示每个CPU状态

3.任务区命令
外观样式

    b : 黑体/反色显示高亮的行/列。控制x和y交互命令的显示样式
    x : 高亮显示排序的列
    y : 高亮显示正在运行的任务
    z : 彩色/黑白显示。

显示内容

    c : 任务执行的命令行或进程名称
    f、o : 增加和移除进程信息栏位及调整进程信息栏位显示顺序
    H : 显示线程
    S : 时间累计模式
    u : 监控指定用户相关进程

任务显示的数量

    i : 显示空闲的进程
    n或# : 设置任务显示最大数量

任务排序(shift+f)

    M : 按内存使用率排序
    N : 按PID排序
    P : 按CPU使用率排序
    T : 按Time+排序
    < : 按当前排序栏位左边相邻栏位排序
    > : 按当前排序栏位右边相邻栏位排序
    F 或 O : 选择排序栏位
    R : 反向排序
top命令

 以下是top命令内容:

# top
top - 15:15:51 up  1:37,  1 user,  load average: 0.00, 0.00, 0.00  ##load average指平均负载:1min,5min,15min
Tasks: 104 total,   1 running, 103 sleeping,   0 stopped,   0 zombie  ##Tasks表示任务数
Cpu(s):  0.0%us,  0.0%sy,  0.0%ni, 99.7%id,  0.0%wa,  0.0%hi,  0.3%si,  0.0%st  ##Cpu(s)显示的是总的Cpu数,按下1,s会消失,会显示出各Cpu使用率
##Cpu使用率:用户态CPU,系统态CPU,nice,idle空闲,wa,si,st
Mem: 1030684k total, 461216k used, 569468k free, 18056k buffers Swap: 2064376k total, 0k used, 2064376k free, 206420k cached ##每个进程的CPU使用率: PID USER PR NI VIRT RES SHR S
%CPU %MEM TIME+ COMMAND  #%CPU-每个进程的CPU百分比,如果咱们有2核,这里单个进程的CPU使用率可能会大于200%
##进程号,所属用户,PR,NI,虚拟内存,常驻内存,共享内存,S,CPU使用率,内存使用率,TIME+,COMMAND
1 root 20 0 2904 1420 1212 S 0.0 0.1 0:01.26 init 2 root 20 0 0 0 0 S 0.0 0.0 0:00.00 kthreadd 3 root RT 0 0 0 0 S 0.0 0.0 0:00.00 migration/0 4 root 20 0 0 0 0 S 0.0 0.0 0:00.11 ksoftirqd/0 5 root RT 0 0 0 0 S 0.0 0.0 0:00.00 migration/0 6 root RT 0 0 0 0 S 0.0 0.0 0:00.03 watchdog/0 7 root 20 0 0 0 0 S 0.0 0.0 0:00.30 events/0 8 root 20 0 0 0 0 S 0.0 0.0 0:00.00 cgroup 9 root 20 0 0 0 0 S 0.0 0.0 0:00.00 khelper 10 root 20 0 0 0 0 S 0.0 0.0 0:00.00 netns

平均负载,那么什么是平均负载呢?

  有内在因素和外在因素两个方面。内在因素:CPU正在调度的进程数,外在因素:正在等待I/O的进程数,正在等待CPU的进程。为什么等待I/O也会产生负载呢?因为等待I/O会发生上下文切换

  所以,平均负载=CPU正在调度的进程数+正在等待I/O的进程数+正在等待CPU的进程

那么负载什么情况下就好,什么情况下就差?

  一般来讲,平均负载为CPU颗粒数就是发挥最大性能的时候,颗粒数为2,负载为2之内就算合理。如果平均负载值>CPU颗粒数,那么就会发生排队。排队是什么在排?是进程在排队,进程排队等待CPU去处理。

是不是平均负载高,CPU使用率就高;负载低,CPU使用率就一定低呢?

  答案当然是 no !因为负载是CPU正在调度进程数+正在等待I/O的进程数+正在等待CPU的进程,而CPU使用率指的是单位时间内 CPU 繁忙情况的统计

  什么情况下CPU使用率高,负载低呢?一个进程占了所有的CPU,那么CPU使用率很高,负载比较低

  负载高,CPU使用率低的情况:CPU使用率不高,正在调度的进程不多,但是有大量的进程在等待I/O。这样也会使得负载高,CPU使用率低。

CPU(s) 行的解释:

Cpu(s):  0.3%us,  0.0%sy,  0.0%ni, 99.7%id,  0.0%wa,  0.0%hi,  0.0%si,  0.0%st

%us:用户态进程,就是应用程序的进程;%sys就是内核态进程

问一个情况:user列全都是root用户,那么这些pid是属于用户的进程还是系统的进程?当然是用户的,root也是个用户嘛。我们希望用户态进程比例更大,因为这样证明cpu都被自己的应用程序消耗,cpu花时间在了自己的应用程序上

ni是什么?优先级,优先级由谁定?由PR定,默认都是20,数字越小,优先级越高区间在-19~20之间

 主要看:us 和 sy 这俩的和是CPU使用率(不是平均负载哦)
us:用户消耗cpu,用户进程,应用程序进程,我们希望用户进程更多,cpu都尽量为我们要用的程序工作;
sy:系统消耗cpu,内核进程,如果系统cpu更多,那么真正给用户的cpu就更少了 ;
ni:优先级,优先级高的进程所消耗的cpu(有高低之分就有抢占之说)
id:空闲的CPU(没活干)
wa:等待I/O的CPU消耗百分比(有活,等着干)
hi:软中断消耗的CPU(软件中断)
si:硬中断消耗的CPU(外设中断)
st:强制页交换消耗的CPU(进程切换的时候,会有页交换。那什么情况有进程切换?比如CPU时间片用完了,就会进行进程切换,切换过程中,没执行完的进程就会被挂起,等待下一个时间片过来,才能该继续运行代码)所以为什么玩游戏的时候卡,把其他程序关了?因为其他程序会有进程切换,占用时间片。那么st高是不是可以理解为,我的进程抢占严重?
 
那么问题来了,进程的交换,怎么保证执行不紊乱???A进程执行到第100行代码,我怎么知道下次在分到A进程是100行代码呢??
答案是:上下文切换,切换是在内核内完成的。比如说A我执行到了第100行,变量等,我把它存到内核里面。再执行回来到A,从内核把这些取出来,保证进程运行是知道从哪儿开始运行的。

密集型应用:分为I/O密集型应用和CPU密集型应用,那I/O密集是因为什么呢?是因为频繁操作磁盘,CPU密集是频繁计算。我们正常的接触到的系统是I/O密集型的,频繁操作磁盘的应用。CPU密集的我们遇到的比较少,什么阿法狗这类的。常规来讲,CPU使用率我们不要到80%

面试问:服务器的配置:一般为2的倍数:2CPU,4G内存;4CPU,4G

那么负载高怎么看CPU正在调度的队列???

  看 vmstat 里面的 r列,running,cpu正在运行的进程;b列,cpu正在等待的进程

进程:

Tasks:  81 total,   1 running,  80 sleeping,   0 stopped,   0 zombie

进程的状态

 running

中断

  • 中断不可恢复(过程不可控制)
  • 中断可恢复

  理解一下:假设有1个CPU,下面有三个线程A、B、C都是假的running状态,都是刚启动,现在还没有时间片,一个时间片下只能运行一个线程。此时负载为0

  假设现在A拿到了时间片,A就真正是running状态,在运行了,此时B和C依旧是假running,等待cpu时间片轮询。然后A需要等待一个I/O要从磁盘内拿一个数据,那么A就会被中断,这个叫中断不可恢复,不可恢复指的是不能打断。此时负载为1,因为只有A是真running

  接下来时间片给B,B就成了真riunning,C依旧为假running;B如果此时等待外部设备,比如说等到键盘输入东西,也就要中断,这个中断是中断可恢复状态,因为这个中断是不可预知的,你不知道啥时候键盘能输入东西。此时负载为2,A在等待I/O的进程,B是在CPU内运行的进程

  此时时间片给C,C就成了真running。此时负载为2,C是在调度CPU的进程,A是在等待I/O的进程,B是在等待外设,并不是在等待I/O。那么此时A的结果返回了,时间片到了A也就会变成running,C会变成假running,此时负载为1, 只有A在running

停止

休眠

僵尸:失去控制的状态,怎么也调不动也退不出

  用vmstat

vmstat
    vmstat [-a] [-n] [-S unit] [delay [ count]]
-a:显示活跃和非活跃内存
-m:显示slabinfo
-n:只在开始时显示一次各字段名称。
-s:显示内存相关统计信息及多种系统活动数量。
delay:刷新时间间隔。如果不指定,只显示一条结果。
count:刷新次数。如果不指定刷新次数,但指定了刷新时间间隔,这时刷新次数为无穷。
-d:显示各个磁盘相关统计信息。
-S:使用指定单位显示。参数有 k 、K 、m 、M ,分别代表1000、10241000000、1048576字节(byte)。默认单位为K(1024 bytes)
-V:显示vmstat版本信息。
-p:显示指定磁盘分区统计信息
-D:显示磁盘总体信息
vmstat命令

  vmstat可以对操作系统的内存信息、进程状态、CPU活动、磁盘等信息进行监控,不足之处是无法对某个进程进行深入分析。

# vmstat 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 568360  19264 206524    0    0    26     2   55  150  0  0 99  0  0    
 0  0      0 568352  19264 206524    0    0     0     0   47  143  0  0 100  0  0    
 0  0      0 568352  19264 206524    0    0     0     0   45  138  0  0 100  0  0

各项指标说明以及分析如下:

procs

  • r列表示运行和等待CPU时间片的进程数,这个值如果长期大于系统CPU个数,说明CPU不足,需要增加CPU。
  • b列表示在等待资源的进程数,比如正在等待I/O或者内存交换等。

memory

  • swpd列表示切换到内存交换区的内存大小(单位KB),通俗讲就是虚拟内存的大小。如果swap值不为0或者比较大,只要si、so的值长期为0.这种情况一般属于正常情况。
  • free列表示当前空闲的物理内存(单位KB)。
  • buff列表示baffers cached内存大小,也就是缓冲大小,一般对块设备的读写才需要缓冲。
  • cache列表示page cached的内存大小,也就是缓存大小,一般作为文件系统进行缓冲,频繁访问的文件都会被缓存,如果cache值非常大说明缓存文件比较多,如果此时io中的bi比较小,说明文件系统效率比较好。

swap

  • si列表示由磁盘调入内存,也就是内存进入内存交换区的内存大小。
  • so列表示由内存进入磁盘,也就是有内存交换区进入内存的内存大小。
  • 一般情况下,si、so的值都为0,如果si、so的值长期不为0,则说明系统内存不足,需要增加系统内存。

io

  • bi列表示由块设备读入数据的总量,即读磁盘,单位kb/s。
  • bo列表示写到块设备数据的总量,即写磁盘,单位kb/s。
  • 如果bi+bo值过大,且wa值较大,则表示系统磁盘IO瓶颈。

system

  • in列表示某一时间间隔内观测到的每秒设备中断数。
  • cs列表示每秒产生的上下文切换次数。
  • 这2个值越大,则由内核消耗的CPU就越多。

cpu

  • us列表示用户进程消耗的CPU时间百分比,us值越高,说明用户进程消耗cpu时间越多,如果长期大于50%,则需要考虑优化程序或者算法。
  • sy列表示系统内核进程消耗的CPU时间百分比,一般来说us+sy应该小于80%,如果大于80%,说明可能出现CPU瓶颈。
  • id列表示CPU处在空闲状态的时间百分比。
  • wa列表示等待所占的CPU时间百分比,wa值越高,说明I/O等待越严重,根据经验wa的参考值为20%,如果超过20%,说明I/O等待严重,引起I/O等待的原因可能是磁盘大量随机读写造成的,也可能是磁盘或者此监控器的带宽瓶颈(主要是块操作)造成的。

综上所述,如果评估CPU,需要重点关注procs项的r列值和CPU项的us、sy、wa列的值。

内存

  1、top命令

Mem:   2054212k total,   200880k used,  1853332k free,    17788k buffers
Swap:        0k total,        0k used,        0k free,   106024k cached

 Mem:物理内存

Swap:虚拟内存(以前虚拟内存一般为物理内存2-8倍,也可以设置为0)

问题:虚拟内存是怎么虚拟出来的?(这里还得自己再深入理解一下)

  虚拟内存不一定是在磁盘上。有的说法虚拟内存是从磁盘上虚拟出来的一块地址当做内存来使用,其实不然,虚拟内存是磁盘和内存两者一起虚拟出来的,其中有一小部分是在内存上,大部分是在磁盘上。什么时候要用虚拟内存?肯定是物理内存不够用,才会开始用虚拟内存。就像你邮箱不够用,就得烧机油一个道理

解释下指标:

  total:总内存

  used:已经使用的内存

  free:剩余内存(free永远大于0)

  buffers:缓冲区。先写到缓冲内再同步到磁盘内

  cached:缓存区。频繁从磁盘读取的那部分内容存在缓存,供内存使用

 top内的RES列:进程占的物理内存

问题:什么情况下,内存不够???

  free不会为0,当虚拟内存的used开始增加时,就说明物理内存不够用了(前提是虚拟内存开启了)

如果应用程序为c或者为php的,一般会设置内存的预警,used=80%*total,但是比例不绝对

如果应用为java应用,情况会比较特殊,java应用在程序没使用的时候,就会先申请一块内存。有可能一开始我就申请个8g,那如果我设置的预警小于8g,那就会有问题了。关于java应用,一般不看这里的内存,会专门看java应用的内存

磁盘

  1、iostat -x

# iostat -x
Linux 2.6.32-696.16.1.el6.x86_64 (xiaowenshu)     12/23/2018     _x86_64_    (1 CPU)

avg-cpu:  %user   %nice %system %iowait  %steal   %idle
           0.14    0.00    0.09    0.03    0.00   99.74

Device:         rrqm/s   wrqm/s     r/s     w/s   rsec/s   wsec/s avgrq-sz avgqu-sz   await r_await w_await  svctm  %util
vda               0.03     0.07    0.09    0.13     5.07     1.56    30.94     0.00    2.76    3.97    1.94   1.82   0.04

  2、sar -d 2 3

# sar -d 2 3
Linux 2.6.32-696.16.1.el6.x86_64 (xiaowenshu)     12/23/2018     _x86_64_    (1 CPU)

10:23:21 PM       DEV       tps  rd_sec/s  wr_sec/s  avgrq-sz  avgqu-sz     await     svctm     %util
10:23:23 PM  dev252-0      0.00      0.00      0.00      0.00      0.00      0.00      0.00      0.00

10:23:23 PM       DEV       tps  rd_sec/s  wr_sec/s  avgrq-sz  avgqu-sz     await     svctm     %util
10:23:25 PM  dev252-0      0.00      0.00      0.00      0.00      0.00      0.00      0.00      0.00

10:23:25 PM       DEV       tps  rd_sec/s  wr_sec/s  avgrq-sz  avgqu-sz     await     svctm     %util
10:23:27 PM  dev252-0      0.00      0.00      0.00      0.00      0.00      0.00      0.00      0.00

Average:          DEV       tps  rd_sec/s  wr_sec/s  avgrq-sz  avgqu-sz     await     svctm     %util
Average:     dev252-0      0.00      0.00      0.00      0.00      0.00      0.00      0.00      0.00

DEV:挂载的磁盘

tps:I/O的次数(什么叫一次I/O?)

  磁盘I/O和读写要理解好:读写是在内存里面找不到数据,就去访问磁盘,这叫读和写。那么磁盘I/O叫什么?I/O是一个merge(合并)操作,在一个时间段内,将所有的磁盘读写划分为一次IO

rd_sec/s:每秒读扇区的大小

wr_sec/s:每秒写扇区的大小

avgrq-sz:每次操作I/O的大小

avgqu-sz:磁盘队列的长度,队列越大说明排队越多,反映出磁盘的繁忙程度

await:排队时间+处理时间

svctm:servicetime每次磁盘I/O真正处理的时间(机械硬盘时间不超过0.5ms)

那么怎么看磁盘好坏?以及瓶颈?

  好坏:看avgqu-sz别太长,await和svctm别太长

进程快线程快?当然是进程快。java,jmeter是进程模式,进程下跑多个线程而已。

java项目都是单进程多线程模式。一个进程下有多个线程快还是有一个线程快?当然是只有一个从线程快

apache是多进程模式,可以用 ps -ef|grep httpd ,可以看到很多个httpd,说明是多进程模式

1 # ps -ef | grep java
2 root      2231     1  2 11:28 ?        00:00:02 /usr/local/jdk1.8.0_131/bin/java -Djava.util.logging.config.file=/usr/local/tomcat1/conf/logging.properties -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager -Djdk.tls.ephemeralDHKeySize=2048 -Djava.protocol.handler.pkgs=org.apache.catalina.webresources -Dorg.apache.catalina.security.SecurityListener.UMASK=0027 -Dignore.endorsed.dirs= -classpath /usr/local/tomcat1/bin/bootstrap.jar:/usr/local/tomcat1/bin/tomcat-juli.jar -Dcatalina.base=/usr/local/tomcat1 -Dcatalina.home=/usr/local/tomcat1 -Djava.io.tmpdir=/usr/local/tomcat1/temp org.apache.catalina.startup.Bootstrap start start
3 root      2246     1  2 11:28 ?        00:00:02 /usr/local/jdk1.8.0_131/bin/java -Djava.util.logging.config.file=/usr/local/tomcat2/conf/logging.properties -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager -Djdk.tls.ephemeralDHKeySize=2048 -Djava.protocol.handler.pkgs=org.apache.catalina.webresources -Dorg.apache.catalina.security.SecurityListener.UMASK=0027 -Dignore.endorsed.dirs= -classpath /usr/local/tomcat2/bin/bootstrap.jar:/usr/local/tomcat2/bin/tomcat-juli.jar -Dcatalina.base=/usr/local/tomcat2 -Dcatalina.home=/usr/local/tomcat2 -Djava.io.tmpdir=/usr/local/tomcat2/temp org.apache.catalina.startup.Bootstrap start start

tomcat是java项目,是多线程模式

top命令输入H,可以显示线程。

或者,输入:可以查看到java项目下各个线程所占用的资源

 1 #2231是上面的java项目的pid号
 2 # top -H -p 2231
 3 top - 11:31:04 up 2 min,  1 user,  load average: 0.17, 0.30, 0.13
 4 Tasks:  41 total,   0 running,  41 sleeping,   0 stopped,   0 zombie
 5 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
 6 Mem:   1030684k total,   430812k used,   599872k free,    14020k buffers
 7 Swap:  2064376k total,        0k used,  2064376k free,   202636k cached
 8 
 9   PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND                                                                                                                          
10  2231 root      20   0  339m  52m 7996 S  0.0  5.2   0:00.01 java                                                                                                                              
11  2273 root      20   0  339m  52m 7996 S  0.0  5.2   0:01.43 java                                                                                                                              
12  2276 root      20   0  339m  52m 7996 S  0.0  5.2   0:00.13 java                                                                                                                              
13  2277 root      20   0  339m  52m 7996 S  0.0  5.2   0:00.00 java                                                                                                                              
14  2280 root      20   0  339m  52m 7996 S  0.0  5.2   0:00.00 java                                                                                                                              
15  2281 root      20   0  339m  52m 7996 S  0.0  5.2   0:00.00 java                                                                                                                              
16  2283 root      20   0  339m  52m 7996 S  0.0  5.2   0:00.30 java                                                                                                                              
17  2286 root      20   0  339m  52m 7996 S  0.0  5.2   0:00.00 java                                                                                                                              
18  2288 root      20   0  339m  52m 7996 S  0.0  5.2   0:00.04 java

 再按下H,就会缩变成一个进程

# top -H -p 2231
top - 11:34:32 up 6 min,  1 user,  load average: 0.00, 0.14, 0.09
Tasks:   1 total,   0 running,   1 sleeping,   0 stopped,   0 zombie
Cpu(s):  0.0%us,  0.3%sy,  0.0%ni, 99.7%id,  0.0%wa,  0.0%hi,  0.0%si,  0.0%st
Mem:   1030684k total,   431044k used,   599640k free,    14120k buffers
Swap:  2064376k total,        0k used,  2064376k free,   202636k cached

PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND                                                                                                                           
2231 root      20   0  339m  52m 7996 S  0.0  5.2   0:02.37 java

 这个有啥用呢?

怎么查看CPU使用率高的原因:某个进程造成==>该进程的某个线程造成的==>找出该线程正在调用的方法

找到这个方法就ok咯!

那用top命令,我怎么知道哪个进程,线程消耗的CPU高?用哪个可以排序呢?

按下f,可设置显示的列,想要在外面显示哪一列,按下字母就ok,或者光标移到字母上,按下空格键。选择好了后,按下enter键

 1 Current Sort Field:  K  for window 1:Def
 2 Select sort field via field letter, type any other key to return 
 3 
 4   a: PID        = Process Id                                                                     within viewable range is chosen.
 5   b: PPID       = Parent Process Pid
 6   c: RUSER      = Real user name                                                               Note2:
 7   d: UID        = User Id                                                                        Field sorting uses internal values,
 8   e: USER       = User Name                                                                      not those in column display.  Thus,
 9   f: GROUP      = Group Name                                                                     the TTY & WCHAN fields will violate
10   g: TTY        = Controlling Tty                                                                strict ASCII collating sequence.
11   h: PR         = Priority                                                                       (shame on you if WCHAN is chosen)
12   i: NI         = Nice value
13   j: P          = Last used cpu (SMP)
14 * K: %CPU       = CPU usage
15   l: TIME       = CPU Time
16   m: TIME+      = CPU Time, hundredths
17   n: %MEM       = Memory usage (RES)
18   o: VIRT       = Virtual Image (kb)
19   p: SWAP       = Swapped size (kb)
20   q: RES        = Resident size (kb)
21   r: CODE       = Code size (kb)
22   s: DATA       = Data+Stack size (kb)
23   t: SHR        = Shared Mem size (kb)
24   u: nFLT       = Page Fault count
25   v: nDRT       = Dirty Pages count
26   w: S          = Process Status
27   x: COMMAND    = Command name/line
28   y: WCHAN      = Sleeping in Function
29   z: Flags      = Task Flags <sched.h>
30 
31 Note1:
32   If a selected sort field can't be
33   shown due to screen width or your
34   field order, the '<' and '>' keys
35   will be unavailable until a field

按CPU排序:P(大写的P)

或者shift+p

按内存排序:M(大写的M)

或者shift+m

 按时间排序:T(或者shift+t)

vmstat 内:

# vmstat 2 2
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 587332  17216 204992    0    0    87     5   63  162  0  0 98  1  0    
 0  0      0 587324  17216 204992    0    0     0     0   46  136  0  0 100  0  0

 其他几项讲了,这里看下,system内的:in和cs

in:中断

cs:上下文切换

iostat:

iostat -c看cpu

iostat -d看磁盘

iostat -x看磁盘

sar:

sar -d看磁盘

sar -q看队列

sar -u看cpu

sar -r看内存

strace:终极命令,跟踪系统内核的调用情况

但是能玩好的不多。。。

网络

netstat -i

1 # netstat -i
2 Kernel Interface table
3 Iface       MTU Met    RX-OK RX-ERR RX-DRP RX-OVR    TX-OK TX-ERR TX-DRP TX-OVR Flg
4 eth1       1500   0     1028      0      0      0     1409      0      0      0 BMRU
5 lo        16436   0        0      0      0      0        0      0      0      0 LRU

R:接收,T:发送

案例:

loadrunner内:俩问题1、为啥1负载机100并发,tps减少;2、为啥3负载机,tps没达到300
1负载机     50并发   ------ tps=100
1负载机   100并发     -----tps=80
3负载机      150并发   ----tps=160
 
分析过程:50-100并发,服务器处理能力减小??服务100,可能到极限了,但是150并发,tps到160了,说明问题不在服务器,可能在负载机。看发请求时候,确认没有其他应用抢了cpu的能力。看硬件资源:cpu,内存,磁盘,网络,这四个都没问题。16核cpu,50个并发起50个进程;100个请求,发100个进程;可能是发生进程抢占了,cpu效率降低,请求发不出去。你抢我的我抢你的,负载机的平均负载会增加
 
那么第二个问题,为啥没到300,没到预想的tps值,应该是服务器的问题。看服务器的四大件:cpu、内存,io,网络
 
 
 
nmon监控工具:可以离线收集
1、tar包用:tar -xf zww解压
2、不可执行的话,给这个文件赋予777权限,再执行
./nmon_x86_rhel52

现象如下:

单个字母表示对应监控点的快捷键,只要输入相应的字母,即可显示相应的资源耗用情况,输入c、m、d、n后显示效果如下(显示了cpu、内存、磁盘、网络的使用情况):

输出文件

上面介绍的只是在服务器监控,我们真正需要的是如何收集这些数据并处理分析它们。nmon提供了一个nmon_analyser的分析工具,可以利用Excel进行统计结果分析。在测试的时候,可以使用下列命令进行数据的输出:

#./nmon_x86_rhel52 -fT -s 5 -c 5

命令的含义是,-f输出文件,-T输出最耗自愿的进程,-s收集数据的时间间隔,-c收集次数。比如,测试场景需要执行20分钟,那么需要每隔10秒监控Linux系统资源就可以写成:

#./nmon_x86_rhel52 -fT -s 10 -c 120

完成后会在当前目录生成一个.nmon的文件,如下:

besttest_181223_1326.nmon

nmon输出文件的命名方式是服务器名_日期时间.nmon,我们在测试结束后,可以到当前目录下提取这些文件。

如果想在后台运行nmon,则可用:

#nohup ./nmon_x86_rhel52 -fT -s 10 -c 120

命令在后台启动相关的进程运行nmon工具。

如果想结束该进程,可使用:

#ps -eaf|grep *nmon*

命令查出该进程ID,然后使用:

#kill -9 进程ID

命令杀掉进程即可。

错误:提示没有这个文件或目录

/usr/bin/lsb_release: 没有那个文件或目录

解决方案:

yum install redhat-lsb

或者

yum install redhat-lsb-core

分析数据

为了保证数据不丢失,可以设定定时任务去启动,比如说每个小时的第一秒去启动,但是监控的时间为3604秒

利用nmon工具收集到系统资源的相关数据后,就可以使用nmon工具的配套软件nmon analyser v33g.xls(工具可能因版本不同而不同)进行数据分析了。这个工具使用非常简单,分析时只需要打开相应的.nmon文件即可。

打开nmon analysis v33g.xls,如图:

 

如果报安全级别过高错误,则需要修改宏的安全级别设置。

单击Analyse nmon data按钮,选择需要分析的nmon文件(过程中需要保存Execl文件,输入一个容易分辨的文件名即可)。

 
解答各sheet页的内容:
原文地址:https://www.cnblogs.com/xiaowenshu/p/10146871.html