IO密集问题的简要理解

一 什么是IO密集

IO密集型场景是指系统CPU性能相对于硬盘、内存要好太多,此时系统大部分时间都是CPU在等IO的读写操作,系统CPU利用率不高。

二 典型场景

  • Web应用
  • 游戏客户端加载场景资源
  • 游戏服务端记录日志(可能消耗大量的IO)
  • 游戏服务端读写数据库

三 磁盘IO原理

IO所需要的CPU资源非常少(CPU通知IO线程进行工作),CPU是不会直接和硬盘对话的,大部分工作是分派给DMA芯片(Direct Memory Access:直接存储器)直接内存存取完成的。

计算机硬件上使用DMA来访问磁盘等IO,也就是请求发出后,CPU就不再管了,直到DMA处理器完成任务,再通过中断告诉CPU完成了。所以,单独的一个IO时间,对CPU的占用是很少的,阻塞了就更不会占用CPU了,因为程序都不继续运行了,CPU时间交给其它线程和进程了。


图:异步IO模型(来源:《UNIX网络编程》)

四 网络IO原理


图:网络发送数据(接收数据可以把流程反过来理解)

  1. 当调用系统read接口时,通过DMA(Direct Memory Access)将数据拷贝到内核缓冲区;
  2. 然后由CPU控制,将内核缓冲区的数据拷贝到用户模式的buffer中;
  3. 当调用系统write接口时,会把用户模式下buffer数据拷贝到内核缓冲区的Socket Buffer中;
  4. 最后通过DMA copy将内核模式下的socket buffer中数据拷贝到网卡设备中传输。

从上面整个read、write过程来看,数据白白从内核模式到用户模式走了一圈,浪费了两次Copy,而这两次有需要CPU Copy,即占用CPU资源。

五 优化策略

虽然IO不会占用大量的CPU时间,但凡事都有极端情况,非常频繁的IO还是会非常浪费CPU时间的。面对大量IO的任务,以下3种方式,会大大提高我们的代码的执行效率。

  1. 合并IO(大文件比小文件效率高。测试参考:文件频繁IO能有多大的差别)。
  2. 通过Cache来缓解IO压力。
  3. 使用良好的通信模型。

如果通过上述方式优化之后,仍有性能问题,那我想只能从控制并发量,并即时处理内存的角度来思考了。

六 分析一个网络IO的具体问题

从Web服务器大量下载资源为什么可能导致程序卡住(CPU满载)?

虽然IO不占用CPU资源,但是:1,CPU需要进行用户进程与内核进程间的拷贝操作;2,IO和CPU共同占有总线带宽(系统总线也是一种资源),DMA操作期间,竞争可导致操作系统进程线程调度失效。

参考

发布者

Loy Wong

A Programmer.