Linux 新玩意 - 4.3.0

Idle Page Tracking

一般來說, linux kernel 在內存空間緊張時會以 OOM killer 幹掉 processes 以回收內存 - 有效, 但會掉資料. Minchan Kim 舉了個例子

[Having a process killed to free memory] was really terrible experience because I lost my best score of game I had ever after I switch the phone call while I enjoyed the game

一個比較好的方式是, 是由應用跟 kernel 說

這些 page 你需要時可以回收, 內容丟了沒關係.

這樣, 一些如 web browser 之類吃內存的大傢伙, 可以設定放置網頁內容的 page 為可回收的, 此時, 如果 kernel 進行了內存回收, 之後 browser 要再存取那些內容前會先將內存段再設為不可回收的 - 如果內存已回收, 這個動作會失敗, browser 就知道要重新載入 disk 上的 cache.

sys_membarrier()

RCU (Read-Copy-Update) 被大量的用在了 linux kernel 中, 在讀端能有線性成長的效能, 如果, 應用也有這樣的同步機制, 那以讀為主的服務如 redis 在多 CPU 環境下就可以有更好的效能了, liburcu 就是這樣的 library. 不過, 在 user space 實現 memory barrier 並不是那麼簡單的事 (要瞭解為什麼, 必須瞭解 memory barrier 能 & 不能做什麼), 所以, 這個 syscall 經過了相當長的時間才進到了 mainline kernel.

userfaultfd()

在一些應用場景如 kvm 的 live migration, 當 vm 從 host A 轉移上 host B 上運行時, 會開始存取 memory 中的內容. 如果 vm 等到原來在 host A 上的 memory 內容完全載入, 那會造成開始服務的時間延後許多. 如果, user space 的程序也能接到 page fault 通知, 那我們可以在