Linux應用程序的性能分析(1)--page fault


影響一個應用程序性能的因素有很多,這次說說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文件,也提供了相關統計數據。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM