成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

內存不足:殺死進程還是犧牲子進程

存儲 存儲軟件
早上6點,我不得不開始處理“叫醒”我的一些問題。因為當這些問題發生的時候,我的手機鈴聲響了。昏睡中的我非常不情愿地拿起了手機,檢查我是否瘋狂到將叫醒鬧鐘設在了早上5點。

早上6點,我不得不開始處理“叫醒”我的一些問題。因為當這些問題發生的時候,我的手機鈴聲響了。昏睡中的我非常不情愿地拿起了手機,檢查我是否瘋狂到將叫醒鬧鐘設在了早上5點。原來是監控系統發現一個Plumbr服務死掉了。

[[252838]]

作為一名該領域經驗豐富的高手,我首先來到了咖啡機旁。我需要用一杯咖啡開始工作。第一個問題,在應用崩潰之前看起來一切運行正常。日志中沒有錯誤,沒有告警,也沒有其他任何異常。

我們的監控系統已經察覺到進程死掉了,并且已經重啟了崩潰的服務。因為血液中已經有了咖啡因,我開始收集更多的證據。30分鐘后,在/var/log/kern.log文件中發現了以下內容:

  1. Jun 4 07:41:59 plumbr kernel: [70667120.897649] Out of memory: Kill process 29957 (java) score 366 or sacrifice child 
  2. Jun 4 07:41:59 plumbr kernel: [70667120.897701] Killed process 29957 (java) total-vm:2532680kB, anon-rss:1416508kB, file-rss:0kB 

很顯然,我們成了Linux內核的受害者。大家都知道,Linux建立在一些守護進程之上。這些守護進程被幾個看起來糟透了的內核任務看管。所有現代Linux內核都內置了一個被稱為“內存不足殺手”的機制,它在內存不足的情況下會殺掉用戶進程。當檢測到內存不足時,殺手會被激活并選擇一個進程殺死。選擇機制是用啟發式算法對所有進程進行打分,最后選擇得分最低的進程殺死。

理解“內存不足殺手”

默認情況下,Linux內核允許進程請求比當前系統可用內存更多的內存。這是有道理的,因為大部分進程從來不會用掉它們請求的所有內存。就像有線網絡運營商,他們承諾每個用戶100Mbit的下載速度,這遠遠超出了運營商網絡的真實帶寬。因為他們認為所有用戶不會同時達到帶寬的上限。所以,一個10Gbit的鏈路能夠很好地為100個用戶提供服務超。

這種機制的一個副作用是,一些程序會消耗系統內存。這將導致內存不足,使得沒有內存頁面可以分配給進程。你可能遇到過這種情況,只有root賬號才能殺掉offending任務。為了避免這種情況發生,殺手進程會被啟動,識別進程并殺死它。

更多關于“內存不足殺手”的內容請參見這篇RedHad的文檔。

內存不足殺手由誰觸發?

現在,我們知道了一些背景知識,但是內存不足殺手由誰觸發?究竟什么原因讓我在早上5點被叫醒?一些調查顯示:

/proc/sys/vm/overcommit_memory中的配置允許過量使用內存,它被設置為1,意味著每一次malloc都能夠成功申請到內存。

應用運行在一個EC2 m1.small實例上。EC2實例默認是不支持交換區的。

這兩點再加上突然增加的訪問導致了我們的應用會申請越來越多的內存以支持這些用戶。過量使用內存配置也允許為這些進程申請越來越多的內存,最后觸發了“內存不足殺手”,就像它的名字那樣,殺死我們的應用然后在半夜把我叫醒。

示例

當我向工程師們描述這個問題時,有一個很有興趣的工程師用一個小測試程序來復現這個問題。當在Linux(最新穩定版Ubuntu)上編譯和加載下面的Java代碼片段時,

  1. package eu.plumbr.demo; 
  2. public class OOM { 
  3.   
  4. public static void main(String[] args){ 
  5.     java.util.List l = new java.util.ArrayList(); 
  6.     for (int i = 10000; i < 100000; i++) { 
  7.                 try { 
  8.                     l.add(new int[100_000_000]); 
  9.                 } catch (Throwable t) { 
  10.                     t.printStackTrace(); 
  11.                 } 
  12.             } 
  13.     } 

你會發現類似下面的消息:Kill process (java) score 或犧牲子進程的消息。

注意:你可能需要修改交換區和堆大小。在我的測試程序中,將堆大小通過-Xmx2g設置成2G,通過如下配置設置交換區大小:

  1. swapoff -a 
  2. dd if=/dev/zero of=swapfile bs=1024 count=655360 
  3. mkswap swapfile 
  4. swapon swapfile 

解決方案?

有很多種方法可以解決這個問題。在我們的示例中,我們只是把系統遷移到一個有更大內存的實例中。并且我還建議允許交換,但是當咨詢過工程人員后,我意識到Java虛擬機中的垃圾回收進程在交換時表現不是很好,所以這個選項最后沒有被采用。

其他可能有用的方案包括微調內存不足殺手,在幾個實例間進行負載均衡或者降低應用的內存需求。

責任編輯:武曉燕 來源: 架構師成長營
相關推薦

2009-07-14 18:26:49

MyEclipse內存

2020-03-18 19:00:29

電腦內存不足系統

2010-02-25 10:28:43

Linux進程管理

2009-10-27 08:57:50

linux殺死進程

2010-09-27 11:12:46

MyEclipseJVM內存

2010-04-19 09:08:20

Unix操作系統

2011-03-23 13:00:22

SQL Server虛擬內存

2024-02-05 18:23:23

父進程應用程序程序

2013-02-25 14:46:49

2009-12-15 18:27:51

Linux操作系統

2010-07-05 08:57:48

SQL Server虛

2025-04-14 02:00:00

2024-05-23 08:24:11

Android進程開發

2014-02-27 13:30:26

CacheLinux系統內存不足

2010-06-30 16:09:06

2010-06-30 08:46:40

Visual Stud

2020-11-20 07:22:48

Windows10

2010-02-06 10:42:41

Android Ser生命周期

2021-11-01 12:13:53

Linux僵尸進程
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 日本精品一区二区三区在线观看视频 | 在线日韩| 欧美日韩精品一区二区天天拍 | 国产精品区二区三区日本 | 男女羞羞视频在线观看 | 久久久久久国产 | 中文字幕一区二区在线观看 | 久久久久久久av | 亚洲综合区 | 免费在线一区二区 | 国产精品美女久久久久aⅴ国产馆 | 国产精品中文字幕在线 | 日韩视频在线播放 | 亚洲图片一区二区三区 | 一区二区在线不卡 | 精品国产乱码一区二区三区 | 成人国产一区二区三区精品麻豆 | 日韩在线欧美 | 日韩中文不卡 | 成人av一区| 欧美高清视频一区 | 久久久久久亚洲精品 | 成人在线精品 | 国产色网| 久久精品久久久 | 久草精品在线 | 午夜精品久久 | 天天爽一爽 | 中文字幕高清视频 | 国产免费一区二区三区网站免费 | 国产精品观看 | 欧美一二三区 | 成人福利片 | 久久精品亚洲成在人线av网址 | 久久综合久久综合久久 | 欧美一区二区 | 久久久久久99 | 精品欧美一区二区精品久久久 | 成人国产精品久久久 | 亚洲第一av | 成人性视频在线 |