Re: [問題] 如何把linux的Ram佔光

看板C_and_CPP作者 (lf)時間10年前 (2015/02/13 21:08), 10年前編輯推噓1(108)
留言9則, 4人參與, 最新討論串2/2 (看更多)
※ 引述《LORDJACK (文亞南)》之銘言: : 最近公司的linux server有個問題 : 以前裝32G的ram工作正常, 記憶體超過了就用page : 最近把ram加到64G, 發生奇怪的問題 : 記憶體用量到24G時就會整個系統卡住, 連page也不用了 : 因此我想寫一個程式如下 沒有真的跑, 試看看吧. 簡單說就是一直 fork 到 fork 不了為止 #define SIZE_4GB 0x100000000UL int g_n = 0; int main(void) { pid_t pid; char *buf; pid = fork(); if (pid < 0) // fork fail { printf("\nFork fail! => total malloc size = %d (GB)\n", 4*g_n); return 1; } // else, fork success if (pid == 0) // child process { if ((buf = (char *)malloc(SIZE_4GB)) != NULL) { memset(buf, 0x00, SIZE_4GB); g_n++; printf("child (%6d) : %d\n", pid, g_n); } else printf("child (%6d) : malloc fail! g_n = %d\n", pid, g_n); } else { //Parent process, do nothing. printf("parent (%6d) : do nothing\n", getpid()); } return 0; } -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 114.43.215.67 ※ 文章網址: https://www.ptt.cc/bbs/C_and_CPP/M.1423832920.A.D78.html ※ 編輯: lf5471 (114.43.215.67), 02/13/2015 21:09:42 ※ 編輯: lf5471 (114.43.215.67), 02/13/2015 21:10:35

02/13 21:17, , 1F
你這樣只會fork一次吧...
02/13 21:17, 1F

02/14 11:11, , 2F
沒記錯的話,現在的linux內核會阻止無窮迴圈fork()...
02/14 11:11, 2F

02/14 11:11, , 3F
那叫做fork bomb...
02/14 11:11, 3F
修改過程式碼: http://pastie.org/9946175 在 XP 下用 Cygwin 跑了 2 次. 第 1 次很慘, 電腦當掉. 只好加個 REAL_WORK flag 手邊沒有 linux, 所以我不確定若實際在 linux 上跑會怎樣. (Cygwin 中間隔一層 WinXP) 關於 fork bomb, 一般它是 "限制 user 只能開到 MAX # process 個數" 來做. 請參考 ulimit 指令. 現在問題來了, 假設今天 MAX # 是 100 好了. 那我每次 4GB => 只要 fork 個 16 次, 就能到 64GB, 離 100 還很遠, 就能達到塞爆 RAM 的目標 XDDD 我猜, 最後, 還是得實際去把電腦弄掛做實驗才能知道真實的狀態. ※ 編輯: lf5471 (114.43.215.67), 02/14/2015 16:10:35

02/14 16:11, , 4F
sorry, TIMEOUT 可加大, 例如 60 (一分鐘)
02/14 16:11, 4F

02/14 20:15, , 5F
實在太麻煩了XD...
02/14 20:15, 5F

02/14 20:16, , 6F
為何不寫一個會吃4G記憶體的程式 然後shell下多開幾個就好XD
02/14 20:16, 6F

02/15 00:32, , 7F
樓上說的沒錯。另外把記憶體都耗掉是否能有效抓出原來的
02/15 00:32, 7F

02/15 00:32, , 8F
蟲或許更值得深入討論。
02/15 00:32, 8F

02/15 00:39, , 9F
這樣的debug方式,在server上風險相當高
02/15 00:39, 9F
文章代碼(AID): #1KtVTOru (C_and_CPP)
文章代碼(AID): #1KtVTOru (C_and_CPP)