Google Grupper har inte längre stöd för nya Usenet-inlägg eller -prenumerationer. Historiskt innehåll förblir synligt.
Dismiss

memory limit

1 visning
Hoppa till det första olästa meddelandet

Kenji Yamada

oläst,
20 jan. 2001 04:08:062001-01-20
till linux...@linux.or.jp, kya...@isi.edu

山田と申します。

プロセスが使えるメモリ空間を csh built-ins の limit コマンドで
制限したいのですが、うまくできません。

例えば、
% limit datasize 50m
% limit memoryuse 50m

としても、下記のような C program (メモリを 100 Mbyte 読み書きする)
が問題なく走ってしまいます。Solaris だと limit memorysize 50m と
すれば、Segmentation Fault になってくれます。Linux (2.2.16smp) でも
同じようにメモリ制限をするには、どうしたらいいでしょうか。

山田

/* メモリを 100MB つかうプログラム */
main()
{
int mem,i;
char *pt;
mem = 100 * 1024 * 1024;
pt = (char *)malloc(mem);
for (i=0; i<mem; i++) *(pt+i)=1;
i = 0;
while(1) {
*(pt + i) = 1;
i = (i+1) % mem;
}
}

OGAWA Hirofumi

oläst,
20 jan. 2001 12:29:082001-01-20
till linux...@linux.or.jp
小川といいます。

Kenji Yamada <kya...@ISI.EDU> writes:

> 山田と申します。
>
> プロセスが使えるメモリ空間を csh built-ins の limit コマンドで
> 制限したいのですが、うまくできません。
>
> 例えば、
> % limit datasize 50m
> % limit memoryuse 50m
>
> としても、下記のような C program (メモリを 100 Mbyte 読み書きする)
> が問題なく走ってしまいます。Solaris だと limit memorysize 50m と
> すれば、Segmentation Fault になってくれます。Linux (2.2.16smp) でも

確認ですが Segmentation Fault になるのは、malloc() が NULL をかえすか
らですよね。

> 同じようにメモリ制限をするには、どうしたらいいでしょうか。

glibc を使っている前提で書きますが、glibc の malloc() ではある程度大き
いサイズのメモリを確保しようとする場合、メモリの確保に brk() ではなく
mmap() を使うようです。

なので、制限は RLIMIT_AS の値を変更することになりますが、bash では
ulimit -v で変更するのですが csh ではどのオプションに当たるかは、わか
りません。

ちなみに、glibc の malloc() の動作は mallopt() で変更できるようで、

mallopt (M_MMAP_MAX, 0);

で、メモリの確保に mmap() を使わなくなるようです。(詳しくは、info を見
て下さい)

それでは
--
OGAWA Hirofumi <hiro...@mail.parknet.co.jp>


Shinya Hanataka

oläst,
21 jan. 2001 10:45:332001-01-21
till linux...@linux.or.jp
花高です。

In [linux-users 12915]
Writer OGAWA Hirofumi


>なので、制限は RLIMIT_AS の値を変更することになりますが、bash では
>ulimit -v で変更するのですが csh ではどのオプションに当たるかは、わか
>りません。

sh/bash の ulimit -v に対応するのは
csh/tcsh では limit vmemoryuse ですね。

補足:
tcsh のソースにちょっと問題があるので linux ではパッチが必要
だったはずです。ディストリビューションによっては使えないかも
しれません。使えなかったらバグリポートしましょう :-)
--
HANATAKA, Shinya

ko...@osk.3web.ne.jp

oläst,
21 jan. 2001 12:07:042001-01-21
till linux...@linux.or.jp
At Sun, 21 Jan 2001 02:29:08 +0900,

OGAWA Hirofumi wrote:
>
> 小川といいます。
>
> Kenji Yamada <kya...@ISI.EDU> writes:
>
> > 山田と申します。
> >
> > プロセスが使えるメモリ空間を csh built-ins の limit コマンドで
> > 制限したいのですが、うまくできません。
> >
> > 例えば、
> > % limit datasize 50m
> > % limit memoryuse 50m
> >
> > としても、下記のような C program (メモリを 100 Mbyte 読み書きする)
> > が問題なく走ってしまいます。Solaris だと limit memorysize 50m と
> > すれば、Segmentation Fault になってくれます。Linux (2.2.16smp) でも
>
> 確認ですが Segmentation Fault になるのは、malloc() が NULL をかえすか
> らですよね。
>
> > 同じようにメモリ制限をするには、どうしたらいいでしょうか。
>
> glibc を使っている前提で書きますが、glibc の malloc() ではある程度大き
> いサイズのメモリを確保しようとする場合、メモリの確保に brk() ではなく
> mmap() を使うようです。
>
> なので、制限は RLIMIT_AS の値を変更することになりますが、bash では
> ulimit -v で変更するのですが csh ではどのオプションに当たるかは、わか
> りません。

駒崎@ちょっと調べてみました です

csh(tcsh)ではできないようです。3行ほどパッチを当てればいいのですが...
とりあえず以下のパッチをあてるとlimitのメニューにvmemoryuseというリソー
スが増えます。そこで最大値を定義してやればリミットが有効になると思います。

#一応本家?にメールしておいたけど反映してくれるかなぁ

*** tcsh-6.10.00/sh.func.c Sun Nov 12 08:03:36 2000
--- tcsh-6.10.00.new/sh.func.c Mon Jan 22 01:25:45 2001
***************
*** 1761,1766 ****
--- 1761,1770 ----
# endif
# endif /* SYSVREL > 3 && BSDLIMIT */

+ # if defined(linux) && defined(RLIMIT_AS)
+ # define RLIMIT_VMEM RLIMIT_AS
+ # endif
+
struct limits limits[] =
{
# ifdef RLIMIT_CPU

----- From N.Komazaki -----
email ko...@osk.3web.ne.jp Kawanishi, Hyogo, Japan
-----------------------------------------------------------------

OGAWA Hirofumi

oläst,
22 jan. 2001 12:35:502001-01-22
till linux...@linux.or.jp
小川です。

Shinya Hanataka <hana...@abyss.rim.or.jp> writes:
> sh/bash の ulimit -v に対応するのは
> csh/tcsh では limit vmemoryuse ですね。
>
> 補足:
> tcsh のソースにちょっと問題があるので linux ではパッチが必要
> だったはずです。ディストリビューションによっては使えないかも
> しれません。使えなかったらバグリポートしましょう :-)

なるほど。
私が使わしてもらっているディストリビューションは、Debian なのですが、
tcsh は入れてはいるが使っていないので知りませんでした。

vmemoryuse を Debian(potato) で使えるか確認してみたところ、みごとに使
えませんでした :-)
駒崎さんが本家に報告されたようですが、私も Debian に報告しておきました。

Kenji Yamada

oläst,
22 jan. 2001 19:48:252001-01-22
till linux...@linux.or.jp, kya...@isi.edu

山田です。

> > なので、制限は RLIMIT_AS の値を変更することになりますが、bash では
> > ulimit -v で変更するのですが csh ではどのオプションに当たるかは、わか
> > りません。
>

> csh(tcsh)ではできないようです。3行ほどパッチを当てればいいのですが...

そうか、bash なら簡単にできるのか、と思ってやってみたら、

bash$ ulimit -v
2105343

bash$ ulimit -v 50000
ulimit: cannot raise limit: Invalid argument

あれぇ、と bash -version したら、GNU bash, version 1.14.7(1) と古そう
だったので、ftp.gnu.org から bash-2.04 をとってきました。それを使った
ら ulimit が効いて、目的のプログラムも malloc() が 期待通り NULL を返
して Segmentation fault になってくれました。

ついでに bash のソースも読んで

limit_vm(int size)
{
struct rlimit rlim;
getrlimit(RLIMIT_AS,&rlim);
rlim.rlim_cur = size;
setrlimit(RLIMIT_AS,&rlim);
}

みたいな関数つくって、プログラムの先頭で limit_vm(50*1024*1024) などと
しとくと、シェルに頼らずメモリ(仮想空間)を制限できました。

みなさま、どうもありがとうございました。

山田

0 nya meddelanden