1)由於進程的虛擬地址空間比物理內存大很多, linux還提供了一系列的機制, 來應對內存不足的情況
回收緩存: 使用LRU 算法, 回收最近使用最少的內存頁面
回收不常訪問的內存, 把不常的內存通過交換分區直接寫到磁盤中
oom, 殺死進程
2)什麼時候會觸發oom
進程在申請內存時, 如果申請的虛擬內存加上服務器實際已用的內存之和比總的物理內存還大, 就會觸發oom
3)解決方案
方法一: oom機制按照oom_score 給進程排序, oom_score越大, 進程就越容易被系統殺死, oom_score值的範圍是[-17,15], -17表示禁止oom
例如: echo -17 >/proc/$(pidof ssh)oom_adj 來避免sshd進程被系統oom
方法二: 通過調整內核參數overcommit_memory的值
0:表示內核將檢查是否有足夠的可用內存供應用進程使用;如果有足夠的可用內存,內存申請允許;否則,內存申請失敗,並把錯誤返回給應用進程。
1: 表示內核允許分配所有的物理內存,而不管當前的內存狀態如何。
2: 表示內核允許分配超過所有物理內存和交換空間總和的內存
臨時生效: sysctl vm.overcommit_memory=1
永久生效: # vi /etc/sysctl.conf
vm.overcommit_memory=1
# sysctl -p
參考文檔: http://blog.chinaunix.net/uid-30401178-id-5159439.html