主要是容器使用buffered I/O方式写文件,可能会出现时间波动的问题。

主要是buffered I/O写文件会先写入到内存,导致产生了dirty page。dirty page是需要刷到磁盘的,这就又引入了两个相关的参数

  • dirty_background_ratio:当 dirty pages 数量超过 dirty_background_ratio对应的内存量的时候,内核 flush 线程就会开始把 dirty pages 写入磁盘 ;
  • dirty_ratio:当 dirty pages 数量超过 dirty_ratio 对应的内存量,这时候程序写文件的函数调用 write() 就会被阻塞住,直到这次调用的 dirty pages 全部写入到磁盘。 但是dirty page并不是造成波动的原因

写数据到 Page Cache 的时候,需要不断地去释放原有的页面,这个时间开销是最大的。造成容器中 Buffered I/O write() 不稳定的原因,正是容器在限制内存之后,Page Cache 的数量较小并且不断申请释放。

在对容器做 Memory Cgroup 限制内存大小的时候,不仅要考虑容器中进程实际使用的内存量,还要考虑容器中程序 I/O 的量,合理预留足够的内存作为 Buffered I/O 的 Page Cache