2014-10-22 53 views
6

我正在使用512MB RAM和足夠的交換內存來支持應用程序的嵌入式系統。在內核中,我將內核cmd參數的RAM大小限制爲130MB。並使用swapoff -a禁用交換。我還禁用了內核過度使用,以便應用程序可以單獨運行在物理內存中。我驗證了/proc/cmdline/proc/meminfo的更改。現在,當我運行應用程序並檢查最高值時,我的應用程序的VSZ是177m,比實際內存更多!這怎麼可能?這個記憶從哪裏來的?爲什麼在Linux中內存使用量超過物理內存?

+2

內存映射文件?相同的內存在虛擬地址空間中映射兩次?檢查進程內存映射。 – 2014-10-22 05:47:06

+0

http://linuxatemyram.com/和'/ proc/$ PID/maps' – 2014-10-22 06:44:24

回答

6

VSZ是進程使用的虛擬內存大小。這是正常的,它高於你的物理記憶的大小,因爲這是這個主要想法之一。你應該看看Resident size(RSS),它是進程使用的實際物理內存。

請看下面的例子:

我有一個nginx的過程運行:

ps -o rss,vsz,cmd ax | grep -i nginx | head -n1 
    956 31248 nginx: master process /usr/sbin/nginx -c /etc/nginx/nginx.conf 

rss - 956 kB 
vsz - 31248 kB 

所以,這意味着該過程使用的物理存儲器956KB,和虛擬內存的31MB。

與您一樣,禁用swap(swapoff -a)不會禁用虛擬內存。

閱讀有關虛擬內存的位置: Virtual memory

+0

是否可以對虛擬內存設置限制?我只是好奇...... – Griffin 2014-10-23 09:06:21

+0

我不認爲你解釋了爲什麼'swapoff -a'不會導致VMM的使用。 * swap *僅用於*讀寫*存儲器或程序數據。對於程序代碼,Linux *虛擬文件系統*可以定位(重新加載)頁面。如果代碼跳轉到一個地址,那麼代碼*故障*並且數據從磁盤加載。這樣,當一個程序啓動時,整個事物不會加載到內存中;只有*開始*地址頁面。同樣在內存壓力下,很少使用的代碼可能會碰撞。 – 2014-11-04 19:27:11