Linux核心引數overcommit_memory和OOM killer介紹
什麼是Linux Overcommit和OOM
overcommit_memory是一個核心對記憶體分配的一種策略,它有三個可選值:0、1、2。
0. 表示核心將檢查是否有足夠的可用記憶體供應用程式使用;如果有足夠的可用記憶體,記憶體申請允許;否則,記憶體申請失敗,
並把錯誤返回給應用程式。
1. 表示核心允許分配所有的實體記憶體,而不管當前的記憶體狀態如何。
2. 表示核心允許分配超過所有實體記憶體和交換空間總和的記憶體。
Linux對大部分申請記憶體的請求都回復"yes",以便能跑更多更大的程式。因為申請記憶體後,並不會馬上使用記憶體。
這種技術叫做 Overcommit。
當linux發現記憶體不足時,會發生OOM killer(OOM=out-of-memory)。它會選擇殺死一些程式
(使用者態程式,不是核心執行緒),以便釋放記憶體。
例如Linux下發現有如下報錯資訊,則說明系統發生了OOM killer
# dmesg | grep redis | grep "oom-killer"
redis-server invoked oom-killer: gfp_mask=0x280da, order=0, oom_adj=0, oom_score_adj=0
redis-server invoked oom-killer: gfp_mask=0x200da, order=0, oom_adj=0, oom_score_adj=0
redis-server invoked oom-killer: gfp_mask=0x200da, order=0, oom_adj=0, oom_score_adj=0
redis-server invoked oom-killer: gfp_mask=0x200da, order=0, oom_adj=0, oom_score_adj=0
redis-server invoked oom-killer: gfp_mask=0x280da, order=0, oom_adj=0, oom_score_adj=0
redis-server invoked oom-killer: gfp_mask=0x200da, order=0, oom_adj=0, oom_score_adj=0
redis-server invoked oom-killer: gfp_mask=0x200da, order=0, oom_adj=0, oom_score_adj=0
redis-server invoked oom-killer: gfp_mask=0xd0, order=0, oom_adj=0, oom_score_adj=0
redis-server invoked oom-killer: gfp_mask=0x280da, order=0, oom_adj=0, oom_score_adj=0
redis-server invoked oom-killer: gfp_mask=0x280da, order=0, oom_adj=0, oom_score_adj=0
redis-server invoked oom-killer: gfp_mask=0xd0, order=0, oom_adj=0, oom_score_adj=0
redis-server invoked oom-killer: gfp_mask=0x280da, order=0, oom_adj=0, oom_score_adj=0
redis-server invoked oom-killer: gfp_mask=0xd0, order=0, oom_adj=0, oom_score_adj=0
redis-server invoked oom-killer: gfp_mask=0xd0, order=0, oom_adj=0, oom_score_adj=0
redis-server invoked oom-killer: gfp_mask=0x201da, order=0, oom_adj=0, oom_score_adj=0
redis-server invoked oom-killer: gfp_mask=0xd0, order=0, oom_adj=0, oom_score_adj=0
redis-server invoked oom-killer: gfp_mask=0x280da, order=0, oom_adj=0, oom_score_adj=0
當oom-killer發生時,linux會選擇殺死該程式,例如:
Out of memory: Kill process 21809 (redis-server) score 951 or sacrifice child
Killed process 21809, UID 0, (redis-server) total-vm:33466920kB, anon-rss:32324096kB, file-rss:100kB
具體殺死哪個程式取決於選擇程式的函式,選擇程式的函式是oom_badness函式(在mm/oom_kill.c中),該函式
會計算每個程式的點數(0~1000)。
點數越高,這個程式越有可能被殺死。每個程式的點數跟oom_score_adj有關,而且 oom_score_adj可以被
設定(-1000最低,1000最高)。
理解memory overcommit的關鍵:commit(或overcommit)針對的是記憶體申請,記憶體申請不等於記憶體分配,記憶體
只在實際用到的時候才分配。
備註:
如何修改Linux vm.overcommit_memory的值,可用的方法有以下三種:
1).以root身份登入Linux,編輯/etc/sysctl.conf ,改vm.overcommit_memory=1,然後sysctl -p使配置檔案生效
2).sysctl vm.overcommit_memory=1
3).echo 1 > /proc/sys/vm/overcommit_memory
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/15498/viewspace-2638288/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 【Linux】Linux版本介紹(核心版本和發行版本)Linux
- impdp和expdp用法及引數介紹
- jmeter引數化介紹JMeter
- 介紹幾個Java大型中介軟體系統中須調整的Linux核心引數JavaLinux
- [OS/Linux] Linux核心引數:net.core.somaxconn(高併發場景核心引數)Linux
- linux常用核心引數說明Linux
- 在Linux中,linux核心引數如何修改?Linux
- 精準檢測Linux核心漏洞介紹Linux
- linux核心引數優化重要項Linux優化
- MySQL change buffer介紹和相關引數調整建議MySql
- Nginx配置和Linux核心引數的學習與驗證NginxLinux
- mysql一些引數的介紹MySql
- Rman關於filesperset引數的介紹
- 【Linux】jq 命令介紹和使用Linux
- Linux Boot,Kernel 和 Service 介紹Linuxboot
- Knative 核心概念介紹:Build、Serving 和 Eventing 三大核心元件UI元件
- 介紹tomcat Connector 引數優化說明Tomcat優化
- mysqldump中skip-tz-utc引數介紹MySql
- hping3功能以及引數介紹
- HTC VIVE Pro裝置引數配置介紹
- MySQL query_cache_type的DEMAND引數介紹和使用舉例MySql
- Linux中重定向和管道介紹Linux
- mysql 複製引數replicate_do_db和replicate_ignore_db介紹MySql
- 龍芯1A處理器引數介紹
- java基礎(九) 可變引數列表介紹Java
- Oracle 核心引數Oracle
- Spring Cloud Alibaba Sentinel 主要原理和核心類介紹SpringCloud
- 瀏覽器核心介紹瀏覽器
- 介紹 Linux 中的管道和命名管道Linux
- Linux常用初級指令介紹和使用Linux
- Kali Linux介紹Linux
- zblog獲取GET/POST等值函式“GetVars”引數和使用方法介紹函式
- mysql二進位制日誌的引數介紹MySql
- 核心引數kernel.shmall和kernel.shmmaxHMM
- Linux 核心引數 arp_ignore & arp_announce 詳解Linux
- Linux核心版本以及部分引數與效能之二Linux
- 【轉載】Linux核心除錯之使用模組引數Linux除錯
- 介紹Linux核心5.9的最重要功能及安裝方法Linux