Sebuah cgroup dapat tetap hidup setelah penggunaan memorinya melewati memory.high. Batas ini tidak berperilaku seperti batas alokasi keras: task di dalam cgroup akan di-throttle dan didorong ke tekanan reclaim yang berat, sementara penggunaan memori masih dapat bertahan di atas nilai yang dikonfigurasi dalam kondisi ekstrem.
Perilaku tersebut membuat memory.high berbeda secara material dari memory.max. Yang pertama mengubah penggunaan berlebih menjadi biaya eksekusi dan pekerjaan reclaim. Yang kedua adalah hard limit yang dapat memicu cgroup OOM ketika reclaim tidak mampu menurunkan penggunaan secara memadai.
Batas high mengubah perilaku alokasi
Memory controller cgroup v2 menghitung kelas utama memori user space dan kernel secara hierarkis. memory.current melaporkan charge saat ini untuk sebuah cgroup beserta descendant-nya, sedangkan memory.high mendefinisikan batas throttle untuk penggunaan yang dibebankan tersebut.
Setelah penggunaan melewati batas high, jalur memory charging berikutnya dapat memaksa task terdampak melalui direct reclaim dan throttling. Workload menghabiskan waktu CPU untuk memindai kandidat reclaim, dapat menunggu aktivitas writeback atau swap, dan kehilangan throughput aplikasi walaupun alokasi belum mencapai batas kegagalan keras.
Ini adalah mekanisme pressure, bukan reservation. Nilai 4 GiB tidak berarti kernel selalu menjaga cgroup tepat di atau di bawah 4 GiB. Race pada accounting, kemajuan reclaim, working set aktif, dan kondisi memory management lain dapat membuat penggunaan berada di atas batas selama suatu interval.
Nilai default-nya adalah max, yang menonaktifkan batas throttle ini.
Direct reclaim memindahkan biaya ke workload
Pelanggaran batas high penting karena reclaim bukan cleanup background tanpa biaya. Task yang terkait dengan charge baru dapat diarahkan ke direct memory reclaim. Waktu eksekusinya kemudian sebagian dihabiskan untuk mencoba membebaskan memori yang dibebankan ke cgroup.
Untuk page berbasis file, reclaim dapat membuang clean cache page atau mengharuskan dirty data mencapai backing storage sebelum page dapat digunakan kembali. Anonymous page dapat memerlukan swap ketika swapping tersedia dan diizinkan. Workload dengan active set besar karena itu dapat menghabiskan banyak waktu memindai page yang segera diakses kembali.
Kondisi ini menciptakan failure mode khas: penggunaan memori terlihat terbatas di sekitar nilai high yang dikonfigurasi, tetapi latency meningkat dan throughput turun. Limit tersebut sedang bekerja justru karena workload terus meminta memori melewati batas.
memory.events menyediakan counter high untuk kejadian ini. Counter bertambah ketika proses cgroup di-throttle dan diarahkan ke direct reclaim setelah melewati batas high. Counter ini merekam kejadian pressure pada batas, bukan durasi stall.
memory.high dan memory.max menegakkan batas berbeda
memory.max adalah hard usage limit milik memory controller. Ketika penggunaan mencapai batas ini dan reclaim tidak mampu menurunkannya, tekanan alokasi dapat membawa cgroup ke kondisi OOM dan memicu cgroup OOM killer.
memory.high tidak memanggil OOM killer hanya karena batasnya terlewati. Jalur enforcement-nya sengaja dibuat dapat dipulihkan: reclaim dan throttling dapat memperlambat workload sementara controller eksternal mengamati pressure, menyesuaikan resource, atau menghentikan workload melalui policy di luar memory controller.
Pemisahan ini mendukung konfigurasi ketika service memiliki batas operasi di bawah batas keselamatan absolut. Sebagai contoh, cgroup dapat memiliki memory.high terbatas yang memberi backpressure berkelanjutan dan memory.max lebih besar untuk mencegah pertumbuhan tanpa batas. Melewati batas pertama menurunkan performa eksekusi; mencapai batas kedua dapat menjadi peristiwa survival.
Jarak antara kedua nilai itu karena itu signifikan secara operasional. Jarak sempit memberi reclaim sedikit ruang sebelum hard limit menjadi relevan. Jarak lebih lebar memungkinkan overage transien yang lebih besar tetapi juga membolehkan footprint ter-charge yang lebih besar.
Reclaimability menentukan tingkat keparahan throttling
Kelebihan penggunaan yang sama tidak berarti dampak performanya sama. Kernel harus menemukan memori yang benar-benar dapat direclaim dengan biaya yang dapat diterima.
Workload yang didominasi cache dengan cold clean page dapat melepaskan memori dengan cepat. Workload yang didominasi anonymous page yang sering disentuh jauh lebih sulit diperkecil, terutama ketika swap tidak tersedia atau dibatasi. Dirty file cache dapat menghubungkan memory pressure dengan storage latency karena reclaim mungkin bergantung pada kemajuan writeback.
Active working set juga berpengaruh. Mereclaim page yang segera di-fault atau dibaca kembali tidak menghasilkan relief yang bertahan. Eviction dan refault berulang dapat mengubah nominal memory cap menjadi tekanan CPU, storage, dan latency yang terus-menerus.
Karena itu, memory.current yang mendekati memory.high tidak cukup sebagai signal performa. Event counter, komposisi memori di memory.stat, dan memory pressure stall information memberi bukti terpisah mengenai frekuensi enforcement, kelas memori yang ter-charge, dan waktu yang hilang akibat pressure.
Hierarki mengubah sumber pressure
Resource control cgroup v2 bersifat hierarkis. Sebuah task dapat berada di leaf cgroup yang konfigurasi lokalnya terlihat longgar sementara ancestor menerapkan batas resource efektif yang lebih ketat untuk subtree yang lebih besar.
Memory accounting dan event karena itu harus ditafsirkan dengan memperhatikan hierarki. memory.events bersifat hierarkis dan dapat mencerminkan event yang terjadi di bawah cgroup yang sedang diperiksa. memory.events.local membatasi counter hanya pada cgroup lokal.
Perbedaan ini penting dalam service tree ketika sebuah parent mengelompokkan beberapa worker. Pressure yang terlihat pada parent dapat berasal dari satu descendant, beberapa descendant yang bersaing di bawah batas parent bersama, atau policy yang diterapkan pada parent itu sendiri. Counter lokal membantu memisahkan event milik leaf dari aktivitas subtree yang teragregasi.
Masalah serupa muncul saat membandingkan charged usage setelah proses berpindah antar-cgroup. Memori umumnya dibebankan ke cgroup yang membuatnya dan tidak otomatis ikut bermigrasi bersama proses. Penempatan proses dan ownership memori karena itu dapat berbeda untuk alokasi yang sudah ada.
Menurunkan batas dapat memicu pekerjaan sinkron
Menulis nilai yang lebih rendah ke memory.high dapat langsung membuat target cgroup berada di atas limit. Dengan file descriptor blocking biasa, perubahan nilai dapat melibatkan synchronous reclaim sehingga writer administratif menghabiskan waktu CPU untuk pemulihan memori.
Interface ini memiliki perilaku nonblocking khusus. Ketika memory.high dibuka dengan O_NONBLOCK, synchronous reclaim oleh writer dilewati. Workload target kemudian menghadapi reclaim atau throttling pada permintaan charge berikutnya.
Hal tersebut mengubah tempat biaya enforcement dibayar, bukan arti batasnya. Mekanisme ini dapat melindungi resource-management agent agar tidak melakukan pekerjaan reclaim besar sendiri, tetapi juga berarti penggunaan dapat tetap berada di atas nilai baru sampai task target membuat charge request yang sesuai dan reclaim berjalan.
Workload yang jarang melakukan alokasi setelah perubahan karena itu dapat membutuhkan waktu lebih lama untuk turun di bawah batas baru.
Pressure dapat merambat melampaui latency memori
Direct reclaim mengonsumsi CPU cycle, dan reclaim terhadap dirty page atau swapped page dapat menghasilkan traffic storage. Keputusan kontrol memori karena itu dapat muncul sebagai CPU contention, I/O pressure, atau tail latency aplikasi, bukan sekadar kegagalan alokasi.
Keterkaitan ini penting ketika memory.high dipakai sebagai kontrol steady-state. Event high yang sering menunjukkan kontak berulang dengan batas throttle. Peningkatan memory PSI menunjukkan task kehilangan waktu eksekusi karena memory pressure. Storage pressure dapat meningkat ketika reclaim berulang kali membutuhkan writeback atau swap I/O.
Batas ini paling tepat diperlakukan sebagai mekanisme feedback. Ia mengubah kelebihan charged memory menjadi usaha reclaim dan throttling, sambil mempertahankan batas hard-failure yang terpisah pada memory.max. Pemisahan tersebut memberi cgroup v2 cara untuk mengekspresikan memory pressure sebelum kehabisan memori berubah menjadi peristiwa OOM.