CPU Utilization - CPU使用率
CPU Utilization是衡量程序占用系统资源的最直观指标,即CPU使用率。如果CPU Utilization在5%-10%之间则基本上对系统没有影响,可以不关注。但如果在80%-90%,或者更高的话,就可能出现处理器性能瓶颈了。
User Time - 用户时间
描述CPU耗费在用户进程上的百分比,包括Nice time。如果User Time值很高,则表明系统正在执行实际的工作。
System Time - 系统时间
描述CPU耗费在内核操作上的CPU百分比,包括硬中断(IRQ)和软中断(SoftIRQ?)。System Time值持续很高表明网络或驱动程序栈可能存在瓶颈。性能良好的系统应当耗费尽量少的时间在内核操作上。
Waiting - 等待时间
描述CPU在等待I/O操作所耗费的时间总和,与阻塞(Blocked)指标相似,系统不应该耗费太多的时间在等待I/O操作;否则你应该检查一下各个I/O子系统的性能。
Idle time - 空闲时间
描述CPU等待任务到达的时间百分比,即CPU空闲时间。
Nice time - Nice时间
描述CPU耗费在进程re-nicing的百分比,re-nicing指的是改变进程的执行顺序和优先级。
Load average - 平均负载
Load average不是CPU百分比,它是以下数值加和的平均值:
— 队列中等待执行的进程数
— 等待不可中断任务执行完成的进程数
也 就是TASK_RUNNING和TASK_UNINTERRUPTIBLE之和的平均值。如果请求CPU 处理的进程发生阻塞(意味着CPU没有空闲时间去执行该进程),Load average将会上升。相反如果每个进程都可以立即执行,而且没有空转的CPU周期,那Load average将会降低。
Runable processes - 可运行进程
Runable processes描述准备执行的进程数。在一段持续的时间内Runable processes不应该超过CPU数量的10倍,否则CPU可能存在性能瓶颈。
Blocked - 堵塞
描述因等待I/O操作完成而挂起的进程数,Blocked指标往往意味着I/O存在性能瓶颈。
Context switch - 上下文交换
Context switch描述系统中线程之间发生交换的数量。只有一小部分情况下需要Context switch,通常情况下是不需要Context switch,因为每次操作都伴随着刷新CPU缓存。Context switch次数过多与大量的中断请求有关,这意味着驱动或应用程序可能存在问题。
Interrupts - 中断
Interrupts包括硬中断(hard interrupts)和软中断(soft interrupts)。hard interrupts会对系统性能产生非常不利的影响。Interrupts过高意味着应用程序存在性能瓶颈,可能在内核或者驱动中。 Interrupts也包括CPU时钟产生的中断。
通过来查询Linux的一些信息来确认系统当前处于什么样的一个状态
命令 | 解释 |
---|---|
uptime | 服务器已经运行的时长和当前登录的用户数,以及服务器在过去的一分钟、5分钟、15分钟的系统平均负载值,与CPU的内核有关 |
Top(htop) | 提供了实时的对系统处理器的状态监视,显示系统中CPU最敏感的任务列表,该命令可以按CPU使用,内存使用和执行时间对任务进行排序,而且该命令的很多特性都可以通过交互式命令或者在个人定制文件中进行设定。 |
mpstat | Mpstat是multiprocessor statistics的缩写,是实时系统监控工具 |
iostat | 用于监控系统设备的IO负载情况,iostat首次运行时显示自系统启动开始的各项统计信息,之后再运行iostat将显示自上次运行该命令以后的统计信息。 |
vmstat | 展示给定时间间隔的服务器的状态值,包括服务器的CPU使用率,内存使用和虚拟内存交换情况,IO读写情况 |
free | 显示Linux系统的内存详细情况,包括以使用内存,可用内存,和BUFFER及CACHE的占用实际情况 |
dstat | Dstat是一个用来替换vmstat,iostat,netstat,nfsstat和ifstat这些命令工具,是一个全能系统信息统计工具,与sysstat相比,dstat拥有一个彩色的界面,在手动观察系统性能情况时,数据比较显眼容易观察,而且dstat支持即时刷新。 |
sar | Sar是(system activity reporter 系统活动情况报告)是一个可以全面分析系统性能情况的工具,可以从多方面对系统的活动进行报告,包括:文件的读写情况,系统调用的使用情况,磁盘I/O CPU效率,内存使用状况,进程活动及IPC有关的活动等。 |
Linux性能监控工具及对应的内核层:
影响系统的性能因素以及评判标准信息:
Tips:
%user:表示CPU处在用户模式下的时间百分比。
%sys:表示CPU处在系统模式下的时间百分比。
%iowait:表示CPU等待输入输出完成时间的百分比。
swap in:即si,表示虚拟内存的页导入,即从SWAP DISK交换到RAM
swap out:即so,表示虚拟内存的页导出,即从RAM交换到SWAP DISK
常用组合方式:
cpu使用率反映的是当前cpu的繁忙程度,忽高忽低的原因在于占用cpu处理时间的进程可能处于io等待状态但却还未释放进入wait。
平均负载(loadaverage)是指某段时间内占用cpu时间的进程和等待cpu时间的进程数,这里等待cpu时间的进程是指等待被唤醒的进程,不包括处于wait状态进程。
良好状态指标
CPU利用率:User Time <=70%,System Time <= 35%,User Time + System Time <= 70%。
上下文切换:与CPU利用率相关联,如果CPU利用率状态良好,大量的上下文切换也是可以接受的。
可运行队列:每个处理器的可运行队列<=3个线程。
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、5、15 的平均负载,也可以看出系统负载是上升、平稳、下降的趋势,当这个值超过 CPU 可执行单元的数目,则表示 CPU 的性能已经饱和成为瓶颈了
第二行统计了系统的任务状态信息。running 是包括正在 CPU 上运行的和将要被调度运行的;sleeping 通常是等待事件(比如 IO 操作)完成的任务,细分可以包括 interruptible 和 uninterruptible 的类型;stopped 是一些被暂停的任务,通常发送 SIGSTOP 或者对一个前台任务操作 Ctrl-Z 可以将其暂停;zombie 僵尸任务,虽然进程终止资源会被自动回收,但是含有退出任务的 task descriptor 需要父进程访问后才能释放,这种进程显示为 defunct 状态,无论是因为父进程提前退出还是未 wait 调用,出现这种进程都应该格外注意程序是否设计有误。
第三行 CPU 占用率根据类型有以下几种情况:
(us) user:CPU 在低 nice 值(高优先级)用户态所占用的时间(nice<=0)。正常情况下只要服务器不是很闲,那么大部分的 CPU 时间应该都在此执行这类程序
(sy) system:CPU 处于内核态所占用的时间,操作系统通过系统调用(system call)从用户态陷入内核态,以执行特定的服务;通常情况下该值会比较小,但是当服务器执行的 IO 比较密集的时候,该值会比较大
(ni) nice:CPU 在高 nice 值(低优先级)用户态以低优先级运行占用的时间(nice>0)。默认新启动的进程 nice=0,是不会计入这里的,除非手动通过 renice 或者 setpriority() 的方式修改程序的nice值
(id) idle:CPU 在空闲状态(执行 kernel idle handler )所占用的时间
(wa) iowait:等待 IO 完成做占用的时间
(hi) irq:系统处理硬件中断所消耗的时间
(si) softirq:系统处理软中断所消耗的时间,其中软中断分为 softirqs、tasklets (其实是前者的特例)、work queues。
(st) steal:在虚拟机情况下才有意义,因为虚拟机下 CPU 也是共享物理 CPU 的,所以这段时间表明虚拟机等待 hypervisor 调度 CPU 的时间,也意味着这段时间 hypervisor 将 CPU 调度给别的 CPU 执行,这个时段的 CPU 资源被“stolen”了。
第四行和第五行是物理内存和虚拟内存(交换分区)的信息:
total = free + used + buff/cache
buffers和cached Mem信息通过对比数据,这两个值就是 /proc/meminfo 中的 Buffers 和 Cached 字段:Buffers 是针对 raw disk 的块缓存,主要是以 raw block 的方式缓存文件系统的元数据(比如超级块信息等),这个值一般比较小(20M左右);而 Cached 是针对于某些具体的文件进行读缓存,以增加文件的访问效率而使用的,可以说是用于文件系统中文件缓存使用。
而 avail Mem 是一个新的参数值,用于指示在不进行交换的情况下,可以给新开启的程序多少内存空间,大致和 free + buff/cached 相当,而这也印证了上面的说法,free + buffers + cached Mem才是真正可用的物理内存。并且,使用交换分区不见得是坏事情,所以交换分区使用率不是什么严重的参数,但是频繁的 swap in/out 就不是好事情了,这种情况需要注意,通常表示物理内存紧缺的情况。
最后是每个程序的资源占用列表,其中 CPU 的使用率是所有 CPU core 占用率的总和。通常执行 top 的时候,本身该程序会大量的读取 /proc 操作,所以基本该 top 程序本身也会是名列前茅的。
缺点:top 虽然非常强大,但是通常用于控制台实时监测系统信息,不适合长时间(几天、几个月)监测系统的负载信息,同时对于短命的进程也会遗漏无法给出统计信息
vmstat
vmstat 是除 top 之外另一个常用的系统检测工具。
vmstat 1 10 (其中1是每行数据显示的时间间隔,10则表示显示10行信息)
procs
r:等待运行的进程数。
b:处在非中断睡眠状态的进程数。
w:被交换出去的可运行的进程数。
memeory
swpd:虚拟内存使用情况,单位为KB。
free:空闲的内存,单位为KB。
buff:被用来作为缓存的内存数,单位为KB。
swap
si:从磁盘交换到内存的交换页数量,单位为KB。
so:从内存交换到磁盘的交换页数量,单位为KB。
io
bi:发送到块设备的块数,单位为KB。
bo:从块设备接受的块数,单位为KB。
system
in:每秒的中断数,包括时钟中断。
cs:每秒的环境切换次数。
cpu
按cpu的总使用百分比来显示。
us:cpu使用时间。
sy:cpu系统使用时间。
id:闲置时间。
Pidstat
如果想对某个进程进行全面具体的追踪,pidstat 可以显示栈空间、缺页情况、主被动切换等信息。这个命令最有用的参数是-t,可以将进程中各个线程的详细信息罗列出来。
-r: 显示缺页错误和内存使用状况,缺页错误是程序需要访问映射在虚拟内存空间中但是还尚未被加载到物理内存中的一个分页,缺页错误两个主要类型是
a、minflt/s 指的 minor faults,当需要访问的物理页面因为某些原因(比如共享页面、缓存机制等)已经存在于物理内存中了,只是在当前进程的页表中没有引用,MMU 只需要设置对应的 entry 就可以了,这个代价是相当小的
b、majflt/s 指的 major faults,MMU 需要在当前可用物理内存中申请一块空闲的物理页面(如果没有可用的空闲页面,则需要将别的物理页面切换到交换空间去以释放得到空闲物理页面),然后从外部加载数据到该物理页面中,并设置好对应的 entry,这个代价是相当高的,和前者有几个数据级的差异
-s:栈使用状况,包括 StkSize 为线程保留的栈空间,以及 StkRef 实际使用的栈空间。使用ulimit -s发现CentOS 6.x上面默认栈空间是10240K,而 CentOS 7.x、Ubuntu系列默认栈空间大小为8196K
-u:CPU使用率情况,参数同前面类似
-w:线程上下文切换的数目,还细分为cswch/s因为等待资源等因素导致的主动切换,以及nvcswch/s线程CPU时间导致的被动切换的统计
Tips:如果每次都先ps得到程序的pid后再操作pidstat会显得很麻烦,所以可以使用-C,指定某个字符串,然后Command中如果包含这个字符串,那么该程序的信息就会被打印统计出来,-l可以显示完整的程序名和参数
mpstat
当需要单独监测单个 CPU 情况的时候,除了 htop 还可以使用 mpstat,查看在 SMP 处理器上各个 Core 的工作量是否负载均衡,是否有某些热点线程占用 Core。
ps
ps 命令就是最基本同时也是非常强大的进程查看命令.使用该命令可以确定有哪些进程 正在运行和运行的状态、进程是否结束、进程有没有僵死、哪些进程占用了过多的资源等等. 总之大部分信息都是可以通过执行该命令得到的
ps -A :显示所有程序。
ps c :列出程序时,显示每个程序真正的指令名称,而不包含路径,参数或常驻服务
的标示。
ps -e :此参数的效果和指定"A"参数相同。
ps e :列出程序时,显示每个程序所使用的环境变量。
ps f :用 ASCII 字符显示树状结构,表达程序间的相互关系。
ps -H:显示树状结构,表示程序间的相互关系。
ps –N:显示所有的程序,除了执行 ps 指令终端机下的程序之外。
ps s:采用程序信号的格式显示程序状况。
ps S :列出程序时,包括已中断的子程序资料。
ps -t<终端机编号> :指定终端机编号,并列出属于该终端机的程序的状况。 ps u:以用户为主的格式来显示程序状况。
ps x:显示所有程序,不以终端机来区分。
Ps -l:较长较详细的显示该 pid 信息
最常用的方法是ps -aux,然后再利用一个管道符号导向到 grep 去查找特定的进程, 然后再对特定的进程进行操作。
案例:
如果想直接监测某个进程占用的资源,既可以使用top -u taozj的方式过滤掉其他用户无关进程,也可以采用下面的方式进行选择,ps命令可以自定义需要打印的条目信息:
while :; do ps -eo user,pid,ni,pri,pcpu,psr,comm | grep ‘a’; sleep 1; done
服务器 CPU 使用率过高情况下相应地排查思路
a) 当 user 占用率过高的时候,通常是某些个别的进程占用了大量的 CPU,这时候很容易通过 top 找到该程序;此时如果怀疑程序异常,可以通过 perf 等思路找出热点调用函数来进一步排查;
b) 当 system 占用率过高的时候,如果 IO 操作(包括终端 IO)比较多,可能会造成这部分的 CPU 占用率高,比如在 file server、database server 等类型的服务器上,否则(比如>20%)很可能有些部分的内核、驱动模块有问题;
c) 当 nice 占用率过高的时候,通常是有意行为,当进程的发起者知道某些进程占用较高的 CPU,会设置其 nice 值确保不会淹没其他进程对 CPU 的使用请求;
d) 当 iowait 占用率过高的时候,通常意味着某些程序的 IO 操作效率很低,或者 IO 对应设备的性能很低以至于读写操作需要很长的时间来完成;
e) 当 irq/softirq 占用率过高的时候,很可能某些外设出现问题,导致产生大量的irq请求,这时候通过检查 /proc/interrupts 文件来深究问题所在。
f) 当 steal 占用率过高的时候,可能是虚拟机超售了!
磁盘存储基础
熟悉RAID存储方式,可以根据应用的不同,选择不同的RAID方式。
尽可能用内存的读写代替直接磁盘I/O,使频繁访问的文件或数据放入内存中进行操作处理,因为内存读写操作比直接磁盘读写的效率要高千倍。
将经常进行读写的文件与长期不变的文件独立出来,分别放置到不同的磁盘设备上。
对于写操作频繁的数据,可以考虑使用裸设备代替文件系统。
使用裸设备的优点有:
数据可以直接读写,不需要经过操作系统级的缓存,节省了内存资源,避免了内存资源争用。
避免了文件系统级的维护开销,比如文件系统需要维护超级块、I-node等。
避免了操作系统的cache预读功能,减少了I/O请求。
使用裸设备的缺点是:
数据管理、空间管理不灵活,需要很专业的人来操作。
良好状态指标
iowait % < 20%
提高命中率的一个简单方式就是增大文件缓存区面积,缓存区越大预存的页面就越多,命中率也越高。
Linux 内核希望能尽可能产生次缺页中断(从文件缓存区读),并且能尽可能避免主缺页中断(从硬盘读),这样随着次缺页中断的增多,文件缓存区也逐步增大,直到系统只有少量可用物理内存的时候 Linux 才开始释放一些不用的页。
iotop
iotop 可以直观的显示各个进程、线程的磁盘读取实时速率;lsof 不仅可以显示普通文件的打开信息(使用者),还可以操作 /dev/sda1 这类设备文件的打开信息,那么比如当分区无法 umount 的时候,就可以通过 lsof 找出磁盘该分区的使用状态了,而且添加 +fg 参数还可以额外显示文件打开 flag 标记。
avgqu-s:发送给设备 I/O 请求的等待队列平均长度,对于单个磁盘如果值>1表明设备饱和,对于多个磁盘阵列的逻辑磁盘情况除外
await(r_await、w_await):平均每次设备 I/O 请求操作的等待时间(ms),包含请求排列在队列中和被服务的时间之和;
svctm:发送给设备 I/O 请求的平均服务时间(ms),如果 svctm 与 await 很接近,表示几乎没有 I/O 等待,磁盘性能很好,否则磁盘队列等待时间较长,磁盘响应较差;
%util:设备的使用率,表明每秒中用于 I/O 工作时间的占比,单个磁盘当 %util>60% 的时候性能就会下降(体现在 await 也会增加),当接近100%时候就设备饱和了,但对于有多个磁盘阵列的逻辑磁盘情况除外;
iostat
iostat 命令行的常用格式:
iostat [ -c | -d ] [ -k | -m ] [ -t ] [ -V ] [ -x ] [ device [ ... ] | ALL ] [ -p [ device | ALL ] ] [ interval
[ count ] ]
各选项以及参数含义如下:
-c: 仅显示 CPU 统计信息.与-d 选项互斥. -d :仅显示磁盘统计信息.与-c 选项互斥.
-k :以 K 为单位显示每秒的磁盘请求数,默认单位块. -p :device | ALL
与-x 选项互斥,用于显示块设备及系统分区的统计信息.也可以在-p 后指定一个设备名, 如:
# iostat -p had
或显示所有设备
# iostat -p ALL
-t :在输出数据时,打印搜集数据的时间.
-V :打印版本号和帮助信息.
-x device 输出指定要统计的磁盘设备名称,默认为所有磁盘设备. interval :指两次统计间隔时间
count :按照 interval 指定的时间间隔统计的次数
案例:
iostat - d -x - k 1 10
rrqm/s:每秒进行merge的读操作数,即delta(rmerge)/s
wrqm/s:每秒进行的merge的写操作数目,即delta(wmerge)/s
r/s:每秒完成的读I/O设备的次数,即delta(rio)/s
w/s:每秒完成写的I/O设备的参数,即delta(wio)/s
rsec/s:每秒写扇区数,即delta(rsect)/s
rkB/s:每秒写千字节数,是rsect/s的一半,因为每个山区的大小为512字节
wkB/s:每秒写千字节数,是wsect/s的一般
avgrp -sz:平均每次设备I/O操作的数据大小
avgqu-sz:平均I/O队列的长度,即deltaa(veq)/s/1000(除以1000是因为aveq的单位是ms)
await:平均每次设备I/O的操作服等待时间(单位:ms),即delta(ruse+wuse)/delta(rio+wio)
svctm:平均每次设备I/O操作的服务时间(单位:ms),即delta(use)/delta(rio+wio)
%util:一秒钟有百分之几的时间用于I/O操作
特别注意参数:
%util接近百分之百的时候,说宁I/O请求过多,I/O系统已经满负荷,该磁盘可能存在瓶颈
await的大小,一般取决于服务器时间(svctm),以及I/O队列的长度和I/O的请求的发出模式。
响应时间大于5mms则说明磁盘I/O压力很大,这时候需要考虑更换响应速度更快的磁盘了。调整内核elevator的算法、优化应用或者升级CPUTips:
sar [options] [-A] [-o file] t [n]
在命令行中,n 和 t 两个参数组合起来定义采样间隔和次数,t 为采样间隔,是必须有 的参数,n 为采样次数,是可选的,默认值是 1,-o file 表示将命令结果以二进制格式 存放在文件中,file 在此处不是关键字,是文件名。options 为命令行选项,sar 命令 的选项很多,下面只列出常用选项:
-A:所有报告的总和。
-u:CPU 利用率
-v:进程、节点、文件和锁表状态。
-p:像是当前系统中指定 CPU 使用信息。 -d:硬盘使用报告。
-r:显示系统内存的使用情况。
-n:显示网络运行状态。参数后面可跟 DEV、EDEV、SOCK 和 FULL。DEV 显示网络
接口信息,EDEV 显示网络错误的统计数据,SOCK 显示套接字信息,FULL 显示前三参数 所以信息。
-q:显示运行队列的大小,它与系统当时的平均负载相同 -B:内存分页情况 -R:显示进程在采样时间内的活动情况。
-g:串口 I/O 的情况。
-b:缓冲区使用情况。
-a:文件读写情况。
-c:系统调用情况。
-R:进程的活动情况。
-y:终端设备活动情况。
-W:系统交换活动。
案例:
sar -d 2 3
await–平均每次设备I/O操作等待时间(毫秒)
svctm–平均每次设备I/O操作的服务时间(毫秒)
%util–一秒中有百分之几的时间用于I/O操作
对磁盘IO性能评判标准:
Tips:
正常svctm应小于await值,而svctm和磁盘性能有关,CPU、内存负荷也会对svctm值造成影响,过多的请求也会间接的导致svctm值的增加。
await值取决svctm和I/O队列长度以及I/O请求模式,
如果svctm的值与await很接近,表示几乎没有I/O等待,磁盘性能很好,
如果await的值远高于svctm的值,则表示I/O队列等待太长,系统上运行的应用程序将变慢,
此时可以通过更换更快的硬盘来解决问题。
%util–衡量磁盘I/O重要指标,
如%util接近100%,表示磁盘产生的I/O请求太多,I/O系统已经满负荷工作,该磁盘可能存在瓶颈。
网络性能对于服务器的重要性不言而喻,工具 iptraf 可以直观的现实网卡的收发速度信息,比较的简洁方便通过 sar -n DEV 1 也可以得到类似的吞吐量信息,而网卡都标配了最大速率信息,比如百兆网卡千兆网卡,很容易查看设备的利用率。
通常,网卡的传输速率并不是网络开发中最为关切的,而是针对特定的 UDP、TCP 连接的丢包率、重传率,以及网络延时等信息
网络性能评估
通过ping命令检测网络的连通性
通过netstat -i组合检测网络接口状况
通过netstat -r组合检测系统的路由表信息
通过sar -n组合显示系统的网络运行状态
netstat
-a (all):显示一个所有的有效连接信息列表,包括已建立的连接(ESTABLISHED),
也包括监听连接请求(LISTENING)的那些连接,断开连接(CLOSE_WAIT)或者处于联 机等待状态的(TIME_WAIT)等
-t (tcp):显示 tcp 相关选项
-u (udp):仅显示 udp 相关选项
-n :拒绝显示别名,能显示数字的全部转化成数字。 -l :仅列出有在 Listen (监听) 的服務状态
-p :显示建立相关链接的程序名
-r :显示路由信息,路由表,除了显示有效路由外,还显示当前有效的连接
netstat -antp #列出所有TCP的连接
netstat -nltp #列出本地所有TCP侦听套接字
sar
sar是一个非常强大的工具,比如 CPU、磁盘、页面交换啥都包括在内,这里使用 -n 主要用来分析网络活动,虽然网络中它还给细分了 NFS、IP、ICMP、SOCK 等各种层次各种协议的数据信息,此处仅展示 TCP 和 UDP的信息。
sudo sar -n TCP,ETCP 1
active/s:本地发起的 TCP 连接,比如通过 connect(),TCP 的状态从CLOSED -> SYN-SENT
passive/s:由远程发起的 TCP 连接,比如通过 accept(),TCP 的状态从LISTEN -> SYN-RCVD
retrans/s(tcpRetransSegs):每秒钟 TCP 重传数目,通常在网络质量差,或者服务器过载后丢包的情况下,根据 TCP 的确认重传机制会发生重传操作
isegerr/s(tcpInErrs):每秒钟接收到出错的数据包(比如 checksum 失败)
sudo sar -n UDP 1
noport/s(udpNoPorts):每秒钟接收到的但是却没有应用程序在指定目的端口的数据报个数
idgmerr/s(udpInErrors):除了上面原因之外的本机接收到但却无法派发的数据报个数
free –m
free是监控Linux内存使用状况最常用的指令
参数说明:
-m:以 M 为单位查看内存使用情况(默认为 kb)
-b:以字节为单位查看内存使用情况
-s:可以在指定时间段内不简单监控内存的使用情况
total:内存总数
used:已经使用的内存数
free:空闲内存数
shared:多个进程共享的内存总额
Tips:
应用程序可用内存/系统物理内存>70%,表示系统内存资源非常充足,不影响系统性能;
应用程序可用内存/系统物理内存<20%,表示系统内存资源紧缺,需要增加系统内存;
20%<应用程序可用内存/系统物理内存<70%,表示系统内存资源基本能满足应用需求,暂时不影响系统性能
Strace
strace 常用来跟踪进程执行时的系统调用和所接收的信号。 在 Linux 世界,进程不能 直接访问硬件设备,当进程需要访问硬件设备(比如读取磁盘文件,接收网络数据等等)时, 必须由用户态模式切换至内核态模式,通过系统调用访问硬件设备。strace 可以跟踪到一个进程产生的系统调用,包括参数,返回值,执行消耗的时间
strace 使用参数
-p:跟踪指定的进程。
-f:跟踪由 fork 子进程系统调用。
-F:尝试跟踪 vfork 子进程系统调吸入,与-f 同时出现时, vfork 不被跟踪。
-o filename:默认 strace 将结果输出到 stdout。通过-o 可以将输出写入到 filename 文件中。
-ff:常与-o 选项一起使用,不同进程(子进程)产生的系统调用输出到 filename.PID 文件。
-r:打印每一个系统调用的相对时间。
-t:在输出中的每一行前加上时间信息。
-tt 时间确定到微秒级。还可以使用-ttt打印相对时间。
-v:输出所有系统调用。默认情况下,一些频繁调用的系统调用不会输出。
-s:指定每一行输出字符串的长度,默认是 32。文件名一直全部输出。
-c:统计每种系统调用所执行的时间,调用次数,出错次数。
-e expr:输出过滤器,通过表达式,可以过滤出掉你不想要输出。
-d:输出 strace 关于标准错误的调试信息。
-h:输出简要的帮助信息。
-i:输出系统调用的入口指针。
-q:禁止输出关于脱离的消息。
-x:以十六进制形式输出非标准字符串。
-xx:所有字符串以十六进制形式输出
lsof
lsof 命令的原始功能是列出打开的文件的进程,但 LINUX 下,所有的设备都是以文件 的行式存在的
-a :列出打开文件存在的进程
-c<进程名> :列出指定进程所打开的文件
-g :列出 GID 号进程详情
-d<文件号> :列出占用该文件号的进程
+d<目录> :列出目录下被打开的文件
+D<目录> :递归列出目录下被打开的文件
-n<目录> :列出使用 NFS 的文件
-i<条件> :列出符合条件的进程。
-p<进程号>: 列出指定进程号所打开的文件
-u 后面跟 username:列出该用户相关进程所打开文件
-U :仅列出系统 socket 文件类型
-h:显示帮助信息 -v:显示版本信息
lsof -g
查看有多少个物理处理器(一行为一个)
cat /proc/cpuinfo |grep "physical id"|sort|uniq -c|wc -l
cat /proc/cpuinfo |grep 'cpu cores'|sort |uniq
每个物理处理器上有多少个逻辑处理器
cat /proc/cpuinfo |grep "core id"|sort|uniq -c|wc -l
cat /proc/cpuinfo |grep "processor"|sort |uniq|wc -l
cat /proc/meminfo |grep "MemTotal"|awk -F ':' '{print $2/1024/1024"G"}'
lscpu
ps auxw|head -1;ps auxw|sort -rn -k3|head -10
ps auxw|head -1;ps auxw|sort -rn -k4|head -10
ps auxw|head -1;ps auxw|sort -rn -k5|head -10
iotop
检查安装环境
[root@DEV ~]# uname -a(查看操作系统信息,所检查服务器为64位操作系统)
[root@DEV ~]# lsb_release -a(查看linux发行商版本)
下载软件
nmon:
版本:nmon16d_x86.tar.gz
地址:http://nmon.sourceforge.net/pmwiki.php?n=Site.Download
nmonanalyser:
版本:nmon analyser v55.zip
地址:https://www.ibm.com/developerworks/community/wikis/home?lang=en#!/wiki/Power+Systems/page/nmon_analyser
安装
安装位置:/home/nmon (任意目录)
1:在home 目录下创建nmon文件夹:
mkdir nmon
2:上传nmon16d_x86.tar.gz 到nmon目录
3:解压:
[root@DEV nmon]# tar -zxvf nmon16d_x86.tar.gz
[root@DEV home]# chmod -R 755 nmon
[root@DEV nmon]# ./nmon_x86_sles12
安装成功显示以下界面:
实时监控
输入以下命令:
c 可显示CPU的信息
m 对应内存
n 对应网络
d 可以查看磁盘信息
t 可以查看系统的进程信息
[root@DEV nmon]# mv nmon_x86_sles12 nmon
[root@DEV nmon]# chmod 755 nmon
[root@DEV nmon]# ./nomn
2:添加到环境变量中:
vim /etc/profile (在profile中写入以下两行内容)
PATH=$PATH:/home/nmon/nmon ($PATH:后为命令的路径)
export PATH
3:使配置文件立即生效
source /etc/profile
nmon (在任何目录下执行nmon命令启动nmon)
采集监控数据
在实际的性能测试中我们需要把一段时间之内的数据记录下来,如:
1、采集数据
[root@DEV nmon]# ./nmon nmon -s1 -c60 -f -m /home/nmon
[root@DEV nmon]# ll /home/nmon/
参数说明:
-s1 每隔n秒抽样一次,这里为1秒
-c60 取出多少个抽样数量,这里为60,即监控=1*60/60=1分钟
-f 按标准格式输出文件名称:_YYMMDD_HHMM.nmon
-m 指定监控文件的存放目录,-m后跟指定目录
生成图形化报表
1:将.nmon文件转化成.csv文件
[root@DEV nmon]# sort DEV_190412_1800.nmon > DEV_190412_1800.csv
[root@DEV nmon]# ll /home/nmon
2:将.csv文件下载到本地
3:打开nmon analyser工具
在本地解压nmon analyser v55.zip
双击打开:nmon analyser v55.xlsm
点击Analyse nmon data按钮,加载之前下载的DEV_190412_1800.csv文件。
结果nmon运行
nmon运行本身是会消耗系统资源,如需关闭nmon,直接kill掉
# ps -ef | grep nmon (得到pid)
# kill -9 pid (安全kill)
Oswatch是oracle官方提供的收集操作系统性能状态信息的小工具,oswatch的安装与使用也比较简单,和nmon一样,都是下载后直接解压就可以使用的。oswatch是通过调用系统的命令完成信息的收集,命令如下:ps ,top ,mpstat ,iostat,netstat ,traceroute vmstat 。支持的操作系统有AIX ,Tru64 ,Solaris ,HP-UX ,Linux
下载安装
使用oracle metalink 帐号登陆后可访问下载的就是tar包,直接解压可以使用,其主要为 shell 脚本调用,该tar包内也有 jar 包, jar包主要生成图形的时候使用 。
启用
命令:./startOSWbb.sh arg1 arg2 arg3 arg4
参数1:指定两次获取数据的间隔,默认不指定为30s;
参数2:指定保留多少小时的数据,默认保留最近48小时;
参数3:gzip 是否进行gzip压缩;
参数4:指定采集到的数据保存的位置,不指定默认保存在当前目录下的archive目录下。
停止
[root@DEV oswbb]# ./stopOSWbb.sh
数据分析与出图
通过去oswatch生成的目录下去寻找 ,未指定时,在oswatch 程序所在的目录下的archive下可以找到对应的数据信息 。如果不确认其存放的位置,也可以通过 ps命令获取到,如下:
[root@DEV ~]# cd /home/oswatch/oswbb/archive
[root@DEV archive]# ps auxf|grep -i osw
归档目录内容如下:
每个目录下收集有相应的命令对应的信息,如oswiostat下是iostat命令收集到的io的相关信息,oswps下收集到的为ps信息 。除了直接查看文本,或将结果处理后使用gnuplot生成图,也可以使用oswbba.jar生成图示信息。
[root@DEV ~]# cd /home/oswatch/oswbb
[root@DEV oswbb]# java -jar oswbba.jar -i /home/oswatch/oswbb/archive
crontab命令概念
crontab命令用于设置周期性被执行的指令。该命令从标准输入设备读取指令,并将其存放于“crontab”文件中,以供之后读取和执行。
cron 系统调度进程。 可以使用它在每天的非高峰负荷时间段运行作业,或在一周或一月中的不同时段运行。cron是系统主要的调度进程,可以在无需人工干预的情况下运行作业。
crontab命令允许用户提交、编辑或删除相应的作业。每一个用户都可以有一个crontab文件来保存调度信息。系统管理员可以通过/etc/cron.deny 和 /etc/cron.allow 这两个文件来禁止或允许用户拥有自己的crontab文件。
crontab检查
[root@DEV ~]# rpm -qa|grep crontab
启动与停止
service crond start //启动服务
service crond stop //关闭服务
service crond restart //重新启动服务
service crond reload //又一次加载配置
全局配置文件
crontab在/etc目录下面存在cron.hourly,cron.daily,cron.weekly,cron.monthly,cron.d五个目录和crontab,cron.deny二个文件。
[root@DEV ~]# ls -l /etc/ |grep -w "cron"
cron.daily是每天执行一次的job
cron.weekly是每个星期执行一次的job
cron.monthly是每月执行一次的job
cron.hourly是每个小时执行一次的job
cron.d是系统自动定期需要做的任务
crontab是设定定时任务执行文件
cron.deny文件就是用于控制不让哪些用户使用Crontab的功能
crontab文件格式
* * * * command
minute hour day month week command
分 时 天 月 星期 命令
minute: 表示分钟,可以是从0到59之间的任何整数。
hour:表示小时,可以是从0到23之间的任何整数。
day:表示日期,可以是从1到31之间的任何整数。
month:表示月份,可以是从1到12之间的任何整数。
week:表示星期几,可以是从0到7之间的任何整数,这里的0或7代表星期日。
command:要执行的命令,可以是系统命令,也可以是自己编写的脚本文件。
特殊字符
星号():代表每的意思,例如month字段如果是星号,则表示每月都执行该命令操作。
逗号(,):表示分隔时段的意思,例如,“1,3,5,7,9”。
中杠(-):表示一个时间范围,例如“2-6”表示“2,3,4,5,6”。
正斜线(/):可以用正斜线指定时间的间隔频率,例如“0-23/2”表示每两小时执行一次。同时正斜线可以和星号一起使用,例如/10,如果用在minute字段,表示每十分钟执行一次。
实例演示
1:在home目录下编写一个test.sh脚本,脚本功能是把/home下ifcfg-eth0这个文本复制到/mnt目录下。
2:运行crontab -e 编写一条定时任务 */5 * * * * /home/test.sh 在每5分钟执行一次test.sh脚本。
3:查询当前用户定时任务或删除当前用户定时任务
定时任务书写要领
要领1:定时任务要加注释
要领2:定时任务命令或脚本结尾加 &>/dev/null 或 >/dev/null 2>&1 或 1>/dev/null 2>/dev/null
要领3:定时任务执行shell脚本前加/bin/sh,定时任务执行shell脚本不必添加执行权限
要领4:定时任务命令或程序尽量写到脚本里,定时任务只要执行脚本即可
注意操作步骤:
(1)、命令行执行
(2)、编写脚本
(3)、测试脚本
(4)、设置定时任务
要领5:生产任务程序不要随意打印输出信息
要领6:定时任务执行的脚本要规范路径 (例如 /server/script)
要领7:配置定时任务要规范操作过程
要领8:定时任务执行特殊的字符需要进行转义,否则会报错,例如 百分号% 转义 %
要领9:定时任务脚本中如果涉及使用到环境变量,必须在脚本中重新定义,不然,定时任务识别不了