影響一個應用程序性能的因素有很多,這次說說page fault。
1. 為什么會存在page fault問題?
計算機的物理內存(看看你的內存條)有限,一般現在都是幾個GB的容量了,BTW,我的筆記本有8GB,:-)。
但應用程序的需求是無限的,操作系統為了解決這個矛盾,使用了虛擬內存的設計。簡單的描述就是,給應用程序
一個與物理內存無關的虛擬地址空間,並提供一套映射機制,將虛擬地址映射到物理內存。當然應用程序是不知道
有這個映射機制存在的,他唯一需要做的就是盡情的使用自己的虛擬地址空間。操作系統提供的映射機制是
運行時動態進行虛擬地址和物理地址之間的映射的,當一個虛擬地址沒有對應的物理內存時候,
映射機制就分配物理內存,構建映射表,滿足應用程序的需求,這個過程就叫page fault。
與直接訪問物理內存不同,page fault過程大部分是由軟件完成的,消耗時間比較久,所以是影響性能的一個關鍵指標。
Linux把page fault又進一步分為minor page fault和major page fault。前面提到的分配物理內存,構建映射表過程可以看做是
minor page fault。major page fault是由swap機制引入的,對於swap情況,地址映射好了后,還需要從外部存儲讀取數據,這個
過程涉及到IO操作,耗時更久。
2. 如何查看應用程序的page fault指標呢?
1) 可以使用time命令:
比如我想看看svm-train的情況(模型訓練很耗資源)\time svm-train age_train_equal.txt(前面的斜杠表示不使用shell的內嵌time命令)
輸出是:7.68user 0.02system 0:07.71elapsed 99%CPU (0avgtext+0avgdata 42768maxresident)k
0inputs+6696outputs (0major+15445minor)pagefaults 0swaps
可以看到只有minor page fault,沒有major。
time命令的實現是用到了Linux提供的rusage機制。Linux的wait API可以返回一個應用程序的運行過程的資源消耗情況。
如果你想在自己的代碼中獲取資源利用情況,可以使用libc的getrusage函數,這個函數也是內核的API。
2) proc文件系統
Linux系統下的/proc/PID/stat文件,也提供了相關統計數據。
