メモリの制限
CPUの次は、メモリの制限にトライします。メモリ使用量の上限となるmemory.max_usage_in_bytesは、root groupには設定できません。下階層にコントロールグループを作成し、現在のシェルから実行されるタスクが登録されるようにします。
# mkdir /cgroup_memory
# mount -t cgroup -o memory none /cgroup_memory/
# mkdir /cgroup_memory/test
# ls /cgroup_memory/test/
cgroup.clone_children memory.kmem.tcp.failcnt memory.oom_control
cgroup.event_control memory.kmem.tcp.limit_in_bytes memory.pressure_level
cgroup.procs memory.kmem.tcp.max_usage_in_bytes memory.soft_limit_in_bytes
memory.failcnt memory.kmem.tcp.usage_in_bytes memory.stat
memory.force_empty memory.kmem.usage_in_bytes memory.swappiness
memory.kmem.failcnt memory.limit_in_bytes memory.usage_in_bytes
memory.kmem.limit_in_bytes memory.max_usage_in_bytes memory.use_hierarchy
memory.kmem.max_usage_in_bytes memory.move_charge_at_immigrate notify_on_release
memory.kmem.slabinfo memory.numa_stat tasks
頻繁に利用するのは、以下のファイルです。
- memory.limit*inbytes メモリ消費量の制限値の設定と表示
- memory.usage_in_bytes cgroup内のプロセスが消費しているメモリ
- memory.max_usagein*bytes cgroup内のプロセスが消費したメモリの最大値
- memory.oom*_control 有効化(0)/無効化(1)
oom*_controlを有効にした場合と無効にした場合の動きをそれぞれ確認しておきましょう。
以下のソースをコンパイルして試してみます。このコードは、メモリを1MBずつ5秒ごとに確保していきます。
#include
#include
#include
#include
#define MB 1024*1024
int main(int argc, char *argv[])
{
char *p;
int malloc_size = 1 * MB;
int i;
for(i = 1; i <= 10;i++)
{
p = (char *)malloc(malloc_size);
memset(p, 0, malloc_size);
sleep(5);
printf("%dMB\n", i * 1);
}
return 0;
}
oom_controlを無効にするとプロセスがフリーズします。
# echo $$ > /cgroup_memory/test/tasks
# echo 1 > /cgroup_memory/test/memory.oom_control
# echo 5M > /cgroup_memory/test/memory.limit_in_bytes
# ./memtest
1MB
2MB
3MB
4MB
oom*_controlを有効にしてみます。今度はプロセスがKillされました。
# echo $$ > /cgroup_memory/test/tasks
# echo 0 > /cgroup_memory/test/memory.oom_control
# echo 5M > /cgroup_memory/test/memory.limit_in_bytes
# ./memtest
1MB
2MB
3MB
4MB
Killed
著者プロフィール
野村総合研究所(NRI) 湯川勇太(ゆかわ ゆうた)
前職で大手家電量販店のECモールの立ち上げとECサイトの刷新プロジェクトを経験。NRI入社後は製造業の商品検索システムを担当した。現在は大手物流企業向けの基幹システムの方式設計や技術検証、トラブル対応を行っている。