Romano Gushchin (seorang jurutera perisian Facebook) telah merekodkan satu set tampalan pada aplikasi peruntukan memori pemacu slab (pengawal memori) pada senarai mel pembangunan kernel Linux.
Pemacu baharu ini terkenal kerana memindahkan perakaunan papak dari tahap halaman memori ke tahap objek kernel, menjadikannya mungkin untuk berkongsi halaman papak merentasi kumpulan-c yang berbeza, dan bukannya memperuntukkan cache papak berasingan untuk setiap kumpulan-c.
Roman menemui apa yang disebutnya sebagai "kelemahan yang sangat serius" dalam pengawal memori papak yang ada yang menyebabkan penggunaan rendah hari ini dengan kumpulan.
"Sebab sebenar mengapa reka bentuk yang ada menyebabkan penggunaan slab rendah adalah mudah: halaman slab digunakan secara eksklusif oleh kumpulan memori.
Sekiranya hanya ada beberapa peruntukan ukuran tertentu yang dibuat oleh cgroup, atau jika ada beberapa objek aktif yang tersisa setelah cgroup dikeluarkan, atau cgroup tersebut berisi aplikasi berulir tunggal yang hampir tidak mengalokasikan objek kernel, tetapi setiap saat CPU baru: dalam semua kes ini, penggunaan papak yang dihasilkan sangat rendah.
Sekiranya perakaunan kmem dilumpuhkan, kernel dapat menggunakan ruang kosong pada halaman papak untuk peruntukan lain. «
Pengawal memori Slab yang dicadangkan oleh Romano Gushchin tahun lepas agak menjanjikan kerana ia membolehkan peningkatan kecekapan dalam penggunaan slab, mengurangkan saiz memori yang digunakan untuk slab sebanyak 30-45% dan mengurangkan jumlah penggunaan memori teras dengan ketara.
Tambahan pula, tampalan yang dilaksanakan telah menunjukkan bahawa Facebook telah pun menggunakan kod tersebut dalam pengeluaran pada pelayannya dan telah menjimatkan ~650-700MB+ untuk pelayan web bahagian hadapan , caching pangkalan data dan pelayan DNS, antara faedah lain.
Mengurangkan bilangan papak yang tidak boleh alih juga mempunyai kesan positif terhadap pemecahan memori. Pengawal memori baharu memudahkan kod untuk mengambil kira papak dengan ketara dan menghapuskan keperluan untuk algoritma kompleks untuk mencipta dan memadam cache papak secara dinamik untuk setiap kumpulan-c.
Semua cgroup untuk memori dalam implementasi baru menggunakan sekumpulan slab cache yang biasa, dan jangka hayat slab cache tidak lagi terikat dengan jangka hayat memori yang ditetapkan melalui cgroup.
Perakaunan sumber yang lebih tepat yang dilaksanakan dalam pengawal papak baru seharusnya secara teori memuatkan CPU lebih banyak, tetapi dalam praktiknya perbezaannya dapat diabaikan.
Khususnya, pengawal papak baharu telah digunakan selama beberapa bulan pada pelayan Facebook langsung yang mengendalikan pelbagai jenis beban, dan setakat ini tiada regresi ketara telah dikesan.
Tampalan itu mengandungi beberapa bahagian separa bebas, yang juga dapat digunakan di luar kawalan memori papak:
- Subpage Load API, yang dapat digunakan di masa depan untuk menghitung objek lain yang tidak berukuran halaman, misalnya peruntukan percpu
- API mem_cgroup_ptr, di mana penunjuk yang dihitung ke memcg, dapat digunakan kembali untuk penyampaian semula objek lain yang cekap, misalnya pagecache.
Pada masa yang sama, terdapat penurunan penggunaan memori yang ketara : pada sesetengah hos, ia dapat menjimatkan sehingga 1 GB memori, tetapi penunjuk ini sebahagian besarnya bergantung pada sifat beban, jumlah saiz RAM, jumlah CPU dan ciri-ciri bekerja dengan memori.
Daripada membuat satu set kmem_caches yang berasingan untuk setiap kumpulan memori, dua set global digunakan: set root untuk tidak dihitung dan tugasan kumpulan kumpulan akar dan set kedua untuk semua tugasan lain. Ini membolehkan mempermudah pengurusan sepanjang kmem_caches individu.
Akhir sekali, jika anda berminat untuk mengetahui tentang set 19 tampalan baharu ini, anda boleh menemuinya di senarai mel kernel.