Linux 新玩意 - 4.3.0
Idle Page Tracking
- idle memory tracking
- Avoiding game-score loss with per-process reclaim
- Many more words on volatile ranges
一般來說, 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()
- sys_membarrier()
- sys_membarrier(): system/process-wide memory barrier (x86) (v12)
- membarrier system call
- sys_membarrier(): system-wide memory barrier (x86)
- introduce sys_membarrier(): process-wide memory barrier (v6)
- introduce sys_membarrier(): process-wide memory barrier
- http://liburcu.org/
RCU (Read-Copy-Update) 被大量的用在了 linux kernel 中, 在讀端能有線性成長的效能, 如果, 應用也有這樣的同步機制, 那以讀為主的服務如 redis 在多 CPU 環境下就可以有更好的效能了, liburcu 就是這樣的 library. 不過, 在 user space 實現 memory barrier 並不是那麼簡單的事 (要瞭解為什麼, 必須瞭解 memory barrier 能 & 不能做什麼), 所以, 這個 syscall 經過了相當長的時間才進到了 mainline kernel.
userfaultfd()
- Page faults in user space: MADV_USERFAULT, remap_anon_range(), and userfaultfd()
- Memory Externalization With userfaultd by Andrea Arcangeli & Dr. David Alan Gilbert
- RFC: userfault v2
- RFC: userfaultfd v3
- https://lwn.net/Articles/644532/
- Userfaultfd
在一些應用場景如 kvm 的 live migration, 當 vm 從 host A 轉移上 host B 上運行時, 會開始存取 memory 中的內容. 如果 vm 等到原來在 host A 上的 memory 內容完全載入, 那會造成開始服務的時間延後許多. 如果, user space 的程序也能接到 page fault 通知, 那我們可以在