- ベストアンサー
メモリ不足状態を意図的に作り出すには
以下のタイプのサーバーを使用しています。 マシンタイプ:x225 カーネル: 2.4.20-28.7smp OS:Red Hat Linux 7.3 2.96-126)) DB:MySQL 2004年に導入したサーバーですが、カーネルパニックが度々発生しています。 MySQLを使用したあるシステムを導入しているのですが、 そのシステムの販売元のメーカーに問い合わせたところ、 「メモリ不足によりスラッシング状態となりカーネルパニックが発生したのでは?」 との回答をもらいました。 とりあえずの対応としてメモリを増設しましたが、 どの程度までメモリ不足に耐えられるのか検証したいと思います。 そこで、実行に大容量のメモリが必要なシェルを作成しようと考えました。 私が思いついたのは、以下の2種類のタイプのシェルです。 (1)大容量の圧縮ファイルを解凍し、圧縮する動作を繰り返すシェル (2)mysqldumpを繰り返すシェル 上記2つの方法以外に効率良くメモリを消費する方法はありますでしょうか? どなたかお教えください。よろしくお願いします。
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
- ベストアンサー
>Linux の場合 calloc (や malloc) で確保するだけでは不十分で callocはNULLクリアする(つまりアクセスする)ため問題ないです。 >今どき malloc.h ではなく stdlib.h ヘッダの流行までは知りませんが、 目的が達成できればヘッダは何でもかまわないと思います。
その他の回答 (3)
- Tacosan
- ベストアンサー率23% (3656/15482)
calloc の仕様を失念していました. 御指摘感謝します>#3. ちなみに malloc.h/stdlib.h については「今さら標準にないものを使うわなくてもよいのでは」というくらいの気持ちで. というだけではアレなのでちょっとコメントですが, おそらく質問者さんの 1 の方法でメモリ不足という状況を作るのは無理だと思います. もちろん, 圧縮や解凍に使うプログラムにもよりますが.
- Tacosan
- ベストアンサー率23% (3656/15482)
えっと.... シェルスクリプトじゃないとダメ? 「malloc + memset + sleep」というプログラムを C で組んだ方が楽な気がするんだけど. あ, Linux の場合 calloc (や malloc) で確保するだけでは不十分で, そこで確保した領域に実際にアクセスしないといけないんじゃないかなぁ>#1. ついでにいえば今どき malloc.h ではなく stdlib.h.
1.増設したメモリを減らす 2.メモリ消費プログラムをサクッっとコンパイルして実行すればいいかと。 たとえば、mem.c #include <stdio.h> #include <malloc.h> int main(){ char* buf; for(;;){ buf = (char*)calloc(1024,1024*100);//100Mbyte取得。ここは適当な大きさで。細かいほうがメモリをより圧迫できる if(buf == NULL){ printf("calloc failed\n"); } } } を gcc -o mem mem.c でコンパイルして実行 vmstat 1 でメモリ監視