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

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

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

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

1
2
Jun? 4 07:41:59 plumbr kernel: [70667120.897649] Out of memory: Kill process 29957 (java) score 366 or sacrifice child
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
2
3
4
5
6
7
8
9
10
11
12
13
14
package eu.plumbr.demo;
public class OOM {
public static void main(String[] args){
????java.util.List l = new java.util.ArrayList();
????for (int i = 10000; i < 100000; i++) {
????????????????try {
????????????????????l.add(new int[100_000_000]);
????????????????} catch (Throwable t) {
????????????????????t.printStackTrace();
????????????????}
????????????}
????}
}

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

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

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

解決方案?

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

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


原文鏈接: javacodegeeks 翻譯: ImportNew.com - 秋雙
譯文鏈接: http://www.importnew.com/12285.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/447511.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/447511.shtml
英文地址,請注明出處:http://en.pswp.cn/news/447511.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

java8 注解: @FunctionalInterface (函數式接口)

前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。點擊跳轉到教程。 Java8提倡函數式編程&#xff0c;因而新增了一個函數式接口。函數式接口保證了函數式編程&#xff0c;同時也保證了能夠兼容以前的java版…

寫給年輕程序員的一封信

很多年輕的程序員發emails給我&#xff0c;說希望能夠得到一些如何盡快躋身優秀程序員行列的建議和方法。關于這個問題&#xff0c;我已經有提到過很多次&#xff0c;現在已經沒什么可以補充的了。不過 為了滿足大家的要求&#xff0c;在這里我再詳細地歸納總結一下&#xff1a…

Docker中RocketMQ的安裝與使用

前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。點擊跳轉到教程。 搜索RocketMQ的鏡像&#xff0c;可以通過docker的hub.docker.com上進行搜索&#xff0c;也可以在Linux下通過docker的search命令進行搜索…

大浪淘沙:不是所有的IT公司都以成功收場

本文列舉了50家創業公司沒有什么先后順序&#xff0c;最后顯示&#xff0c;其中21家是獨立公司&#xff0c;19家被收購了&#xff0c;4家正在走下坡路&#xff0c;6家已倒閉。但是我希望有更多的公司徹底倒閉&#xff0c;留下實力最強大的公司。公司倒閉也許是重新開始的標志。…

解決:阿里云ECS服務器 遠程連接不上、極慢 (主機監控的實現)

前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。點擊跳轉到教程。 個人低配版的阿里云ECS服務器&#xff0c;突然發現用 Xshell 或者 git-bash 都連接不上... 第一反應發工單去問下為什么&#xff0c;然…

TIOBE 2014年7月編程語言排行榜:僅發布1月,Swift進Top 20!

摘要&#xff1a;TIOBE7月編程語言排行榜發布&#xff0c;本月最值得關注的是&#xff0c;蘋果公司在WWDC 2014上推出新的編程語言Swift&#xff0c;發布至今僅一月有余&#xff0c;Swift竟擠進TIOBE排行榜的Top 20&#xff0c;排名第16位。Swift能取得如此驕人的成績&#xff…

Math對象方法總結(向上取整、向下取整、四舍五入、取隨機數,取最大值、取最小值)

前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。點擊跳轉到教程。

Docker 方式安裝 gitlab ( 阿里云ECS )

前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。點擊跳轉到教程。 1.查找鏡像&#xff1a; docker search gitlab 2. 拉取鏡像&#xff1a; docker pull 鏡像名 我選擇的是搜索出來的第一個鏡像&…

商用的碼流分析工具/YUV viewer

目前市場上有一些商用的碼流分析工具是比較好的&#xff0c;能夠輔助我們進行各個標準的碼流分析&#xff1a; 1. Elecard StreamEye系列 可以分析H264/MPEG4/MPEG2的碼流&#xff0c;暫時不支持其它標準。 2. H264VISA 比較好的H264碼流分析工具 3. Vegas vegas是interra s…

生成多個 SSH-Key 、生成多個公鑰和私鑰

前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。點擊跳轉到教程。 當有多個倉庫要同時使用時&#xff0c;需要配置多個公鑰、私鑰。于是就要先生成多個。 PS&#xff1a;初次生成參見文章&#xff1a;查…

使用Lucid Virtu在有獨立顯卡的情況下使用Intel硬件加速H.264編碼

在硬編碼領域&#xff0c;大家都知道CUDA技術對于H.264視頻編碼速度的提升。然而實際上常見的高清H.264視頻壓縮都不是用CUDA技術進行硬編碼&#xff0c;而是用傳統的x264進行軟編碼&#xff0c;因為通過CUDA硬編碼的視頻效果遠遠差于x264軟編碼壓縮出的視頻效果。隨著Intel Sa…

執行ssh-add時出現Could not open a connection to your authentication agent

前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。點擊跳轉到教程。 若執行ssh-add /path/to/xxx.pem是出現這個錯誤:Could not open a connection to your authentication agent&#xff0c;則先執行如下命…

Intel硬件加速 VS CUDA完勝 視頻轉碼感受

對比試用平臺介紹 在體驗了酷睿 I5 2300 在3D游戲和多任務、高清播放等方面的突出性能后&#xff0c;今天我利用空閑時間針對酷睿 I5 2300在高清轉碼方面上與本人的舊平臺上對比了一下.&#xff0c;其結果也讓人感到震撼。好了閑話不多說了&#xff0c;先來給自己新舊PC做個介紹…

解決 : Shell 腳本 $‘\r‘: command not found 問題

前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。點擊跳轉到教程。 1.經查證&#xff0c;只是 Windows 的空行在 linux 中不識別&#xff0c;故需要用 dos2unix 來轉換。 2. 安裝 dos2unix&#xff0c;2 …

H.264 軟/硬編碼器 畫質量化分析評測

第1頁&#xff1a;前言——視頻壓縮無處不在H.264 或者說 MPEG-4 AVC 是目前使用最廣泛的高清視頻編碼標準&#xff0c;和上一代 MPEG-2、h.263/MPEG-4 Part4 相比&#xff0c;它的壓縮率大為提高&#xff0c;例如和 MPEG-2 相比&#xff0c;同樣的壓縮后畫面品質&#xff0c;h…

解決:Failed to execute goal org.apache.maven.plugins:maven-deploy-plugin:2.8.2:deploy (default-deploy)

前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。點擊跳轉到教程。 1. 執行 mvn clean deploy ... 想把 jar 包更新到私服倉庫&#xff0c;報錯&#xff1a; Failed to execute goal org.apache.maven.pl…

YV12 and NV12異同,

用videoCapture和IAMStreamConfig拿到的支持的格式列表。發現支持2中圖像格式&#xff0c;YV12和NV12。具體是怎么樣的內存分布不知道。查了些文檔。自己修改了幾個圖。看出了點端倪YV12先看看 http://www.fourcc.org/yuv.php 上比較標準的定義&#xff1a;YV12 This is the f…

上傳 jar 包到 nexus3、上傳本地 jar 包到 maven 私服

前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。點擊跳轉到教程。 1.登陸進入 nexus3&#xff0c;打開要上傳的倉庫目錄&#xff1a;maven-releases 2. 選擇要上傳的本地 jar 包&#xff0c;并填寫好對應…

從桌面到移動:異構計算翻天覆地的技術變革

摘要&#xff1a;在智能手機上&#xff0c;強大的計算單元&#xff0c;不僅僅是CPU一顆&#xff0c;還包含了GPU、DSP等器件。在傳統的臺式電腦中&#xff0c;異構計算已經說了好多年了。這篇文章有點長&#xff0c;但值得靜下心來慢慢閱讀。從桌面到移動&#xff0c;這是關于異…

集合源碼閱讀:ArrayList

前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。點擊跳轉到教程。 1.繼承關系&#xff1a;public class ArrayList<E> extends AbstractList<E>implements List<E>, RandomAccess, Clon…