Fedora 29(カーネル3.15.10-201.fc20.x86_64)これはF19で動作します。
誤動作しやすい特定のアプリケーションのメモリ使用量を制限するためにcgroupを使用しようとしたときに問題が発生しました。テストには小さな単一目的プログラムを使用しています。
私のファイルには次のものがあります/etc/cgconfig.conf
。
group memtest {
memory {
memory.limit_in_bytes = "209715200";
memory.soft_limit_in_bytes = "104857600";
}
}
この場所は次のとおりです/etc/cgrules.conf
。
*:memtest memory memtest/
ファイルmemtest.c
サイズは1GiBに過ぎず、malloc
30秒間待機した後、バッファを解放して終了します。
memtest
プログラムが実行されると、そのPIDが正しくリストされ、/sys/fs/cgroup/memory/memtest/tasks
正しく分類されたことを示します。ただし、メモリ使用量はいいえ限られた。
使用法がulimit
期待どおりに機能します。
$ (ulimit -S -v 200000 ; ./memtest )
malloc failed: Cannot allocate memory
ソースは次のとおりですmemtest.c
。
#include <errno.h>
#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>
main() {
char *buf;
size_t bytes = (1 * 1<<30);
errno = 0;
buf = malloc(bytes);
if (errno != 0) {
int errno_copy = errno;
perror("malloc failed");
return errno_copy;
}
printf("%d bytes allocated (requested %d)\n",
malloc_usable_size(buf),
bytes);
sleep(30);
printf("Freeing..\n");
free(buf);
return 0;
}
ジョブが正しく分類されているが、メモリ使用量が制限されないのはなぜですか? F19とF20の間にどんな変化がありましたか? (先週にF20にアップグレードしました。)
ありがとうございます!
答え1
一見すると、私が考えることができる唯一のことは(システムによる)cgconfig.conf処理がより厳しくなったことです。制限を引用符で囲んだ文字列として定義するのではなく、引用符を削除すると、次のことが発生します。だからこんな感じ:
group memtest {
memory {
memory.limit_in_bytes = 209715200;
memory.soft_limit_in_bytes = 104857600;
}
}
多くの考えの最後に、memory.limit_in_bytesは物理ユーザーメモリのみを制限しますが、スワッピングを許可すると思います。あなたがすべきことは、次のようmemory.memsw.limit_in_bytes
な値に設定することだけです。memory.limit_in_bytes
group memtest {
memory {
memory.limit_in_bytes = 209715200;
memory.memsw.limit_in_bytes = 209715200;
memory.soft_limit_in_bytes = 104857600;
}
}
memory.memsw.limit_in_bytes には、ユーザーのメモリとスワップ領域が含まれます。したがって、ゼロスワップスペースが必要な場合は、memory.memsw.limit_in_bytes
次のように設定する必要があります。memory.limit_in_bytes
これにより、ulimit -S -v 200000
仮想メモリ(スワップ、共有データ、物理メモリ)が特定の量に制限され、アプリケーションに十分なスペースがなくなります。ただし、一般的なシステム設定はスワップスペースを制限しないため、最大ユーザーメモリ+未使用のスワップスペースを使用するのに十分なスペースがある可能性があります。
テスト前にスワップをオフにしてulimitを使用しないと、プログラムは要求されたメモリを割り当てることができないと予想されます。