- ベストアンサー
Linuxでのメモリ使用量制限
大学生です。研究室内のコンピューターを管理してます。 環境は、Vine Linux2.0です。 最近、やたらとフリーズするので、調べてみたら プログラミングを間違って、メモリを食いつぶしてしまのが原因。 プログラムの開発は、日常茶飯事なので、 どうにか、ユーザーが起動するプロセスが使うメモリの 上限値を設定したいのですが、可能でしょうか? quotaは、ディスクの容量制限だけですよね? niceも、プロセスの優先度変えるだけですし。 どなたか、よろしくご教授、お願いします。
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
確認します。 問題のプログラムはulimitコマンドを実行したシェルの子プロセスとして実行していますか。 そうでない場合、ulimitの制限を受けません。 それから、データセグメントサイズの上限設定は-dだったような気がします(すみません、未確認です)。 あと、bashの特定バージョンは特定のコンピュータでulimit(の一部)が変更できません。 確認できているのは「bash1.1.4.xでHPのマシンにおいてcoreサイズの変更ができない」などです。 bashのソースを変更すれば大丈夫らしいのですが、詳細は失念しました。 ただ、2.0以上ではこの話は聞きませんのでvine2.0という新しいディストリビューション上のbashなら大丈夫だとは思います。
その他の回答 (3)
- toysmith
- ベストアンサー率37% (570/1525)
linuxでプロセスメモリの上限値を決めるのはlimit系のシェルコマンドです。 bashならulimit、tcshならlimitです。 .loginに組みこめば値を再設定するまで有効です。 ただ、「メモリの食いつぶし」でlinuxがフリーズするという状況が飲みこめません。仮想空間を使いすぎてスワップ領域が無くなっているのですか? その場合、スワップパーテーションを増やす方が賢明です。 理由はKanataさんがおっしゃる通りです。 通常、linuxではスワップ領域を越えるようなプロセスの起動はできません。 malloc(3)系の動的確保はスワップ領域を使用する前にアロケーションエラーが発生します。 Unix System V R2.xの時代には「小さなプロセスが大きなプロセスにexec(2)したときにメモリ不足でシステムがハングすることがある」というバグがありましたがlinuxでその系統のバグは聞いたことがありません。
補足
ありがとうございます。確かに、そういうコマンドが ありました! けど、ulimit -m 1000 とやっても 1Mbyte以上の プロセスが起動できて、しまいます。 ulimit -a とやれば、確かに設定はできてるみたいですが それだけでは、だめなのでしょうか? スワップは、300Mくらいとっていて、多分 フリーズというより、スワップが頻繁に起こっている 状態かもしれません。
プログラム作成側からいうと・・・ 結局メモリの食いつぶしって、バグですよね。 だとしたら、それをなくさなければ、大事な プログラムは使い物にならないので、再起動を してでもバグつぶしは大切だと思いますよ。 少なくともメモリ制限なんてのができてしまったら バグ取りがわからなくなった上に、他の人にも 迷惑がかかりますから、私はしょっちゅう 再起動しています。 #Windowsマシンので・・・ ではでは☆
お礼
そうなんです。バグなんです。 本来は、1しかメモリを食わないのに、 100も1000も使おうとするのです。 そうすると、そのプログラムの起動の度に、 そのマシンが落ちてしまうので、 (そうなると、他のユーザーが困るので) それを防ぐ為に、制限をかけたいのです。
下記の検索システムを使って検索できなければ http://his.luky.org/ML/ 素直に、VineUsersMLに参加して質問してみてください
お礼
便利なURLを教えて頂きありがとうごさいました。 いままで、サーチエンジンでしか調べてなかったの ですが、今後からこういうとこも 利用していきます。 ありがとうございました。
お礼
できました!! ありがとうございました。 無限にmallocするプログラムをかいて トップで眺めていたら、確かに 100M付近で mallocできなくなっています。 ありがとうございました。