监控操作系统的CPU、内存、磁盘
Linux
四大件:CPU、内存、磁盘、网络
CPU
就像人的大脑,主要负责相关事情的判断以及实际处理的机制。
CPU的性能主要体现在其运行程序的速度上。影响运行速度的性能指标包括CPU的工作频率、Cache容量、指令系统和逻辑结构等参数。
查询指令:cat /proc/cpuinfo
[root@besttest ~]# cat /proc/cpuinfo
processor :
vendor_id : GenuineIntel
cpu family :
model :
model name : Intel(R) Core(TM) i5-4200H CPU @ .80GHz
stepping :
cpu MHz : 2793.600
cache size : KB
fdiv_bug : no
hlt_bug : no
f00f_bug : no
coma_bug : no
fpu : yes
fpu_exception : yes
cpuid level :
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 :
cache_alignment :
address sizes : bits physical, bits virtual
power management:
内存
大脑中的记忆区块,将皮肤、眼睛等所收集到的信息记录起来的地方,以供CPU进行判断。
影响内存的性能主要是内存主频、内容容量。
查询指令:cat /proc/meminfo
[root@besttest ~]# cat /proc/meminfo
MemTotal: kB
MemFree: kB
Buffers: kB
Cached: kB
SwapCached: kB
Active: kB
Inactive: kB
Active(anon): kB
Inactive(anon): kB
Active(file): kB
Inactive(file): kB
Unevictable: kB
Mlocked: kB
HighTotal: kB
HighFree: kB
LowTotal: kB
LowFree: kB
SwapTotal: kB
SwapFree: kB
Dirty: kB
Writeback: kB
AnonPages: kB
Mapped: kB
Shmem: kB
Slab: kB
SReclaimable: kB
SUnreclaim: kB
KernelStack: kB
PageTables: kB
NFS_Unstable: kB
Bounce: kB
WritebackTmp: kB
CommitLimit: kB
Committed_AS: kB
VmallocTotal: kB
VmallocUsed: kB
VmallocChunk: kB
HugePages_Total:
HugePages_Free:
HugePages_Rsvd:
HugePages_Surp:
Hugepagesize: kB
DirectMap4k: kB
DirectMap2M: kB
磁盘
大脑中的记忆区块,将重要的数据记录起来,以便未来再次使用这些数据。
容量、转速、平均访问时间、传输速率、缓存。
查询指令:fdisk -l (需要root权限)
[root@besttest ~]# fdisk -l Disk /dev/sda: 21.5 GB, bytes
heads, sectors/track, cylinders
Units = cylinders of * = bytes
Sector size (logical/physical): bytes / bytes
I/O size (minimum/optimal): bytes / bytes
Disk identifier: 0x000b18c2 Device Boot Start End Blocks Id System
/dev/sda1 * Linux
Partition does not end on cylinder boundary.
/dev/sda2 8e Linux LVM Disk /dev/mapper/vg_besttest-lv_root: 18.8 GB, bytes
heads, sectors/track, cylinders
Units = cylinders of * = bytes
Sector size (logical/physical): bytes / bytes
I/O size (minimum/optimal): bytes / bytes
Disk identifier: 0x00000000 Disk /dev/mapper/vg_besttest-lv_swap: MB, bytes
heads, sectors/track, cylinders
Units = cylinders of * = bytes
Sector size (logical/physical): bytes / bytes
I/O size (minimum/optimal): bytes / 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) .全局命令 回车、空格 : 刷新显示信息
?、h : 帮助
= : 移除所有任务显示的限制
A : 交替显示模式切换
B : 粗体显示切换
d、s : 更改界面刷新时间间隔
G : 选择其它窗口/栏位组
I : Irix或Solaris模式切换
u、U : 监控指定用户相关进程
k : 结束进程
q : 退出top
r : 重新设定进程的nice值
W : 存储当前设定
Z : 改变颜色模板 .摘要区命令 l : 平均负载及系统运行时间显示开关
m : 内存及交换空间使用率显示开关
t : 当前任务及CPU状态显示开关
: 汇总显示CPU状态或分开显示每个CPU状态 .任务区命令
外观样式 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 - :: up :, user, load average: 0.00, 0.00, 0.00 ##load average指平均负载:1min,5min,15min
Tasks: total, running, sleeping, stopped, 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
root S 0.0 0.1 :01.26 init
root S 0.0 0.0 :00.00 kthreadd
root RT S 0.0 0.0 :00.00 migration/
root S 0.0 0.0 :00.11 ksoftirqd/
root RT S 0.0 0.0 :00.00 migration/
root RT S 0.0 0.0 :00.03 watchdog/
root S 0.0 0.0 :00.30 events/
root S 0.0 0.0 :00.00 cgroup
root S 0.0 0.0 :00.00 khelper
root S 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之间
密集型应用:分为I/O密集型应用和CPU密集型应用,那I/O密集是因为什么呢?是因为频繁操作磁盘,CPU密集是频繁计算。我们正常的接触到的系统是I/O密集型的,频繁操作磁盘的应用。CPU密集的我们遇到的比较少,什么阿法狗这类的。常规来讲,CPU使用率我们不要到80%
面试问:服务器的配置:一般为2的倍数:2CPU,4G内存;4CPU,4G
那么负载高怎么看CPU正在调度的队列???
看 vmstat 里面的 r列,running,cpu正在运行的进程;b列,cpu正在等待的进程
进程:
Tasks: total, running, sleeping, stopped, 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、、、1048576字节(byte)。默认单位为K( bytes)
-V:显示vmstat版本信息。
-p:显示指定磁盘分区统计信息
-D:显示磁盘总体信息
vmstat命令
vmstat可以对操作系统的内存信息、进程状态、CPU活动、磁盘等信息进行监控,不足之处是无法对某个进程进行深入分析。
# vmstat
procs -----------memory---------- ---swap-- -----io---- --system-- -----cpu-----
r b swpd free buff cache si so bi bo in cs us sy id wa st
各项指标说明以及分析如下:
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.-696.16..el6.x86_64 (xiaowenshu) // _x86_64_ ( 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,说明是多进程模式
# ps -ef | grep java
root 2231 : ? :: /usr/local/jdk1..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= -Djava.protocol.handler.pkgs=org.apache.catalina.webresources -Dorg.apache.catalina.security.SecurityListener.UMASK= -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
root : ? :: /usr/local/jdk1..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= -Djava.protocol.handler.pkgs=org.apache.catalina.webresources -Dorg.apache.catalina.security.SecurityListener.UMASK= -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项目下各个线程所占用的资源
#2231是上面的java项目的pid号
# top -H -p 2231
top - :: up min, user, load average: 0.17, 0.30, 0.13
Tasks: total, running, sleeping, stopped, 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
Mem: 1030684k total, 430812k used, 599872k free, 14020k buffers
Swap: 2064376k total, 0k used, 2064376k free, 202636k cached PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
root 339m 52m S 0.0 5.2 :00.01 java
root 339m 52m S 0.0 5.2 :01.43 java
root 339m 52m S 0.0 5.2 :00.13 java
root 339m 52m S 0.0 5.2 :00.00 java
root 339m 52m S 0.0 5.2 :00.00 java
root 339m 52m S 0.0 5.2 :00.00 java
root 339m 52m S 0.0 5.2 :00.30 java
root 339m 52m S 0.0 5.2 :00.00 java
root 339m 52m S 0.0 5.2 :00.04 java
再按下H,就会缩变成一个进程
# top -H -p
top - :: up min, user, load average: 0.00, 0.14, 0.09
Tasks: total, running, sleeping, stopped, 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
root 339m 52m S 0.0 5.2 :02.37 java
这个有啥用呢?
怎么查看CPU使用率高的原因:某个进程造成==>该进程的某个线程造成的==>找出该线程正在调用的方法
找到这个方法就ok咯!
那用top命令,我怎么知道哪个进程,线程消耗的CPU高?用哪个可以排序呢?
按下f,可设置显示的列,想要在外面显示哪一列,按下字母就ok,或者光标移到字母上,按下空格键。选择好了后,按下enter键
Current Sort Field: K for window :Def
Select sort field via field letter, type any other key to return a: PID = Process Id within viewable range is chosen.
b: PPID = Parent Process Pid
c: RUSER = Real user name Note2:
d: UID = User Id Field sorting uses internal values,
e: USER = User Name not those in column display. Thus,
f: GROUP = Group Name the TTY & WCHAN fields will violate
g: TTY = Controlling Tty strict ASCII collating sequence.
h: PR = Priority (shame on you if WCHAN is chosen)
i: NI = Nice value
j: P = Last used cpu (SMP)
* K: %CPU = CPU usage
l: TIME = CPU Time
m: TIME+ = CPU Time, hundredths
n: %MEM = Memory usage (RES)
o: VIRT = Virtual Image (kb)
p: SWAP = Swapped size (kb)
q: RES = Resident size (kb)
r: CODE = Code size (kb)
s: DATA = Data+Stack size (kb)
t: SHR = Shared Mem size (kb)
u: nFLT = Page Fault count
v: nDRT = Dirty Pages count
w: S = Process Status
x: COMMAND = Command name/line
y: WCHAN = Sleeping in Function
z: Flags = Task Flags <sched.h> Note1:
If a selected sort field can't be
shown due to screen width or your
field order, the '<' and '>' keys
will be unavailable until a field
按CPU排序:P(大写的P)
或者shift+p
按内存排序:M(大写的M)
或者shift+m
按时间排序:T(或者shift+t)
vmstat 内:
# vmstat
procs -----------memory---------- ---swap-- -----io---- --system-- -----cpu-----
r b swpd free buff cache si so bi bo in cs us sy id wa st
其他几项讲了,这里看下,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
# netstat -i
Kernel Interface table
Iface MTU Met RX-OK RX-ERR RX-DRP RX-OVR TX-OK TX-ERR TX-DRP TX-OVR Flg
eth1 BMRU
lo LRU
R:接收,T:发送
案例:
./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文件,输入一个容易分辨的文件名即可)。
监控操作系统的CPU、内存、磁盘的更多相关文章
- Linux 性能监控之CPU&内存&I/O监控Shell脚本2
Linux 性能监控之CPU&内存&I/O监控Shell脚本2 by:授客 QQ:1033553122 思路: 捕获数据->停止捕获数据->提取数据 备注:一些命令的输 ...
- Linux 性能监控之CPU&内存&I/O监控Shell脚本1
Linux 性能监控之CPU&内存&I/O监控Shell脚本1 by:授客 QQ:1033553122 #!/bin/bash # 获取要监控的本地服务器IP地址 IP=`if ...
- AIX/Linux/HP-UX查看CPU/内存/磁盘/存储命令
1.1 硬件环境验证方式 硬件环境主要包括CPU.内存.磁盘/存储.网络设备(如F5等).系统特有设备(如密押设备等)等,其中网络设备和系统特有设备由网络管理员或项目组提供为准,本节主要关注CP ...
- linux系统CPU,内存,磁盘,网络流量监控脚本
前序 1,#cat /proc/stat/ 信息包含了所有CPU活动的信息,该文件中的所有值都是从系统启动开始累积到当前时刻 2,#vmstat –s 或者#vmstat 虚拟内存统计 3, #cat ...
- linux系统CPU内存磁盘监控发送邮件脚本
#!/bin/bashexport PATHexport LANG=zh_CN.UTF-8###top之后输入数字1,可以查看每颗CPU的情况.###先配置好mailx邮箱账号密码:#cat>/ ...
- python监控CPU/内存/磁盘,超过指定百分比,发送邮件
#!/usr/bin/python #coding:utf-8 #导入psutil模块 import psutil import yagmail def mail(subject,contents): ...
- Shell采集系统cpu 内存 磁盘 网络信息
cpu信息采集 cpu使用率 采集算法 通过/proc/stat文件采集并计算CPU总使用率或者单个核使用率.以cpu0为例,算法如下: 1. cat /proc/stat | grep ‘cpu0’ ...
- 获取并检查系统负载\CPU\内存\磁盘\网络
安装依赖 需要net-tools.namp! CentOS:yum -y install net-tools nmap Ubuntu:apt-get update && apt-get ...
- jmeter监控linux cpu 内存 网络 IO
下载地址:http://jmeter-plugins.org/downloads/all/ PerfMon: 用来监控Server的CPU.I/O.Memory等情况 ServerAgent-2.2. ...
随机推荐
- python遗留问题
def assert_element_in_page_source(s): print type(s) print s #assert s in driver.page_sourcecommand=' ...
- PHP文件锁 解决并发问题
使用多线程或是多进程时. 难免会遇到并发问题. 处理简单的并发可以使用这个办法来解决 flock($fp = fopen($lock, 'w+'), LOCK_EX | LOCK_NB) or e ...
- 337BRoutine Problem
/*给出你图片的长和宽的比例a:b 和摄像头的比例c:d,然后叫你求最后将图片放进摄像头 以后,剩余的面积比上摄像头的总面积,注意要化简为最简形式,而且摄像头要设置成至少一条边和图片相等 做法:先将两 ...
- double、float等多字节数据处理
一.常规的多字节: 有2,4,8字节 float和double是具有自身算法的数据类型,和其他整型不一样[整型数据,可以直接通过移位来进行计算值的大小,float和double不行] 值 = 尾数x ...
- tenserflow models包的安装
1.下载 models包 https://github.com/tensorflow/models 2.将models包拷贝到本机Python包的安装地址即可,本机Python包的安装地址的查看方式可 ...
- OOP、AOP 、IoC和DI、ORM 概念
OOP 面向对象编程(Object Oriented Programming) OOP引入封装.继承和多态性等概念来建立一种对象层次结构,用以模拟公共行为的一个集合. AOP 面向切面编程Aspect ...
- Hive 建外链表到 Hbase(分内部表、外部表两种方式)
一. Hive 建内部表,链到hbase :特点:Hive drop表后,Hbase 表同步删除 drop table if exists hbase_kimbo_test1;CREATE TABLE ...
- Eclipse 常用快捷键和使用技巧
1.查看快捷键定义的地方 Window->Preferences->General->Keys. 2.更改启动页 在AndroidManifest.xml第一个activity标签项 ...
- UVA-10285 Longest Run on a Snowboard (递推)
题目大意:滑雪.给一个二维数组,找出最长的连续下降序列的长度. 题目分析:定义dp(i,j)表示以a[i][j]结尾的最长连续下降序列的长度,则dp(i,j)=max(dp(i-1,j),dp(i+1 ...
- oracle用户 密码永不过期
ALTER PROFILE DEFAULT LIMIT PASSWORD_LIFE_TIME UNLIMITED;