メモリの制限

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入社後は製造業の商品検索システムを担当した。現在は大手物流企業向けの基幹システムの方式設計や技術検証、トラブル対応を行っている。