Linux——》Out of memory:kill process
推薦鏈接:
????總結——》【Java】
????總結——》【Mysql】
????總結——》【Spring】
????總結——》【SpringBoot】
????總結——》【MyBatis、MyBatis-Plus】
Linux——》Out of memory:kill process
- 1、操作
- 2、現象
- (1)查看系統日志文件
- (2)查看哪個進程被kill
- 3、原因
- 4、解決
1、操作
正常訪問數據庫
2、現象
mysql服務被linux系統kill掉
(1)查看系統日志文件
/var/log/messages

(2)查看哪個進程被kill
最占用內存的進程。
3、原因
由于系統內存不足,觸發 Linux 內核里的 Out of Memory (OOM) killer,OOM killer 會殺掉某個進程以騰出內存留給系統用,不致于讓系統立刻崩潰。
Linux 內核根據應用程序的要求分配內存,通常來說應用程序分配了內存但是并沒有實際全部使用,為了提高性能,這部分沒用的內存可以留作它用,這部分內存是屬于每個進程的,內核直接回收利用的話比較麻煩,所以內核采用一種過度分配內存(over-commit memory)的辦法來間接利用這部分 “空閑” 的內存,提高整體內存的使用效率。一般來說這樣做沒有問題,但當大多數應用程序都消耗完自己的內存的時候麻煩就來了,因為這些應用程序的內存需求加起來超出了物理內存(包括 swap)的容量,內核(OOM killer)必須殺掉一些進程才能騰出空間保障系統正常運行。用銀行的例子來講可能更容易懂一些,部分人取錢的時候銀行不怕,銀行有足夠的存款應付,當全國人民(或者絕大多數)都取錢而且每個人都想把自己錢取完的時候銀行的麻煩就來了,銀行實際上是沒有這么多錢給大家取的。
:::info
Q:系統內存不足的原因?
A:
1、本身內存小
2、通常在多應用集中部署在一臺機器上,管理不當或應用壓力突增
:::
4、解決
(1)增加系統內存,盡量保證內存充足
(2)在多實例應用部署時,需要注意對內存的分配。
(3)優化進程,使其占用內存降低
(4)使用oom_score_adj參數,這個參數會被計算入oom_score,可以避免進程被殺死(不推薦使用)。
在很多情況下,經常會看到還有剩余內存時,oom-killer依舊把進程殺死了,現象是在/var/log/messages日志文件中有如下信息:
Out of Memory: Killed process [PID] [process name].
OOM(out-of-memory) killer是通過/proc//oom_score這個值來決定哪個進程被干掉的。
這個值是系統綜合進程的內存消耗量、CPU時間(utime + stime)、存活時間(uptime - start time)和oom_adj計算出的,消耗內存越多分越高,存活時間越長分越低。
總之,總的策略是:損失最少的工作,釋放最大的內存同時不傷及無辜的用了很大內存的進程,并且殺掉的進程數盡量少。
Sep 19 14:58:00 test08 kernel: [ pid ] uid tgid total_vm rss cpu oom_adj oom_score_adj name
Sep 19 14:58:00 test08 kernel: [18871] 0 18871 502855 5227 0 0 0 mc-exe
Sep 19 14:58:00 test08 kernel: [18872] 0 18872 1842475 148013 1 0 0 mc-exe
Sep 19 14:58:00 test08 kernel: [18873] 0 18873 502855 3176 1 0 0 mc-exe
Sep 19 14:58:00 test08 kernel: Out of memory: Kill process 18872 (mc) score 43 or sacrifice child
Sep 19 14:58:00 test08 kernel: Killed process 18872, UID 0, (mc) total-vm:7369900kB, anon-rss:558044kB, file-rss:34008kB
其中,上面列表中total_vm,rss的單位是4K(單個內存頁面的大小),18872進程使用了不到600M(anon-rss+file-rss)的內存,
根據每個進程的oom_score選出來了18872,kill掉了,18872進程并沒有占用大量內存,也沒有其他進程占用超過600M的物理內存,只是整個系統的物理內存(4G)不夠用導致了,占用最大的進程被殺死了;
OOM觸發的詳細分析如下:
Sep 18 09:19:15 test08 kernel: mc invoked oom-killer: gfp_mask=0x280da, order=0, oom_adj=0, oom_score_adj=0
從上面日志看,gfp_mask=0x280da的低2位bit是2,表示此次申請內存是從Normal空間內存塊申請內存,
Sep 18 09:19:15 test08 kernel: Node 0 Normal free:8356kB min:8464kB low:10580kB high:12696kB
上面的free表示Normal空間的空閑內存,min、low、high是三個閾值, 當free小于min時,會觸發OOM
下面這行日志顯示了Normal空間空閑的內存塊的詳細信息,也可以通過命令cat /proc/buddyinfo查看當前系統得空閑塊
總結
以上是生活随笔為你收集整理的Linux——》Out of memory:kill process的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Exploratory Social N
- 下一篇: Python图片查找轮廓、多边形拟合、最