Fedora 20 memory.limit_in_bytesが機能しません。

Fedora 20 memory.limit_in_bytesが機能しません。

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に過ぎず、malloc30秒間待機した後、バッファを解放して終了します。

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を使用しないと、プログラムは要求されたメモリを割り当てることができないと予想されます。

関連情報