Fitur Batas Page Cache tersedia di Alibaba Cloud Linux 3 mulai dari versi kernel 5.10.134-14 untuk mengatasi masalah ketidakstabilan sistem akibat penggunaan page cache tanpa batas, seperti jitter bisnis dan kesalahan kehabisan memori (OOM) yang tidak terduga.
Informasi Latar Belakang
Di dalam kernel, alokasi memori langsung memicu pengambilan ulang memori pada grup kontrol memori (memcg) saat batas atas memori yang ditentukan oleh memcg tercapai. Proses ini dapat memengaruhi kinerja proses yang sedang berjalan. Meskipun fitur pengambilan ulang asinkron backend memcg dirancang untuk menyelesaikan masalah ini, fitur tersebut kurang efektif untuk permintaan memori mendadak. Misalnya, saat menjalankan framework Spark, sejumlah besar memori digunakan sebagai page cache, dengan sebagian besar halaman dalam page cache menjadi Halaman kotor. Halaman kotor direklaim secara lambat, sehingga kernel mungkin gagal mendapatkan cukup memori, menyebabkan kesalahan OOM yang tidak terduga. Untuk memastikan stabilitas bisnis dan mencegah kesalahan OOM, penggunaan page cache harus dibatasi.
Alibaba Cloud Linux 3 menyediakan fitur Batas Page Cache untuk membatasi penggunaan page cache pada memcgs, termasuk root memcgs. Anda dapat menggunakan fitur ini untuk menentukan batas penggunaan page cache dan mereklaim page cache berlebih secara sinkron atau asinkron ketika batas terlampaui. Ini mencegah penggunaan memori yang lebih besar dari yang diharapkan untuk page cache, meningkatkan stabilitas dan keandalan sistem.
Antarmuka
Antarmuka | Deskripsi |
/sys/kernel/mm/pagecache_limit/enabled | Saklar yang mengontrol apakah akan mengaktifkan fitur Batas Page Cache secara global di kernel. Nilai valid: 0 dan 1. Nilai default: 0.
|
/sys/fs/cgroup/memory/<Nama Direktori Memcg>/memory.pagecache_limit.enable | Saklar yang mengontrol apakah akan mengaktifkan fitur Batas Page Cache untuk memcg tertentu. Nilai valid: 0 dan 1. Nilai default: 0.
|
/sys/fs/cgroup/memory/<Nama Direktori Memcg>/memory.pagecache_limit.size | Penggunaan page cache maksimum untuk memcg tertentu. Satuan: byte. Nilai yang valid: 0 hingga nilai
|
/sys/fs/cgroup/memory/<Nama Direktori Memcg>/memory.pagecache_limit.sync | Mengontrol apakah akan melakukan reklaim asinkron atau sinkron ketika memcg melebihi batas penggunaan page cache. Nilai valid: 0 dan 1. Nilai default: 0. Jika sebuah tugas burst menghasilkan banyak Page Cache lebih cepat daripada workqueue asinkron dapat mereclaim-nya, jumlah Page Cache mungkin sementara melebihi
|
Cara kerja fitur ini
Setelah mengaktifkan fitur Batas Page Cache, fitur ini bekerja pada memcgs berdasarkan prinsip-prinsip berikut:
Ketika page cache dialokasikan ke proses memcg, fitur ini menentukan apakah memcg saat ini melebihi batas penggunaan page cache, dan melakukan traversal ke atas dari memcg tersebut untuk memeriksa nilai
memory.pagecache_limitdari memcg induk secara hierarkis. Jika nilai memory.pagecache_limit dari memcg induk adalah 0, fitur Batas Page Cache dinonaktifkan untuk memcg induk tersebut. Penggunaan page cache tidak dibatasi untuk memcg induk tersebut dan child memcg-nya.Jika memcg saat ini melebihi batas penggunaan page cache, fitur ini menentukan apakah reklaim dilakukan secara sinkron atau asinkron berdasarkan nilai
memory.pagecache_limit.sync.Fitur ini mereklaim page cache.
Reklaim sinkron: Secara default, hanya halaman file yang tidak dipetakan yang dapat direklaim. Saat kernel melakukan lebih dari empat pemindaian, halaman file yang dipetakan juga dapat direklaim.
Reklaim asinkron: Secara default, halaman file yang tidak dipetakan dan dipetakan dapat direklaim. Saat kernel melakukan lebih dari dua pemindaian, halaman kotor dapat direklaim.
CatatanBerikut adalah jenis halaman memori yang tersedia:
Halaman file yang tidak dipetakan: Halaman memori yang tidak dipetakan ke file. Biasanya, halaman ini merupakan wilayah pribadi memori yang menyimpan data sementara dan tidak disimpan ke disk.
Halaman file yang dipetakan: Halaman memori yang dipetakan ke file, memungkinkan proses membaca dan menulis data file di memori untuk akses acak ke file.
Halaman kotor: Halaman file yang dipetakan yang telah dimodifikasi. Saat proses menulis data ke halaman file yang dipetakan, halaman tersebut ditandai kotor. Tanda ini menunjukkan bahwa salinan file di memori telah dimodifikasi dan berbeda dari file di disk. Halaman kotor secara berkala ditulis kembali ke disk untuk memastikan persistensi data.
Contoh cara mengonfigurasi antarmuka
Pada contoh ini, sebuah page cache 20 MiB dibuat dan penggunaan page cache dibatasi hingga 10 MiB. Setelah mengaktifkan fitur Batas Page Cache, verifikasi apakah fitur ini bekerja sesuai harapan.
Hubungkan ke instance Elastic Compute Service (ECS).
Untuk informasi lebih lanjut, lihat Gunakan Workbench untuk terhubung ke instance Linux melalui SSH.
Aktifkan fitur Batas Page Cache secara global.
sudo sh -c 'echo 1 > /sys/kernel/mm/pagecache_limit/enabled'Aktifkan fitur Batas Page Cache dan batasi penggunaan page cache untuk memcg tertentu.
Buat direktori memcg. Contoh:
/sys/fs/cgroup/memory/test/.sudo mkdir -p /sys/fs/cgroup/memory/test/Tentukan batas penggunaan page cache untuk memcg tersebut.
Dalam contoh ini, batas penggunaan page cache memcg diatur menjadi 10.485.760 byte (sekitar sama dengan 10 MiB).
sudo sh -c 'echo 10485760 > /sys/fs/cgroup/memory/test/memory.pagecache_limit.size'Konfigurasikan skema reklaim page cache untuk memcg.
Untuk menggunakan skema reklaim asinkron, jalankan perintah berikut:
sudo sh -c 'echo 0 > /sys/fs/cgroup/memory/test/memory.pagecache_limit.sync'Untuk menggunakan skema reklaim sinkron, jalankan perintah berikut:
sudo sh -c 'echo 1 > /sys/fs/cgroup/memory/test/memory.pagecache_limit.sync'
Aktifkan fitur Batas Page Cache untuk memcg tersebut.
sudo sh -c 'echo 1 > /sys/fs/cgroup/memory/test/memory.pagecache_limit.enable'
Buat page cache.
Instal paket
libcgroup.Perintah
cgexecdiperlukan untuk membuat page cache. Umumnya, perintahcgexecdisediakan sebagai bagian dari paket libcgroup dan perlu diinstal. Jika perintahcgexectidak tersedia di sistem Anda, instal paket libcgroup.sudo yum install libcgroup-toolsBuat page cache.
Dalam contoh ini, perintah
dddigunakan untuk membuat page cache 20 MiB dengan menulis blok 1 MiB sebanyak 20 kali berturut-turut.sudo dd if=/dev/zero of=./testfile bs=1M count=20 oflag=direct sudo cgexec -g "memory:test" cat ./testfile > /dev/null
Periksa apakah fitur Batas Page Cache bekerja sesuai harapan.
Jalankan perintah berikut untuk memeriksa penggunaan page cache:
grep cache /sys/fs/cgroup/memory/test/memory.statKeluaran perintah berikut dikembalikan.

Dalam keluaran tersebut,
cachemenunjukkan bahwa penggunaan page cache dibatasi hingga 10.543.104 byte (sekitar 10 MiB).Periksa apakah fitur Batas Page Cache mereklaim page cache sesuai harapan.
cat /sys/fs/cgroup/memory/test/memory.exstatKeluaran perintah berikut dikembalikan.

Dalam keluaran tersebut,
pagecache_limit_reclaimed_kbmenunjukkan bahwa 10.108 KB (sekitar 10 MiB) page cache telah direklaim.Hasil verifikasi menunjukkan bahwa page cache 20-MiB dibuat dan penggunaan page cache dibatasi hingga 10 MiB. Ketika penggunaan page cache melebihi batas, 10 MiB page cache direklaim oleh fitur Batas Page Cache sesuai harapan.
CatatanJika nilai
pagecache_limit_reclaimed_kblebih tinggi dari yang diharapkan, hal ini mungkin disebabkan oleh jumlah data yang tidak tepat yang dibaca sebelumnya (read ahead) atau dipra-ambil (prefetched) selama operasi baca berurutan, sehingga menyebabkan reclaim page cache berlebihan. Kami menyarankan Anda menjalankan perintahecho 128 | sudo tee /sys/block/<Nama perangkat disk>/queue/read_ahead_kbuntuk mengonfigurasi parameter read_ahead_kb untuk disk tersebut. Dalam contoh ini,vdadigunakan sebagai nama perangkat disk. Parameter read_ahead_kb menentukan jumlah kilobita yang akan dibaca sebelumnya atau dipra-ambil oleh kernel selama operasi baca berurutan. Kemudian, verifikasi kembali fitur Page Cache.