CPU times 与 Wall time

CPU times

进程时间也称 CPU 时间,用来度量进程使用的中央处理器资源。
进程时间以时钟计算,分为用户时间(user),系统时间(sys),总时间(total):用户时间和系统时间是特定进程使用的 CPU 时间,总时间等于用户时间与系统时间之和。

  • user:进程执行用户态代码耗费的 CPU 时间
    进程执行用户态代码耗费的 CPU 时间。仅统计该进程执行时实际使用的 CPU 时间,而不计入其他进程使用的时间片和本进程阻塞的时间
  • sys:进程在内核态运行所耗费的 CPU 时间
    该进程在内核态运行所耗费的 CPU 时间,即内核执行系统调用所使用的 CPU 时间
  • total:进程(包括线程和子进程)所使用的实际 CPU 时间
    CPU 执行用户进程操作和内核系统调用所耗时间的总和(total = user + sys),即该进程(包括线程和子进程)所使用的实际 CPU 时间。若程序循环遍历数组,则会增加用户时间;若程序执行 exec 或 fork 等系统调用,则会增加系统时间

Wall time

  • wall time:进程起止所耗墙上时钟时间,也叫 real time
    进程从开始执行到完成,所经历的墙上时钟时间(实际时间),包括其他进程使用的时间片(time slice)和本进程耗费在阻塞(如等待I/O操作完成)上的时间。

在多核处理器计算机上,若进程含有多个线程或通过 fork 调用创建子进程,则墙上时钟时间可能小于 CPU 总时间,因为不同线程或进程可并行执行,但其时间会计入主进程的 CPU 总时间;若程序在某段时间处于等待状态而并未执行,则墙上时钟时间可能大于 CPU 总时间

  • wall time < total,进程为计算密集型(CPU bound),我们可以利用多核处理器的并行执行优势
  • wall time ≈ total,进程为计算密集型,未并行执行
  • wall time > total,进程为I/O密集型?(I/O bound),多核并行执行优势并不明

线程与进程

  • 线程和进程通常都有一个 主线/进程 负责分配任务和其他 子线/进程 负责执行任务
  • 多进程的优点在于一个子进程挂了,不会影响其他进程(主进程挂了就全挂了),但是其创建的代价较大,Apache 采用的就是多进程机制
  • 而多线程一般要比多进程执行效率要高,但是由于共享内存一旦子线程挂了,就全挂了,ISS 采用的就是多线程机制

计算密集型 IO密集型

  • 计算密集型任务主要消耗大量 CPU 资源,不停进行计算。由于依靠 CPU 性能,一直占用 CPU 进行计算,也就说一般情况下能够采用多任务的数量等于 CPU 核心数。该种任务 C 语言比较胜任
  • IO 密集型任务(磁盘读取,web 服务)主要需要 IO 的读取,利用 CPU 的效率较低,大量时间花费在 IO 上。由于现在有异步 IO 技术,也就是说一个任务在 IO 等待时间时可以暂停运行,让 CPU 的空闲时间用来运行其他任务,等到 IO 读取完毕后再继续执行。从而实现单核 CPU 上运行单进程却能实现多任务的并发。该种任务 Python(执行效率相对较低)比较适合
  • 对于优化,应该通过开发的服务或是业务以在项目之初就根据需求来对资源进行预先估算,大致属于 IO 密集型还是计算密集型的业务,并进行项目前期的资源预算等工作的开展,也包括前期的设计和后期的优化

发表评论