2011-07-30 14 views
15

いくつかの外部メモリの計算、つまり入力データがメインメモリに収まらない場合、I/Oの複雑さを考慮する必要があるアルゴリズムを作成するアルゴリズムを作成しています。私はいつも、私は私のプロセスに使用可能なメモリの量を制限したい本当の入力を使用したくない私のテストのため以来1プロセスあたりの物理メモリを制限する

。私が発見したことは、私はすべてのプロセスの物理メモリ使用を制限するmemカーネルパラメータを設定することができること、である(正しいということです?)

は同じことを行うにはそこ方法ですが、プロセスあたりの上限と。私はulimitを見てきましたが、プロセスあたりのメモリはで、に制限されています。任意のアイデア(多分私はC + +コード内からプログラムで設定することもできます)?

+0

関連するデータをメモリにロードするための仮想メモリとLinuxのページングに頼っていますか?手動でデータをバッファにロードする予定ですか? –

+0

私は仮想メモリ+ linuxのページング(いくつかの外部メモリデータ構造にstxxlというライブラリを加えましたが、すでにそれらのメモリ使用量を制御できます) – dcn

+1

linux-kernelタグを追加しました。カーネルの人たちがそのことについて最もよく知っています。 –

答えて

11

「cgroups」で試すことができます。 これらを使用するには、rootとして次のコマンドを入力します。

# mkdir /dev/cgroups 
# mount -t cgroup -omemory memory /dev/cgroups 
# mkdir /dev/cgroups/test 
# echo 10000000 > /dev/cgroups/test/memory.limit_in_bytes 
# echo 12000000 > /dev/cgroups/test/memory.memsw.limit_in_bytes 
# echo <PID> > /dev/cgroups/test/tasks 

どこのcgroupに追加するプロセスのPIDです。この制限は、このcgroupに割り当てられたすべてのプロセスの合計に適用されます。

この頃から、プロセスは10MBの物理メモリと12MBの物理+スワップに制限されています。

このディレクトリには他の調整可能なパラメータがありますが、正確なリストは使用しているカーネルのバージョンによって異なります。

制限の階層を作成し、サブディレクトリを作成することもできます。

/execをフォークするときにcgroupが継承されるため、プログラムの起動元となるシェルをcgroupに追加すると、自動的に割り当てられます。

cgroupは、/ dev/cgroupsだけでなく、任意のディレクトリにマウントできます。

+0

I '/ proc//status'と' VmHWM'エントリを使って制限が満たされていることを検証できるはずですか? – dcn

+0

これはわかりにくいです。/proc//statusとcgroups/*/memory.usage_in_bytesを比較すると多少異なります。たぶん共有メモリまたは仮想メモリと物理メモリの関係...私は、cgroupsはプロセスによって要求された新しいメモリだけを制限しますが、プロセスがcgroupに追加される前に存在していた共有メモリは考慮されていないと思います。 docs [here](http://www.kernel.org/doc/Documentation/cgroups/memory.txt)を参照してください。 – rodrigo

+0

この回答を受け入れる:cgroupsは私のために働いた。 '-ememory'はタイプミス(スペースなし)ですか?とにかく、cgconfigを適切に設定し、cgroup(cgexec)で直接プロセスを開始する方が快適であることがわかりました。たとえば、http://jlebar.com/2011/6/15/Limiting_the_amount_of_RAM_a_program_can_use.html – dcn

5

私は、私は完全なメモリ領域の制御とどのくらい私が割り当てを持つことができるように、私は通常、私自身のメモリ管理システムを記述し、直接答えを提供しますが、そのようなものをやってに関係することはできません。これは通常、マイクロコントローラ用にも書いています。それが役に立てば幸い。

+1

+1あなた自身のメモリ使用量を追跡する単純なアプローチの場合+1。 –

5

私は(ulimitのが何をするか、これがある)、仮想メモリの制限を設定して、プロセスの使用mlockall(MCL_CURRENT | MCL_FUTURE)を持つようにRLIMIT_ASパラメータでsetrlimtiを使用するには障害と物理的にロックするために、カーネルを強制的にRAMのすべてのプロセスのページなので、このプロセスの総OSで多くのメモリを使用する方法

+0

'mlockall'は本当に問題があります。いくつかのプログラミング言語(例えば、golangやjava)は、物理メモリを制限し、スワップ(例えば、デスクトップアプリケーション)を楽しむことを望む場合を除いて、mmap + PROTO_ANONで膨大な仮想空間を割り当てます。それらを使用することはできません。そしてC++を使っていてもasanのようなものを使うことはできません。 –

+0

(私は実際に答えを与えた人、小さい世界を知っています...) –

1

カーネルmem=ブートパラメータの制限のためにその金額仮想==量の物理メモリ。

これはほとんどユーザーが望むものではありません。物理メモリの

RLIMIT_AS別名RSS RLIMITがあります。

+0

RLIMIT_RSSを意味しますか? – dcn

+1

docはRLIMIT_RSSについて "この制限はLinux 2.4.x、x <30"でのみ有効です... – dcn

+1

実際、物理メモリのプロセスrlimitは "memory cgroup"と呼ばれ、それ以外の場合は何も保証されません。 http://git.kernel.org/?p=linux/kernel/git/torvalds/linux.git;a=blob;f=Documentation/cgroups/memory.txt;h=6f3c598971fc3ef05d2ebfb0e6e8879b3047d839;hb=HEAD – adobriyan

2

あなたは、何らかの種類の仮想環境でコードを試してみることを検討しましたか?仮想マシンがあなたのニーズにあまりにも多すぎるかもしれませんが、User-Mode Linuxのようなものは良いフィット感があります。これは、通常のオペレーティングシステムの中でLinuxカーネルを単一プロセスとして実行します。その後、別のmem=カーネル設定と制御された実験を行うための別のスワップスペースを提供することができます。

1

他のポスターが既に示しているように、setrlimitは最も可能性が高い解決策であり、プロセス環境の構成可能なすべての側面の制限を制御します。あなたのシェルプロセスでこれらの個々の設定を確認するには、このコマンドを使用:次のように

ulimit -a 

出力結果であなたのシナリオに最も適切なものは以下のとおりです。

data seg size   (kbytes, -d) unlimited 
max locked memory  (kbytes, -l) 64 
max memory size   (kbytes, -m) unlimited 
virtual memory   (kbytes, -v) unlimited 

チェックアウトはsetrlimitのマニュアルページ(」 man setrlimit ")、C/C++コードからプログラムで呼び出すことができます。私は過去にスタックサイズの制限を制御するのに良い効果を上げてきました。 (btw、ulimit専用のmanページはありません。実際は埋め込みbashコマンドなので、bashのmanページにあります)