Linux性能优化实战(一)
系统变慢首先想到的两个命令top和uptime
平均负载 :简单来说就是单位时间内系统处于 可运行状态 和 不可中断状态 的平均进程数,也就是 平均活跃进程数 。
可运行状态 处于Runable状态的进程,进程状态标志为R
不可中断状态 一般是等待I/O的进程,进程状态标志位D
平均负载理想的情况为cpu的核数,查询cpu核数通过top命令或者从/proc/cpuinfo中读取。
平均负载与CPU使用率
CPU使用率是指单位时间内CPU繁忙情况的统计,而平均负载还包含了不可中断的进程(实际并未使用CPU)
工具篇
stress是一个linux系统压力测试工具,可以用来模拟系统负载升高的场景
sysstat包含了linux常用的性能监控分析工具
背景
Linux是个多任务操作系统,在执行远大于CPU核数的任务时,任务并不是同时进行的,而是操作系统根据调度算法将CPU轮流分配给多个任务执行。
由此任务从哪里开始加载,又从哪里开始执行?
这就需要引入 CPU 寄存器和程序计数器(Program Counter,PC)
CPU寄存器: CUP内容量小速度极快的内存
程序计数器: 用于存储正在执行的指令位置或者即将执行的下一条指令位置
CPU寄存器和程序计数器是CPU运行任何任务前必须依赖的环境因此也叫 CPU上下文
先把前一个任务的CPU上下文(也就是CPU寄存器和程序计数器)保存起来,然后加载新任务的上下文并跳转到新任务程序计数器所指位置开始执行新任务的过程。
Linux权限等级
拥有最高的权限等级,可以访问系统内所有资源
只能访问受限资源,不能直接访问硬件设备,需要通过系统调用才能间访问特权设备
进程既可能在用户空间运行,此时称作 用户态 ,又可能在在内核空间运行此时称作 内核态 ,进程一旦发生 系统调用 就需要从用户态切换到内核态,调用完成后又要从内核态切换回用户态。所以一次系统调用会 至少发生两次CPU上下文切换
系统调用发生的上下文切换实际上还是在同一个进程内,所以不会涉及到虚拟内存等进程资源的切换,因此也叫 特权模式切换 注意与进程上下文切换区分
CPU上下文切换类型
怎么查看CPU上下文切换?
VMSTAT是一款常用的系统性能分析工具,主要用来分析系统的内存使用情况、也常用来分析CPU上下文切换和中断的次数。下面为使用示例:
重点关注以下4列
cs(context switch)是每秒上下文切换的次数。
in(interrupt)则是每秒中断的次数。
r(Running or Runnable)是就绪队列的长度,也就是正在运行和等待CPU的进程数。
b(Blocked)则是处于不可中断睡眠状态的进程数。
VMSTAT只能给出系统总体的上下文切换情况,想要查看每个进程的详细切换情况,就要使用pidstat命令了,加上-w选项。
cswch ,表示每秒自愿上下文切换(voluntary context switches)的次数
nvcswch ,表示每秒非自愿上下文切换(non voluntary context switches)的次数
自愿上下文切换 指进程无法获取到资源导致的切换,如等待IO、内存等系统资源时
非自愿上下文切换 指大量进程争抢CPU时,由于时间片已到等原因,被迫发生的切换
pidstat使用举例
如何查看中断次数?
因为中断发生在内核态,所以不能通过pidstat查看,需要从/proc/interrupts 这个只读文件中读取。/proc 实际上是 Linux 的一个虚拟文件系统,用于内核空间与用户空间之间的通信。/proc/interrupts就是这种通信机制的一部分,提供了一个只读的中断使用情况。
此为个人笔记,不涉及其他,仅做参考