I/O Performance

Basic Concept

I/O performance 討論的是:為什麼 I/O 常常成為整體系統效能瓶頸,以及 OS 可以怎麼降低 I/O path 上的成本。一次 I/O request 不只是 device 本身慢;它還會讓 CPU 執行 driver code、進出 kernel、排程 process、處理 interrupt、copy data、競爭 memory bus。

application ↔ kernel ↔ driver ↔ controller ↔ device

Cost Sources

Interrupt Handling

Interrupt 讓 CPU 不必一直 polling,但每次 interrupt 都要保存 state、執行 handler、restore state。如果 interrupt rate 很高,這些 overhead 會明顯消耗 CPU。

Context Switching

Blocking I/O 會讓 process 從 run queue 移到 wait queue;I/O 完成後又回到 ready queue。這會造成 scheduler 工作、CPU cache disruption、以及 process state 切換成本。

Memory Copy

資料常常需要在多個地方 copy:

  • controller / DMA → kernel buffer。
  • kernel buffer → user buffer。
  • application buffer → kernel buffer。
  • protocol stack 中不同 layer 之間的 packet copy。

這些 copy 會消耗 CPU 和 memory bandwidth。當 device 很快,例如高速 NVM 或 network 時,copy overhead 反而可能成為瓶頸。

Software Layers

Network I/O 尤其明顯。遠端 login 的一個 character 可能經過 keyboard interrupt、terminal driver、user process、network system call、protocol stack、network driver、network controller、remote kernel、daemon,再回傳 echo

Polling vs Interrupt

現代 driver 可能使用 hybrid strategy:低流量時用 interrupt;流量高時切換到 polling 或批次處理,降低 interrupt frequency。

Offloading

一種改善 I/O performance 的方法,是把工作從 main CPU 移到 specialized hardware 像是 DMA controller

Offloading 的目標是提高 concurrency:main CPU 可以繼續執行 computation,I/O controller 同時搬資料或處理 protocol

Where to Put Functionality

I/O functionality 可以放在不同層:

Layer優點缺點
Application容易開發、debug,不容易 crash kernelcontext switch 多,不能直接用 kernel internal data structure
Kernel / driver效能較好,可用 kernel locking/threading/cachebug 可能造成 data corruption 或 system crash
Controller / hardware最高效,可和 CPU 並行難修改、開發成本高、彈性低

常見發展路徑是:新演算法先在 application 層實驗;證明有效後移到 kernel;若非常重要且穩定,最後可能移到 hardware。