logo资料库

linux性能调优.pdf

第1页 / 共21页
第2页 / 共21页
第3页 / 共21页
第4页 / 共21页
第5页 / 共21页
第6页 / 共21页
第7页 / 共21页
第8页 / 共21页
资料共21页,剩余部分请下载后查看
性能分析步骤
性能优化工具 1、性能指标 性能指标概念:高并发 => 吞吐 响应快 => 延时 该概念是从应用负载的角度出发:Application ▹Libraries▹System Call▹Linux  Kernel ▹Drive 与之对应的是系统资源视角出发 :Drive▹Linux Kernel ▹System Call ▹Libraries  ▹Application  性能指标的评判有以上二种常用的角度 接着六步 1.选择性能指标评估应用和系统的性能 2.为应用和系统设定性能目标 3.进行性能基准测试 4.性能分析定位瓶颈
5.优化系统和应用程序 6.性能监控和告警 六步总结,从正确的角度出发,设定目标(性能优化不是漫无目的的),基准测试 (了解现有系统应用的运行时情况),根据情况分析瓶颈,优化它,设置监控和告警 (其实可以再扩展比如达到一定的负载,采取降级等操作) 2、系统变慢(首先用top或者uptime命令,来了解系统的负载情况)       uptime(依次是过去1分钟、5分钟、15分钟的平均负载) ①平均负载是指单位时间内,系统处于可运行状态和不可中断状态的平均进程数,也就是平 均活跃进程数,平均活跃进程数,直观上的理解就是单位时间内的活跃进程数,但它实际上 是活跃进程数的指数衰减平均值。平均负载不仅包括了正在使用 CPU 的进程,还包括等待  CPU 和等待 I/O 的进程。 1> 可运行状态的进程,是指正在使用CPU或者正在等待CPU的进程,也就是ps命令看到的,处于R 状态(Running 或 Runnable)的进程。 2> 不可中断状态的进程则是正处于内核态关键流程中的进程,并且这些流程是不可打断的,比如最 常见的是等待硬件设备的I/O响应,也就是ps命令中看到的D状态(Uninterruptible Sleep,也称为 Disk Sleep)的进程。不可中断状态实际上是系统对进程和硬件设备的一种保护机制。进程长时间处 于不可中断状态,通常表示系统有 I/O 性能问题。 ②一般当平均负载高于 CPU 数量70%的时候,就应该分析排查负载高的问题。 stress 是一个 Linux 系统压力测试工具,用作异常进程模拟平均负载升高的场景。使用的 是 sync() 系统调用   stress的下一代stress-ng sysstat 包含了常用的 Linux 性能工具,用来监控和分析系统的性能。 mpstat 是一个常用的多核 CPU 性能分析工具 pidstat 是一个常用的进程性能分析工具 ③  平均负载分析: 平均负载高有可能是 CPU 密集型进程导致的; 平均负载高并不一定代表 CPU 使用率高,还有可能是 I/O 更繁忙了; 当发现负载高的时候,可以使用 mpstat、pidstat  htop(基于sar)等工具,辅助分析 负载的来源 三、上下文切换(上下文切换是对任务当前运行状态的暂存和恢复) 1、CPU 上下文切换, 就是先把前一个任务的 CPU 上下文(也就是 CPU 寄存器和程序计数器)保存起来,然后加载新任务的上 下文到这些寄存器和程序计数器,最后再跳转到程序计数器所指的新位置,运行新任务,一次系统调用的 过程,其实是发生了两次 CPU 上下文切换
多个进程竞争CPU时,CPU为了保证每个进程能公平被调度运行,采取了处理任务时间分片的机制,轮流 处理多个进程,由于CPU处理速度非常快,在人类的感官上认为是并行处理,实际是"伪"并行,同一时间只有 一个任务在运行处理。 注:每次上下文切换都需要几十纳秒到数微秒的 CPU 时间 2、进程上下文切换,是指从一个进程切换到另一个进程运行。进程是由内核来管理和调度 的,进程的切换只能发生在内核态 注:内核空间(Ring 0)具有最高权限,可以直接访问所有资源;         用户空间(Ring 3)只能访问受限资源,不能直接访问内存等硬件设备,必须通过系统调用陷入到内 核中,才能         访问这些特权资源。 3、线程上下文切换(线程是调度的基本单位,而进程则是资源拥有的基本单位),有两种情况 ① 前后两个线程属于不同进程。因为资源不共享,所以切换过程就跟进程上下文切换是一样。 ② 前后两个线程属于同一个进程。此时,因为虚拟内存是共享的,所以在切换时,虚拟内存这些资源 就保持不动,只需要切换线程的私有数据、寄存器等不共享的数据。系统调用属于同进程内的CPU上下文 切换 4、中断上下文切换,中断处理会打断进程的正常调度和执行,对同一个 CPU 来说,中断处理比进程拥有 更高的优先级,要消耗CPU,中断是一种异步的事件处理机制,可以提高系统的并发处理能力 注:系统调用过程通常称为特权模式切换,而不是上下文切换 5、什么情况下会触发上下文切换? 系统调用、进程状态转换(运行、就绪、阻塞)、时间片耗尽、系统资源不足、sleep、优先级调整 6、有哪些减少上下文切换的技术用例? 数据库连接池(复用连接)、合理设置应用的最大进程,线程数、直接内存访问DMA、零拷贝技术  7、解决上下文切换次数过多的问题时, ①借助 vmstat 、 pidstat 和 /proc/interrupts 等工具,来辅助排查性能问题的根源。 疑CPU存在瓶颈,可用 sar ­u 和 sar ­q 等来查看 怀疑内存存在瓶颈,可用sar ­B、sar ­r 和 sar ­W 等来查看 怀疑I/O存在瓶颈,可用 sar ­b、sar ­u 和 sar ­d 等来查看 ②CPU 上下文切换可能是,系统卡慢的罪魁祸首     /proc/interrupts 提供了一个只读的中断使用情况 ③中断的变化情况:变化速度最快的是重调度中断(RES)唤醒空闲状态的 CPU 来调度新的任务运行。这 是多处理器系统(SMP)中,调度器用来分散任务到不同 CPU 的机制,通常也被称为处理器间中断 (Inter-Processor Interrupts,IPI)。 8、上下文切换总结: 自愿上下文切换变多了,说明进程都在等待资源,有可能发生了 I/O 等其他问题; 非自愿上下文切换变多了,说明进程都在被强制调度,也就是都在争抢 CPU,说明 CPU 的确成了瓶颈; 中断次数变多了,说明 CPU 被中断处理程序占用,还需要通过查看 /proc/interrupts 文件来分析具体的 中断类型。 四、CPU 使用率升高处理 用户 CPU 和 Nice CPU 高,说明用户态进程占用了较多的 CPU,所以应该着重排查进程的性能问题。
系统 CPU 高,说明内核态占用了较多的 CPU,所以应该着重排查内核线程或者系统调用的性能问题。 I/O 等待 CPU 高,说明等待 I/O 的时间比较长,所以应该着重排查系统存储是不是出现了 I/O 问题。 软中断和硬中断高,说明软中断或硬中断的处理程序占用了较多的 CPU,所以应该着重排查内核中的中断 服务程序。 借助 top、pidstat 等工具,确认引发 CPU 性能问题的来源;再使用 perf 等工具,排查出引起性能问题的 具体函数。 五、某应用CPU使用率居然达到100%  解决方法 用户 CPU 和 Nice CPU 高,说明用户态进程占用了较多的 CPU,所以应该着重排查进程的性能问题。 系统 CPU 高,说明内核态占用了较多的 CPU,所以应该着重排查内核线程或者系统调用的性能问题。 I/O 等待 CPU 高,说明等待 I/O 的时间比较长,所以应该着重排查系统存储是不是出现了 I/O 问题。 软中断和硬中断高,说明软中断或硬中断的处理程序占用了较多的 CPU,所以应该着重排查内核中的中断 服务程序。 碰到 CPU 使用率升高的问题,可以借助 top、pidstat 等工具,确认引发 CPU 性能问题的来源;再使用  perf 等工具,排查出引起性能问题的具体函数。 六、系统CPU使用率居然达到100%  解决方法 ① execsnoop 是一个专为短时进程设计的工具。通过 ftrace 实时(动态追踪)监控进程的 exec() 行为,并 输出短时进程的基本信息,包括进程 PID、父进程 PID、命令行参数以及执行的结果。一般用于分析 Linux  内核的运行时行为 ②碰到常规问题无法解释的 CPU 使用率情况时,首先要想到有可能是短时应用导致的问题,比如有可能是下 面这两种情况 第一,应用里直接调用了其他二进制程序,这些程序通常运行时间比较短,通过 top 等工具也不容易发 现。 第二,应用本身在不停地崩溃重启,而启动过程的资源初始化,很可能会占用相当多的 CPU。 对于这类进程,可以用 pstree 或者 execsnoop 找到它们的父进程,再从父进程所在的应用入手,排查问 题的根源。 七、 R 是 Running 或 Runnable 的缩写,表示进程在 CPU 的就绪队列中,正在运行或者正在等待运行。 D 是 Disk Sleep 的缩写,也就是不可中断状态睡眠(Uninterruptible Sleep),一般表示进程正在跟硬 件交互,并且交互过程不允许被其他进程或中断打断。 Z 是 Zombie 的缩写,如果你玩过“植物大战僵尸”这款游戏,应该知道它的意思。它表示僵尸进程,也 就是进程实际上已经结束了,但是父进程还没有回收它的资源(比如进程的描述符、PID 等)。 S 是 Interruptible Sleep 的缩写,也就是可中断状态睡眠,表示进程因为等待某个事件而被系统挂起。当 进程等待的事件发生时,它会被唤醒并进入 R 状态。
I 是 Idle 的缩写,也就是空闲状态,用在不可中断睡眠的内核线程上。前面说了,硬件交互导致的不可中 断进程用 D 表示,但对某些内核线程来说,它们有可能实际上并没有任何负载,用 Idle 正是为了区分这种 情况。要注意,D 状态的进程会导致平均负载升高, I 状态的进程却不会。 T 或者 t,是 Stopped 或 Traced 的缩写,表示进程处于暂停或者跟踪状态。向一个进程发送 SIGSTOP  信号,它就会因响应这个信号变成暂停状态(Stopped);再向它发送 SIGCONT 信号,进程又会恢复运 行(如果进程是终端里直接启动的,则需要你用 fg 命令,恢复到前台运行)。 注: kill -Stop、debug调试、收到信号、被ptrace系统调用跟踪时进入该状态 而当你用调试器(如 gdb)调试一个进程时,在使用断点中断进程后,进程就会变成跟踪状态,这其实也 是一种特殊的暂停状态,只不过你可以用调试器来跟踪并按需要控制进程的运行。 X 是 Dead 的缩写,表示进程已经消亡,不会在 top 或者 ps 命令中看到它。 九、软中断 ①Linux 将中断处理过程分成了两个阶段,也就是上半部和下半部: 上半部直接处理硬件请求,即硬中断,特点是快速执行,在中断禁止模式下运行,主要处理跟硬件紧密相 关的或时间敏感的工作,/proc/interrupts 提供了硬中断的运行情况 下半部则是由内核触发,即软中断,特点是延迟执行,延迟处理上半部未完成的工作,通常以内核线程的 方式运行, /proc/softirqs 提供了软中断的运行情况,软中断包括网络收发、定时、调度、RCU锁等各种类型 TIMER(定时中断)、NET_RX(网络接收)、SCHED(内核调度)、RCU(RCU锁) 注:每个 CPU 都对应一个软中断内核线程,名字为 “ksoftirqd/CPU编号” ②如何分析是否是软中断引发的问题: 1.检测是哪个线程占用了cpu: top -H -p XX 1 / pidstat -wut -p XX 1  2.在进程中打印各线程号. 找到是哪个线程.[ 此过程也可以省略 但可以快速定位线程] 3.第一步应该可以判断出来中断数过高. 再使用 cat /proc/softirqs 查看是哪种类型的中断数过高. 4.不知道perf report -g -p XX 是否可以定位到具体的系统调用函数. 5.最终还是要查看源码,定位具体的位置,并加以验证. 十、软中断 软中断CPU使用率(softirq)升高是一种很常见的性能问题。实际生产中,我们遇到的性能瓶颈大多是网 络收发类型的软中断,特别是网络接收的软中断。可以借用 sar、tcpdump 等工具,做进一步分析。 hping3 是一个可以构造 TCP/IP 协议数据包的工具,可以对系统进行安全审计、防火墙测试、 SYN  FLOOD 攻击 十一、快速分析系统cpu瓶颈 cpu性能
分享到:
收藏