影響一個應用程序性能的因素有不少,此次說說page fault。html
1. 爲何會存在page fault問題?shell
計算機的物理內存(看看你的內存條)有限,通常如今都是幾個GB的容量了,BTW,個人筆記本有8GB,:-)。ide
但應用程序的需求是無限的,操做系統爲了解決這個矛盾,使用了虛擬內存的設計。簡單的描述就是,給應用程序函數
一個與物理內存無關的虛擬地址空間,並提供一套映射機制,將虛擬地址映射到物理內存。固然應用程序是不知道性能
有這個映射機制存在的,他惟一須要作的就是盡情的使用本身的虛擬地址空間。操做系統提供的映射機制是spa
運行時動態進行虛擬地址和物理地址之間的映射的,當一個虛擬地址沒有對應的物理內存時候,操作系統
映射機制就分配物理內存,構建映射表,知足應用程序的需求,這個過程就叫page fault。設計
與直接訪問物理內存不一樣,page fault過程大部分是由軟件完成的,消耗時間比較久,因此是影響性能的一個關鍵指標。orm
Linux把page fault又進一步分爲minor page fault和major page fault。前面提到的分配物理內存,構建映射表過程能夠看作是htm
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文件,也提供了相關統計數據。
轉載自
http://www.cnblogs.com/cornsea/archive/2012/12/17/2821429.html