文章归档

Dynamic writeback throttling

https://lwn.net/Articles/405076/

Dynamic writeback throttling最主要的核心思想就是IO带宽估算。

the bandwidth estimation allows the kernel to scale dirty limits and I/O sizes to make the best use of all of the devices in the system, regardless of any specific device's performance characteristics. 传统writeback机制的做法是,当进程脏页超过一定比例时,调用balance_dirty_pages()函数进入同步写dirty pages过程,直到dirty pages的比例下降到一定比例,之后才允许该进程返回。

该机制存在三个问题:

  1. 进程脏页比率多少才合适?
  2. 内存压力太大时,多个后台进程同时writeback,会产生大量的随机IO,设备吞吐量下降
  3. 如何更准确的估算设备的真实带宽?

Dynamic writeback throttling的基本做法是:

  1. 启发式的计算设备的真实带宽
  2. 用户进程不再主动同步写,而是通过wait方式等待后台进程刷脏页

»» 继续阅读全文

浅析 Linux 初始化 init 系统

  1. 浅析 Linux 初始化 init 系统,第 1 部分: sysvinit
  2. 浅析 Linux 初始化 init 系统,第 2 部分: UpStart
  3. 浅析 Linux 初始化 init 系统,第 3 部分: Systemd

其中关于systemd对系统启动速度的优化很有趣,另外systemd引入的资源隔离也是一个很值得思考的问题。

基于veth的网络虚拟化

关于Network Namespace的原理不再详解,请直接移步:Namespaces in operation, part 7: Network namespaces 

但是需要注意的,这个文章里network namespace操作所使用的是最新内核&操作系统提供的非常便利的ip netns工具,不过这些工具在低版本的操作系统上都是不提供的。如果真的需要使用network namespace,最好通过netlink编程的方式来实现,直接基于操作系统调用来完成所有设备的虚拟化工作 我们知道在clone进程的时候使用CLONE_NEWNET参数可以创建一个新的独立的network namespace,但是光有这个还是远远不够的,所有网络设备都没有初始化、没启动,这个时候的容器就是一个完全的离线的容器,不在任何网络里,也访问不了任何网络。 

为了让容器独立能够与外网接通,我们需要创建并初始化一些设备,让容器内的网络和外网互通,veth是一种比较简单的方案

»» 继续阅读全文