今日、私たちは興味深いバグに出会いました。私たちのサーバーでは、ユーザーを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バッファメモリに関する同様の統計。