深度学习 GPU利用率为0 为什么gpu利用率为0_System

CPU



相关概念




深度学习 GPU利用率为0 为什么gpu利用率为0_System_02

大脑:CPU



CPU(中央处理器),通常称为简单处理器,是机器中最重要的部件之一。它执行所有类型的数据处理操作,并被认为是计算机的大脑。

在Linux/Unix下,CPU利用率分为用户态、系统态和空闲态,分别表示CPU处于用户态执的时间,系统内核执行的时间,和空闲系统进程执行的时间。

CPU占用率相关的概念




深度学习 GPU利用率为0 为什么gpu利用率为0_tensorflowgpu利用率为0_03

CPU Usage



CPU利用率:CPU的使用情况。

用户时间(User time) :表示CPU执行用户进程的时间,包括nices时间。通常期望用户空间CPU越高越好。

系统时间(System time) :表示CPU在内核运行时间,包括IRQ和softirq时间。系统CPU占用率高,表明系统某部分存在瓶颈。通常值越低越好。

等待时间(Waiting time) :CPU在等待I/O操作完成所花费的时间。系统不应该花费大量时间来等待I/O操作,否则就说明I/O存在瓶颈。

空闲时间(Idle time) :系统处于空闲期,等待进程运行。

Nice时间(Nice time) :系统调整进程优先级所花费的时间。

硬中断处理时间(Hard Irq time) :系统处理硬中断所花费的时间。

软中断处理时间(SoftIrq time) :系统处理软中断中断所花费的时间。

丢失时间(Steal time) :被强制等待(involuntary wait)虚拟CPU的时间,此时hypervisor在为另一个虚拟处理器服务。

Top命令看到的CPU占用率信息及各项值含义




深度学习 GPU利用率为0 为什么gpu利用率为0_优先级_04

Top结果



us: User time,用户态使用的cpu时间比。CPU一共花了多少比例的时间运行在用户态空间或者说是用户进程(running user space processes)。典型的用户态空间程序有:Shell、数据库、web服务器。

sy: System time,系统态使用的cpu时间比。System的含义与User相似。System表示:CPU花了多少比例的时间在内核空间运行。分配内存、IO操作、创建子进程……都是内核操作。这也表明,当IO操作频繁时,System参数会很高。

ni: Nice time,用做nice加权的进程分配的用户态cpu时间比。用户空间进程的CPU的调度优先级,范围为[-20,19]。每个linux进程都有个优先级,优先级高的进程有优先执行的权利,这个叫做pri。进程除了优先级外,还有个优先级的修正值。即比如你原先的优先级是20,然后修正值为-2,那么你最后的进程优先级为18。这个修正值就叫做进程的nice值。

id: Idle time,空闲的cpu时间比。一般而言,idel + user + nice 约等于100%。

wa: Waiting time,cpu等待磁盘写入完成时间。在计算机中,读写磁盘的操作远比CPU运行的速度要慢,CPU负载处理数据,而数据一般在磁盘上需要读到内存中才能处理。当CPU发起读写操作后,需要等着磁盘驱动器将数据读入内存,从而导致CPU 在等待的这一段时间内无事可做。CPU处于这种等待状态的时间由Wait参数来衡量。所以如果一台机器看到wa特别高,那么一般说明是磁盘IO出现问题。

hi: Hard Irq time,硬中断消耗时间

si: SoftIrq time,软中断消耗时间

如果程序都没什么问题,那么是没有hi和si的,但是实际上有个硬中断和软中断的概念。比如硬中断,cpu在执行程序的时候,突然外设硬件(比如硬盘出现问题了)机器需要立刻通知cpu进行现场保存工作。这个时候会cpu会出现上下文切换。就是cpu会有一部分时间会被硬中断占用了,这个时间就是hi。相类似,si是软中断的cpu占用时间,软中断是由软件的指令方式触发的。

st: Steal time,虚拟机偷取时间。对虚拟机来说的,一台物理是可以虚拟化出几台虚拟机的。在其中一台虚拟机上用top查看发现st不为0,就说明本来有这么多个cpu时间是安排给这个虚拟机的,但是由于某种虚拟技术,把这个cpu时间分配给了其他的虚拟机了。这就叫做偷取。

CPU占用率计算




深度学习 GPU利用率为0 为什么gpu利用率为0_用户态_05

CPU Info



Linux CPU占用率计算,都是根据/proc/stat文件内容计算而来。

# more /proc/statcpu 6472314 1098 6201819 2772711549 319041 0 39674 0 0 0cpu0 3213433 575 3090193 1386351128 148476 0 17775 0 0 0cpu1 3258881 523 3111626 1386360421 170564 0 21898 0 0 0intr 4746090484 71 136 0 0 476 0 3 0 0 0 0 32 15 0 0 0 0 0 0 0 0 0 0 0 0 5452335 0 2 1 41790454 34892201 0 1039036 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0ctxt 14490972332btime 1557488267processes 13831454procs_running 1procs_blocked 0softirq 1813943412 1 852734492 9 102441708 0 0 159 405692072 0 453074971

CPU信息,cpu为总的信息,cpu0 ... cpuN为各个具体CPU信息

cpu 6472314 1098 6201819 2772711549 319041 0 39674 0 0

共有9个值(单位:ticks),分别为:

User time:6472314

Nice time:1098

System time:6201819

Idle time:2772711549

Waiting time:319041

HardIrq time:0

SoftIRQ time:39674

Steal time:0

guest time:0

含义解释:

ticks就是系统时钟中断的时间间隔,该值与内核中HZ值有关,即ticks = 1/HZ。

HZ的值,就是每秒的时钟中断数量。可以观察/proc/interrupts中时钟中断值变化,来计算HZ的值。当HZ的值为1000时,ticks的单位即为1/1000秒,即1ms。

CPU占用率计算公式




深度学习 GPU利用率为0 为什么gpu利用率为0_深度学习 GPU利用率为0_06

CPU



CPU占用率计算,都是基于CPU时间计算的。

CPU时间=user+system+nice+idle+iowait+irq+softirq+Stl +guest%us=(User time + Nice time)/CPU时间*100% %sy=(System time + Hard Irq time +SoftIRQ time)/CPU时间*100% %id=(Idle time)/CPU时间*100% %ni=(Nice time)/CPU时间*100% %wa=(Waiting time)/CPU时间*100% %hi=(Hard Irq time)/CPU时间*100% %si=(SoftIRQ time)/CPU时间*100% %st=(Steal time)/CPU时间*100%

CPU利用率总结

  • Linux CPU占用率是根据/proc/stat文件中的数据计算而来;
  • /proc/stat中的数据精度为ticks,即1/HZ秒;
  • 内核每个ticks会更新一次CPU使用信息;
  • CPU占用率的精度为1/HZ秒。