cgroup階層内にフォルダを作成しようとしたときに「メモリを割り当てられません」エラー

cgroup階層内にフォルダを作成しようとしたときに「メモリを割り当てられません」エラー

今日、私たちは興味深いバグに出会いました。私たちのサーバーでは、ユーザーをcgroupフォルダに入れて、CPUやメモリなどのリソース使用量を監視および制御します。ユーザー固有のメモリcgroupフォルダを追加しようとしたときにエラーが発生し始めました。

mkdir /sys/fs/cgroup/memory/users/newuser
mkdir: cannot create directory ‘/sys/fs/cgroup/memory/users/newusers’: Cannot allocate memory

マシンには実際に十分な量のメモリと使用可能なスワップスペースがあるため、これはやや奇妙に見えます。sysctl値を0から1に変更してもvm.overcommit_memory効果はありません。

私たちは、多数のユーザー固有のサブフォルダー(実際には約7,000個)を実行していることを発見しました。そのほとんどは、そのコンピュータでプロセスが実行されなくなったユーザーのためのものでした。

ls /sys/fs/cgroup/memory/users/ | wc -l
7298

cgroup階層で使用されていないフォルダを削除すると、実際に問題が解決しました。

cd /sys/fs/cgroup/memory/users/
ls | xargs -n1 rmdir
# errors for folders in-use, succeeds for unused
mkdir /sys/fs/cgroup/memory/users/newuser
# now works fine

興味深いことに、この問題はメモリcgroupにのみ影響します。 CPU/会計cgroupは問題ありませんが、実際には階層に多くのユーザーがいます。

ls /sys/fs/cgroup/cpu,cpuacct/users/ | wc -l
7450
mkdir /sys/fs/cgroup/cpu,cpuacct/users/newuser
# fine

それでは、これらのメモリ不足エラーの原因は何ですか? memory-cgroup サブシステム自体に何らかのメモリ制限がありますか?

cgroupマウントの内容を見つけることができますここ

答え1

各cgroupには制限があります。これについて読むことができます。LWN.netから:

各cgroupには、それに関連するメモリコントローラ固有のデータ構造(mem_cgroup)があります。

....会計はcgroupによって行われます。

に保存される最大メモリ量/sys/fs/cgroup/memory/memory.limit_in_bytes。苦しんでいる問題が実際に以下に関連している場合グループメモリ制限、それから/sys/fs/cgroup/memory/memory.max_usage_in_bytes上記の内容に近いはずです。確認で確認することもできます。記憶喪失、実際の使用量が上限に達した回数を記録します。

たぶんあなたも確認できますmemory.kmem.failcntそしてmemory.kmem.tcp.failcntカーネルメモリとTCPバッファメモリに関する同様の統計。

関連情報