Linux性能优化和监控系列(二)分析CPU性能

本文发布时间: 2019-Mar-22
分析CPU性能top命令提供了监控CPU性能的基本功能, 如果需要更加深入的挖掘CPU的性能问题, top所提供的信息不足以做到. 由于大多数人认为CPU性能是体现服务器性能的主要因素, 所以在遇到性能问题时, 通常会首先查看CPU的性能来分析服务器的性能问题. 但事实上, 很多情况不是这样的,性能问题可能是由跟CPU相关的其他因素引起的, 比如CPU等待I/O资源.对于下面两个task:Task 1:dd if=/dev/urandom of=/dev/nullTask 2:#!/bin/bashCOUNTER=0while truedo dd if=/dev/urandom of=/root/file.$COUNTER bs=1M count=1 COUNTER=$(( COUNTER + 1 )) [ COUNTER = 1000 ] && exitdone执行Task 1和Task 2后, sy都会增高, 但是执行Task 2时, wa也会增高, 这说明Task 1和Task 2都会使sy增高, 但是Task 2有时需要等待I/O资源, 所以wa也会增高.理解CPU性能为了监控CPU到底在做什么, 需要深入理解Linux内核是怎样工作的, 其中一个重要的组件是运行时队列(run queue), 每个CPU核有一个运行时队列, 在CPU为进程提供服务时, 进程需要首先进入运行时队列等待CPU分配CPU时间. 运行队列里包括可运行的进程(runnable process)和被阻挡的进程(blocked process). Linux的scheduler根据进程的优先级决定哪个runnable process运行, blocked process不会竞争CPU时间. top命令的load arverage是所有runnable process和blocked process的负载的总体概述. 如果需要查看哪些进程处于runnable和blocked状态, 可以通过vmstat来查看, 如:[root@rdhl ~]# vmstatprocs -----------memory---------- ---swap-- -----io---- --system-- -----cpu----- r b swpd free buff cache si so bi bo in cs us sy id wa st 1 0 0 3747904 15492 27980 0 0 767 3 28 17 0 1 98 1 0上下文切换和中断在多任务操作系统中, Linux内核不断在不同进程之间进行上下文切换, 这种上下文切换需要CPU保存旧进程的上下文信息以及检索上下文信息给新进程, 因此上下文切换对CPU的性能代价是很高的. 减少上下文切换带来的性能问题最好的方法是减少上下文切换的次数, 在多核CPU架构中可以实现, 但是需要确保进程被锁定在指定CPU核上来阻止上下文切换. Linux进程调度器并不是进程发生上下文切换的唯一原因, 另一个导致上下文切换发生的原因是硬件中断(hardware interrupts). 进程调度器使用时钟中断(timer interrupt)保证每个进程能获取公平的CPU时间. 正常情况下上下文切换的次数应该小于时钟中断的次数, 如果发现上下文切换次数比时钟中断次数多, 这种负载可能是由系统需要处理很多I/O或者长时间高强度系统调用引起. 因此了解时钟中断和上下文切换的关系对找到引起系统性能问题的原因提供线索. 使用vmstat -s可以查看系统上下文切换和时钟中断次数, 这对查看高数量的上下文切换和IOWAIT的组合非常有帮助, 通过这可以判定系统试着做大量的写操作, 但是不能. 如下是vmstat -s的输出例子:[root@rdhl ~]# vmstat -s 3924700 total memory 218964 used memory 32152 active memory 43332 inactive memory 3705736 free memory 22400 buffer memory 31492 swap cache 4063224 total swap 0 used swap 4063224 free swap 7643 non-nice user cpu ticks 0 nice user cpu ticks 1390112 system cpu ticks 15353492 idle cpu ticks 110105 IO-wait cpu ticks 0 IRQ cpu ticks 185 softirq cpu ticks 0 stolen cpu ticks 84007231 pages paged in 333713 pages paged out 0 pages swapped in 0 pages swapped out 16203245 interrupts 2121904 CPU context switches 1395818922 boot time 5780 forks另一个查看CPU性能的指标是中断数, 中断数可以从/proc/interrupts查看,/pro/interrupts包含每种类型的中断被处理的次数. 如果中断数很高, 那表示Linux内核花很多时间处理中断而导致只有少部分时间处理其他进程.[root@rdhl ~]# cat /proc/interrupts CPU0 CPU1 0: 142 0 IO-APIC-edge timer 1: 7 1 IO-APIC-edge i8042 3: 1 0 IO-APIC-edge 4: 1 0 IO-APIC-edge 7: 0 0 IO-APIC-edge parport0 8: 0 0 IO-APIC-edge rtc0 9: 0 0 IO-APIC-fasteoi acpi 12: 108 2 IO-APIC-edge i8042 14: 0 0 IO-APIC-edge ata_piix 15: 107 1 IO-APIC-edge ata_piix 24: 0 0 PCI-MSI-edge pciehp 25: 0 0 PCI-MSI-edge pciehp 26: 0 0 PCI-MSI-edge pciehp 27: 0 0 PCI-MSI-edge pciehp 28: 0 0 PCI-MSI-edge pciehp 29: 0 0 PCI-MSI-edge pciehp 30: 0 0 PCI-MSI-edge pciehp 31: 0 0 PCI-MSI-edge pciehp 32: 0 0 PCI-MSI-edge pciehp 33: 0 0 PCI-MSI-edge pciehp 34: 0 0 PCI-MSI-edge pciehp 35: 0 0 PCI-MSI-edge pciehp 36: 0 0 PCI-MSI-edge pciehp 37: 0 0 PCI-MSI-edge pciehp 38: 0 0 PCI-MSI-edge pciehp 39: 0 0 PCI-MSI-edge pciehp 40: 0 0 PCI-MSI-edge pciehp 41: 0 0 PCI-MSI-edge pciehp 42: 0 0 PCI-MSI-edge pciehp 43: 0 0 PCI-MSI-edge pciehp 44: 0 0 PCI-MSI-edge pciehp 45: 0 0 PCI-MSI-edge pciehp 46: 0 0 PCI-MSI-edge pciehp 47: 0 0 PCI-MSI-edge pciehp 48: 0 0 PCI-MSI-edge pciehp 49: 0 0 PCI-MSI-edge pciehp 50: 0 0 PCI-MSI-edge pciehp 51: 0 0 PCI-MSI-edge pciehp 52: 0 0 PCI-MSI-edge pciehp 53: 0 0 PCI-MSI-edge pciehp 54: 0 0 PCI-MSI-edge pciehp 55: 0 0 PCI-MSI-edge pciehp 56: 1468 667997 PCI-MSI-edge vmw_pvscsi 57: 367182 0 PCI-MSI-edge eth0-rxtx-0 58: 13 115039 PCI-MSI-edge eth0-rxtx-1 59: 0 0 PCI-MSI-edge eth0-event-2NMI: 0 0 Non-maskable interruptsLOC: 13249018 2561591 Local timer interruptsSPU: 0 0 Spurious interruptsPMI: 0 0 Performance monitoring interruptsIWI: 0 0 IRQ work interruptsRES: 35986 18866 Rescheduling interruptsCAL: 298172 228 Function call interruptsTLB: 1052 2847 TLB shootdownsTRM: 0 0 Thermal event interruptsTHR: 0 0 Threshold APIC interruptsMCE: 0 0 Machine check exceptionsMCP: 285 285 Machine check pollsERR: 0MIS: 0使用vmstat虽然top能监控CPU的大部分信息, 但是不能提供更加详细的CPU信息, 而vmstat可以堪当此任. vmstat有两种使用方式, 一种是sample mode, 在这种方式中, vmstat每个一段时间获取当前系统信息, 如每隔3秒执行一次, vmstat 3. 另一种是加-s选项, 在这种方式中, vmstat获取从系统启动后的系统统计信息, 除了CPU信息, 也包含memory, I/O, swap等.cs上下文切换次数.usCPU花在用户空间的时间百分比.syCPU花在系统空间的时间百分比.idCPU空闲百分比.waCPU等待I/O的时间百分比.


(以上内容不代表本站观点。)
---------------------------------
本网站以及域名有仲裁协议。
本網站以及域名有仲裁協議。

2024-Mar-04 02:10pm
栏目列表