性能
当我们谈论性能时究竟在讨论什么?一般说的性能是指系统性能。那么系统性能问题的本质是什么?当耗尽系统资源的情况下系统处理速度和支撑的请求数低于预期或异与其它时间的表现。
CPU使用率
- CPU 使用率描述了非空闲时间占总 CPU 时间的百分比,根据 CPU 上运行任务的不同,又被分为用户 CPU、系统 CPU、等待 I/O CPU、软中断和硬中断等。
平均负载
- 平均负载是指单位时间内,系统处于可运行状态和不可中断状态的平均进程数,也就是平均活跃进程数。所谓可运行状态的进程,是指正在使用 CPU 或者正在等待 CPU 的进程,也就是我们常用 ps 命令看到的,处于 R 状态(Running 或 Runnable)的进程。不可中断状态的进程则是正处于内核态关键流程中的进程,并且这些流程是不可打断的,比如最常见的是等待硬件设备的 I/O 响应,也就是我们在 ps 命令中看到的 D 状态(Uninterruptible Sleep,也称为 Disk Sleep)的进程。
- 平均负载高并不意味着cpu的使用率一定高。等待I/O也会导致平均负载升高,大量等待CPU的进程调度也会导致平均负载升高,以上两种情况CPU使用率并不高。
上下文切换
不同种类的上下文切换
进程上下文
进程是由内核来管理和调度的,进程的切换只能发生在内核态。所以,进程的上下文不仅包括了虚拟内存、栈、全局变量等用户空间的资源,还包括了内核堆栈、寄存器等内核空间的状态。
线程上下文切换
线程是调度的基本单位,而进程则是资源拥有的基本单位。
线程上下文切换可能是两个不同的线程在不同的进程下,这时候就是两个进程的上下文切换,在同一进程下,因为资源是共享的,所以只需要切换私有数据,寄存器等不共享的数据。
中断上下文切换
中断处理比进程拥有更高的优先级
中断上下文切换不涉及到进程的用户态,只需保存内核态下的CPU寄存器,内核堆栈,硬件中断参数等。
CPU缓存命中率
命中率越高性能越好。
进程的状态
- R:运行或就绪。
- D:不可中断状态睡眠(Uninterruptible Sleep),一般表示进程正在跟硬件交互,并且交互过程不允许被其他进程或中断打断。
- Z:僵尸进程,父进程未回收一结束的子进程。
- S:也就是可中断状态睡眠,表示进程因为等待某个事件而被系统挂起。当进程等待的事件发生时,它会被唤醒并进入 R 状态。
- I:空闲状态。
- T:暂停或跟踪状态。
- X:进程已消亡。
CPU使用率过高
- 当系统CPU使用率异常增高时,理想状况下处理方式是先定位到CPU使用率高的进程,找到程序中占用CPU最高部分的代码片段。有时无法定位到进程时需要通过系统其它参数,例如正在运行的任务,等待任务,IO状态等状态来缩小问题范围。
僵尸进程
- I/O异常时可先找到异常的进程,观察异常进程的状态,处理僵尸进程一般通过找到父进程。
中断
- 中断是一种异步事件处理机制,linux将中断分为两部分,上半部和下下半部,上半部用来快速处理中断,在中断禁止模式下运行。下半部在内核态下完成。例如网络包到达网卡后,网卡会触发中断,中断上半部将数据从网卡复制到内存,下半部应用程序从内存中获取数据。上半部会打断cpu正在执行的任务。
CPU性能指标
指标工具

