linux 内核参数 rss,Linux控制内存的内核参数
環境
Red Hat Enterprise Linux (RHEL) 5.x (X86)
在 X86 高內存設備中,當用戶進程使用 mlock() 在常規區域分配大量內存時,可重新使用的 lowmem 內存可能會不足,而一些系統呼叫將失敗并顯示“EAGAIN” 等錯誤。
在 RHEL 5.x (X86) 中,最終用戶可以使用 lowmem_reserve_ratio 控制保留的 lowmem。
詳細信息
# cat /proc/sys/vm/lowmem_reserve_ratio
256 256 32
DMA Normal
在常規區域中,將保留 256 頁(默認)。
要在常規區域中保留 512 頁:
# echo "256 512 32" > /proc/sys/vm/lowmem_reserve_ratio
# cat /proc/sys/vm/lowmem_reserve_ratio
256 512 32
要設置永久值,請編輯 /etc/sysctl.conf 并添加以下內容:
vm.lowmem_reserve_ratio = 256 512 32
# sysctl -p
# cat /proc/sys/vm/lowmem_reserve_ratio
256 512 32
【關于free】
在Linux下查看內存我們一般用free命令:
[root@scs-2 tmp]# free
total used free shared buffers cached
Mem: 3266180 3250004 16176 0 110652 2668236
-/+ buffers/cache: 471116 2795064
Swap: 2048276 80160 1968116
區別:第二行(mem)的used/free與第三行(-/+ buffers/cache) used/free的區別。這兩個的區別在于使用的角度來看,第一行是從OS的角度來看,因為對于OS,buffers/cached 都是屬于被使用,所以他的可用內存是16176KB,已用內存是3250004KB,其中包括,內核(OS)使用+Application(X, oracle,etc)使用的+buffers+cached.
第三行所指的是從應用程序角度來看,對于應用程序來說,buffers/cached 是等于可用的,因為buffer/cached是為了提高文件讀取的性能,當應用程序需在用到內存的時候,buffer/cached會很快地被回收。所以從應用程序的角度來說,可用內存=系統free memory+buffers+cached。如上例:2795064=16176+110652+2668236
我們通過free命令查看機器空閑內存時,會發現free的值很小。這主要是因為,在linux中有這么一種思想,內存不用白不用,因此它盡可能的cache和buffer一些數據,以方便下次使用。但實際上這些內存也是可以立刻拿來使用的。所以,空閑內存=free+buffers+cached=total-used
【關于/proc/ pid/status】
我們可以通過ps –aux或者top查看某個進程占用的虛擬內存VSZ和物理內存RSS,也可以直接查看/proc/pid/status文件得到這些信息。
(KB) 任務虛擬地址空間的大小 (total_vm-reserved_vm),其中total_vm為進程的地址空間的大小,reserved_vm:進程在預留或特殊的內存間的物理頁
(KB) 任務已經鎖住的物理內存的大小。鎖住的物理內存不能交換到硬盤 (locked_vm)
(KB) 應用程序正在使用的物理內存的大小,就是用ps命令的參數rss的值 (rss)
(KB) 程序數據段的大小(所占虛擬內存的大小),存放初始化了的數據; (total_vm-shared_vm-stack_vm)
(KB) 任務在用戶態的棧的大小 (stack_vm)
(KB) 程序所擁有的可執行虛擬內存的大小,代碼段,不包括任務使用的庫 (end_code-start_code)
(KB) 被映像到任務的虛擬內存空間的庫的大小 (exec_lib)
該進程的所有頁表的大小,單位:kb
【關于oom killer】
Out-of-Memory (OOM) Killer,就是一層保護機制,用于避免 Linux 在內存不足的時候不至于出太嚴重的問題,把無關緊要的進程殺掉。
在 32 位CPU 架構下尋址是有限制的。Linux 內核定義了三個區域:
# DMA: 0x00000000 - 0x00999999 (0 - 16 MB)
#?: 0x01000000 - 0x037999999 (16 - 896 MB) - size: 880MB
#?: 0x038000000 -
什么時候會觸發oom killer?根據我的搜查,大概就兩種情況:
1 當 low memory 被耗盡的時候,即使high memory還有很大的空閑內存
2 low memory里都是碎片,請求不到連續的內存區域
通常的問題是high memory很大仍然會觸發oom killer,或者由于碎片觸發oom killer,解決辦法:
1、升級至64位的 Linux 版本,這是最好的解決方案。
2、如果是32位的 Linux 版本,最好的解決辦法就是應用 hugemem kernel,還有一個解決方法設置 /proc/sys/vm/lower_zone_protection 值為250或更高。
# echo "250" > /proc/sys/vm/lower_zone_protection
設置成啟動加載,在 /etc/sysctl.conf 中加入
vm.lower_zone_protection = 250
3、最無力的解決辦法,就是禁用 oom-killer ,這可能會導致系統掛起,所以要慎重使用。
使 oom-killer 關閉/開啟:
# echo "0" > /proc/sys/vm/oom-kill
# echo "1" > /proc/sys/vm/oom-kill
使設置啟動時生效,需要在 /etc/sysctl.conf 中加入
vm.oom-kill = 0
《新程序員》:云原生和全面數字化實踐50位技術專家共同創作,文字、視頻、音頻交互閱讀總結
以上是生活随笔為你收集整理的linux 内核参数 rss,Linux控制内存的内核参数的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: linux命令gen,Linux中msg
- 下一篇: v8 编译 linux,安装与编译 Ja