一、CPU性能
1.uptime--系统平均负载
~$ uptime
16:04:46 up 2:41, 4 users, load average: 0.86, 0.33, 0.12
前面三个参数代表:系统当前时间,系统运行时间,系统登录用户;
load average后面三个数字分别代表1分钟,5分钟,15分钟平均负载。
其中,平均负载表示平均活跃进程数。比如:2核CPU的平均负载为2时,代表CPU正好被利用完;如果超过2,则表示超载了。
查看CPU核数的方法如下:
cat /proc/cpuinfo
可以查看到有两颗CPU
也可通过下面的方法查看:
grep 'processor' /proc/cpuinfo
grep 'processor' /proc/cpuinfo |wc -l
注意:平均负载和CPU的利用率并不能等同
平均负载是:单位时间内,系统可运行和不可中断的进程数,包括等待CPU、等待I/O的进程数;
CPU利用率:单位时间内,CPU的繁忙统计
- CPU密集型,两者可以大体等同
- I/O密集型,I/O导致负载过高,但CPU利用率不一定高
如果平均负载高于70%,就认为负载过高,下面通过工具进行定位系统出问题的地方:
- iostat(I/O statistics) https://www.jellythink.com/archives/438
- mpstat(Multiprocessor Statistics)
- pidstat https://www.jellythink.com/archives/444
2.CPU的上下文切换
CPU上下文:CPU寄存器和程序计数器;其中,程序计数器保存程序正在运行的位置。
CPU上下文切换:一个运行体(进程、线程、中断)从CPU退出,另外一个运行体进入;被换下的运行体下次还要接着在CPU上运行,所以必须保存现场(CPU上下文)。
进程上下文切换:由于进程可以运行在用户态(用户程序运行),又可以运行在内核态(系统函数调用);所以进程上下文切换需要保存内核空间的状态、CPU寄存器,还需要保存虚拟内存、用户栈。
系统调用:也称特权模式切换,并不是上下文切换,因为它没有进行进程切换;但是系统调用会进行CPU上下文切换。
进程调度的触发情况:
- CPU的时间片耗尽
- 进程在系统的资源不足
- 调用sleep
- 有高优先级的进行
线程的上下文切换:(1)线程切换前后不同属一个进程,这种情况和进程切换相同;(2)线程切换前后同属一个进程,这种情况,由于虚拟内存共享,不需要切换,但寄存器、私有数据、栈需要求换。
中断上下文切换:中断通常来自硬件的请求,打断正在运行的进行,从而运行中断程序,中断程序运行完后,进程程序接着运行;由于中断发生在内核,所以中断只需要保存内核状态、CPU寄存器等。
不管是那种上下文切换,保护现场/恢复现场是要付出代价的,因此上下文切换是linux系统性能需要关注的一项指标。
如何查看上下文切换?
使用vmstat工具。
//一秒输出一组数据
$ vmstat 1
- cs(context switch)是每秒上下文切换的次数。
- in(interruput)每秒中断次数。
- r(Running or Runnable)是就绪队列的长度,也就是正在运行和等待 CPU 的进程数。
- b(Blocked)是处于不可中断睡眠状态的进程数。
下面使用sysbech工具测试一下上面几个指标:
sysbench --num-threads=10 --max-time=300 --test=threads run
vmstat查看总体,pidstat查看每个进程的情况,加上-w可以查看cswch和nvcswch
- cswch(voluntary context switches)自愿上下文切换数:I/O、内存资源不足时,自愿发生切换
- nvcwch(non voluntary context switches)非自愿上下文切换数:CPU时间片耗尽,被系统强制调度
pidstat -w
另外,可以查看一下中断:
watch -d cat /proc/interrupts
【总结】
- 自愿上下文切换数变多,说明进程都在等待,可能是I/O等问题;
- 非自愿上下文切换数变多,说明进程被强制调度,说明进程都在抢占CPU,说明CPU本身到达了瓶颈;
- 中断次数变多,说明中断占用CPU,需要查看具体哪种中断。
总结一下CPU性能分析的相关工具:
- top/htop
- iostat
- mpstat
- pidstat
- vmstat
- dstat
- perf
- execsnoop : 分析 Linux 内核的运行时行为
【问题1】CPU使用率飙到100%,怎么办?
【问题2】系统出现大量僵尸进程,怎么解决?
二、磁盘I/O性能
四、网络性能