赞
踩
目录
2.1 查看CPU信息(cat /proc/cpuinfo)
2.3 超线程(Hyper-Threading,简称"HT")技术
3.4.1 cpu利用率高是否可以推倒 load 高,答案是不能的。
ps aux | grep -i ssh # 查ssh服务的进程
常见的参数说明:
-e 列出程序时,显示每个程序所使用的的环境变量
-f 用ASCII 字符显示树状结构,表达程序间的相互关系
-a 显示现行终端机下的所有程序,包括其他用户的程序
-u 以用户为主的格式来显示程序状态
-x 显示所有程序,不以终端机来区分
补充:
① ps 是用来报告程序执行状态的命令,也可搭配kill 指令随时中断、删除不必要的程序
② 使用常用命令,参数无需死记硬背,更多的需要学会查看帮忙(man 命令,如man ps)得以使用
可中断睡眠与不可中断的睡眠本质的区别?
时间片:简单来说就是CPU分配给各个程序的时间,使各个程序从表面上看是同时进行的,而不会造成CPU资源浪费。CPU不可能长时间给某个进程使用,所以系统会设置一个时间。
假如进程切换(process switch) - 有时称为上下文切换(context switch),需要10ms,再假设时间片设为100ms,则在做完100毫秒有用的工作之后,CPU将花费10毫秒来进行进程切换。CPU时间的10%被浪费在了管理开销上。
时间片在抢占式的调度中,优先级高的线程可以从优先级低的线程那里抢占CPU,在抢占的过程中也会消耗CPU时间。
时间片的两种情况:
1、时间片用完了
2、时间片抢占
优先级的多少,就决定了占用CPU时间的多少(优先级高,占用的时间就多)
编写执行脚本 a.sh,如下:
- vim a.sh
-
- #! /bin/bash
- echo 1;
-
- wq
执行命令:
while true ; do ./a.sh ; done
另开一个终端,执行:
ps aux | grep a.sh
结论1:取得这一瞬间的快照,没有grep到值(sleep时间太短),执行完就立马消亡了
案例1(采集进程状态的转变2):
执行文件改为:
- #! /bin/bash
- while true; do
- echo 1;
- done; # 该文件会一直被执行
结论2:通过循环,来加大采样频率,这样才有机会采样的到进程的状态数据
vim 2.sh
- #! /bin/bash
- for((i=1;i<=3;i++)); do
- sleep 1
- echo $i
- done
time ./2.sh # 获取 2.sh 应用程序执行的时间信息
real 0m0.001s 进程消耗时间
cpu时间(cpu时间:user+sys消耗时间)
user 0m0.000s 进程用户态cpu时间
sys 0m0.000s 进程内核态cpu时间
结论:假设进程a占用了27个core,每个core使用cpu时间0.1s,这个进程执行了1s,那么进程执行时间 1s, cpu时间为27*0.1=2.7s
案例演示: 1. 一端执行top 命令 2.另一端执行ps命令数据的采集,如下命令:
while true; do ps -e -o 'pid,comm,args,pcpu,rsz,vsz,stime,etime,time,user,uid' | grep top ; sleep 1; echo ; done
stime : 什么时间点启动的(表示进程开始的时间)
etime : 当前时间-开始时间(表示进程存活的时间)
time:表示进程从启动开始到现在消耗的cpu时间(user+sys)
操作系统如何调用硬件分层? 【上层为软件或者程序,底层为硬件】
time +有值,表示一定有使用过cpu(有值说明程序一定调用过内核或者接口)
ps命令中的 time 与 top命令中的time+ 的区别?
主要通过top命令中的ni 值来查看进程的优先级。优先级(priority)为操作系统用来决定CPU分配的参数,linux 使用[回合制(round-robin)]的演算法来做CPU排程,优先序越高,所可能获得的CPU时间就越多。
我们可以通过nice命令以更改过的优先序来执行程序,如果未指定程序,则会印出目前的排程优先序,内定的adjustment 为10,范围为-20(最高优先序) 到 19(最低优先序),进程默认优先级为0
NI 越小(-20)优先级越高,时间片更多(最终都是为%cpu服务的)
PR 为实时优先级。0 ~ 99,默认20,PR 与NICE结合来看进程的优先级
nice -n 1 ls # 将ls的优先级加1,并执行
进程上下文切换的原因 ?
超线程(Hyper-Threading,简称"HT")技术就是利用特殊的硬件指令,把两个逻辑内核模拟成两个呃呃物理芯片,让单个处理器都能使用线程级并行计算,进而兼容多线程操作系统和软件,减少了CPU的空闲时间,提高了CPU的运行效率。
超线程技术是在一颗CPU同时执行多个线程而共同分享一颗CPU内的资源,理论上要像两颗CPU一样在同一时间执行两个线程。因每个CPU都具有独立的资源,当两个线程都同时需要某一个资源时,其中一个要暂时停止,并让出资源,知道这些资源闲置后才能继续,因此超线程的性能并不等于两颗CPU的性能。
如果"siblings" 是 "cpu cores "的两倍,则说明支持超线程,并且超线程一打开。
如上图,physical id =(0,1)说明有2颗物理CPU,每颗物理CPU有4个逻辑处理器。每颗物理CPU对应的逻辑处理器为(0,2,4,6) (1,3,5,7),所以上图的CPU构成是拥有超线程技术8核CPU。
举例不拥有超线程技术的案例,如下图:
如上图,physical id =(0),说明有1颗物理CPU(没有超线程技术),1颗物理CPU有4个逻辑处理器(0,1,2,3),只是单纯的4核CPU。
有一个形象的例子可以说明系统负载模型,即"交通拥堵模型"
过去1分钟,5分钟,15分钟内的平均负载。说明:过去,不能表示实时负载,不能拿过去忙,推现在忙。不能那过去平均,推当下平均
举例分析(load average 2,10,50):
2,10,15强调的趋势,过去平均一分钟,不是这一刻的,强调的是趋势的概念,不能拿平均推实时,趋势推实时,这是有问题的。
都是平均值,所以只能从平均上来说,过去多少时间到多少时间,他是繁忙、忙、不忙,只能从趋势来说。负载是下降的。
实时的含义(当前负载): 0-60s ---》10s前才压测结束,压力是在逐级递减
cpu负载推导公式 适用于 load average 1,5,15分钟不同阶段的忙与不忙的情况,最多只是反映一种趋势。
根据经验值,得出如下公式:
公式推导的几个思路:
案例分析:
top - 07:40:57 up 25 min, 2 users, load average: 50, 50, 50
现假设你有16 processor 的cpu,如何定义负载繁忙的阈值?【每个公司的阈值不一样高,所以系数会调整】
通过拿到过去(过去5分钟,15分钟)的负载,我们能得到什么结论?
load average这个值是用过去一分钟的值,还是五分钟、十五分钟的值呢?
cat /proc/loadavg 查看负载信息中的进程总数,具体指哪些状态的进程?
R + D 状态的进程(不包括sleeping状态)
栗子:如下情况,2个进程用了32core,CPU使用率、系统负载是高还是低?
从CPU利用率的角度,很高。但从系统负载来说,不高【1 * processor = 32 > 2】
又如下情况来说明两者没有必然的关系:
为什么会出现上述的情况呢?
从CPU负载长度来分析,负载长度包括 R + D状态的进程,目前如果一个进程占用了大量CPU【如Java进程占用 1276% mysql 进程占用了943.1%】,2个进程加起来共占用约22个cpu。
一般说,20几个进程说明负载很忙,但现在2个进程就干了人家20几个进程的活,所以推导不出CPU利用率高,就说明load高
负载统计的是进程R+D的个数,但是有可能是某个进程占用了大部分的CPU,所以负载小,资源利用率确很高
如:单个进程占cpu 1% - 2% , loadavg 128 , 那么CPU总共才占12.8 % cpu【需要考虑CPU的核心数】,每个进程几乎不怎么消耗cpu
load 高只能推导进程多,是否就因此导致CPU高,需要具体问题具体分析。两者不能相互推导。
结论:负载只是表示当前系统的繁忙程度,CPU利用率和负载没有太大的关联,负载多了会影响系统处理,变慢。因为它在不断的进行上下文切换。
什么情况下会出发中断,上下文切换?
设置阈值的目的,是要保证有一定的余地。没有绝对的50,70,90的概念,需要结合服务器的核心数(processor)来合理给出预设的阈值。
以4core 的cpu机器为例:CPU>=50%注意 、CPU>=70% 警告、CPU>=90%严重警告
但是否以上的阈值可以完全套用呢,答案又完全不是,如下对比即可说明:
4 core 200% 200% 预留2core保底
32 core 1600% 1600% 预留16core保底
64 core 3200% 3200% 预留32core保底
这样设置存在严重的cpu浪费,只要预留相对应的核数即可。多少个核数,多少的cpu利用率来做阈值定义会好一些,如警告阈值为70%,假设 4core,那么应保留 400 *30% =120。1.2core的cpu 作为预警阈值比较合理。
假设 32core ,就不应该是 70%了,可能是80%、90%、95%甚至更多【以4核数据为基础,根据不同的情况来分析定义,不然就是对cpu的浪费】
CPU阈值推导思路(以2core为推导基础):
第一行:
top - 17:28:44:当前时间 up 2 days, 17:02:系统运行时间 1 user:当前登录用户数
load average: 0.00, 0.01, 0.05:系统负载平均长度
第二、三行,为进程和CPU的信息
Tasks: 75 total, 1 running, 74 sleeping, 0 stopped, 0 zombie
%Cpu(s): 0.3 us, 0.3 sy, 0.0 ni, 99.3 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
各项指标异常,都是先找进程,把进程从高到低进行排序,都会反映到%CPU上。只是拿到进程后根据具体哪个指标高,再具体分析哪个指标,比如hi高,先分析中断的原因。
第四行为内存信息(free)
Mem : 1881620 total:物理内存总量
1210072 free:空闲内存
154660 used:使用的物理内存总量
516888 buff/cache:缓存/缓冲的交换区内存量
KiB Swap: 0 total:交换区内存总量
第六七行为进程信息(ps aux)
CPU使用率过高的时候,表示当前软中断占用很大的百分比,关于软中断的统计没有明确的统计文件定义,一般需要程序员设计中断的时候进行统计,参考文件/proc/net/softnet_stat,以及查看当前哪些进程和服务所占用的CPU较高,可以通过设置 top f 显示当前进程的CPU信息,检查进程所做的操作,如处理网络的报文,长时间的写日志等等,都会产生软中断。
网卡中断使用的cpu:从网卡过来的数据包多(收发包多) ,需要我们去找网络收发包的进程
软件中断:软件收、发包,这样的动作,系统要处理这些动作,就会触发软件中断
%si高的情况下,先找进程,把进程从高到低排序,看下这些进程为什么占用si比较高
恶意攻击是不是会使si% 比较高?
看它是否有到内核层,到达内核层才会触发软件中断。有些攻击是直接被网卡给过滤掉了。
%hi 的使用率过高时,表示当前硬件中断占用很大的百分比,一般硬件中断我们可以分析文件/proc/interrupts,/proc/irq/1/smp_affinity,服务irqbalance是否配置,以及cpu的频率设置。
如果hi% 使用率比较高(硬件中断比较高),怎么分析?
先找进程,找到cpu占用高,然后去分析这些进程信息,不管什么原因引起的cpu高,都这么去分析
看中断技术,查硬件中断的信息会写到interrupts文件里,执行以下指令
- cat /proc/interrupts > hi1.txt ; sleep 2; cat /proc/interrupts > hi2.txt
- vimdiff hi1.txt hi2.txt #将硬件中断的信息写到文件里,在对文件进行对比分析
cat /proc/stat #该文件包含了某一进程所有的活动的信息
interrupts #硬件中断文件
跟硬件有关的东西,产生的硬件中断。键盘输入指令,就会产生一次硬件中断
如:键盘随时等着输入东西,输完以后,触发一个硬件中断,底层协议栈才知道把这个东西input ,给打进我们的程序里面,鼠标输入也是如此。
vim hi1.txt -- i -- vsplit hi2.txt
TOP命令发现%hi消耗cpu比较多,怎么找具体的中断源?
找到中断号922,在eth1消耗比较多,在分析中断号922与网卡怎么打交道的,什么操作导致中断多。
"echo "F" > /proc/irq/17/smp_affinity #将中断号17打散到cpu 0 1 2 3上面去
top -b -d 3 > top.txt # 每3秒采集一次top 的数据,保存到top.txt文件里
cat top.log | grep 'Cpu' 或 grep Cpu top.txt | sed "s|\%[a−z][a−z]\,||g" # 获取cpu的数据信息
grep top top.txt | grep 15812 # 获取进程的数据信息
grep出来的数据没有标题,不好分析,可以通过以下的命令进行标题的补全:
echo "PID USER PR NI VIRI RES SHR S %CPU %MEM TIME+ PPID GROUP SWAP TIME COMMAND";grep top top.txt | grep 15812
grep PID top.txt |head -n1;grep top top.txt | grep 15812 # 取关键字第一行数据+ grep 15812进程数据,效果比上一条更明了简洁
top使用技巧:
按数字1,显示平均或者每个cpu信息。当机器的核数太多,按1显示不全,可以使用 mpstat 1(sar -u 1)查看cpu信息
top常用操作配置:
top 页面 --->d --->1 (把默认刷新的时间3s 改成了1s) ---> W 保存设置
top页面 ---> f ----> 选中 *swap(top页面新增swap 列字段) ---> W 保存设置
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。