Romano Gushchin (seorang insinyur perangkat lunak Facebook) mencatat serangkaian patch untuk aplikasi alokasi memori (pengontrol memori) driver slab pada milis pengembangan kernel Linux.
Driver baru ini menonjol karena memindahkan penghitungan slab dari tingkat halaman memori ke tingkat objek kernel, sehingga memungkinkan untuk berbagi halaman slab di berbagai c-group, alih-alih mengalokasikan cache slab terpisah untuk setiap c-group.
Roman menemukan apa yang dia sebut sebagai "cacat yang sangat serius" dalam pengontrol memori lempengan yang ada yang menyebabkan rendahnya penggunaan akhir-akhir ini dengan cgroup.
“Alasan sebenarnya mengapa desain yang ada mengarah pada pemanfaatan pelat yang rendah adalah sederhana: halaman pelat digunakan secara eksklusif oleh kumpulan memori.
Jika hanya ada beberapa alokasi dengan ukuran tertentu yang dibuat oleh cgroup, atau jika ada beberapa objek aktif yang tersisa setelah cgroup dihapus, atau cgroup berisi aplikasi berulir tunggal yang hampir tidak mengalokasikan objek kernel apa pun, tetapi setiap saat pada CPU baru: dalam semua kasus ini, penggunaan slab yang dihasilkan sangat rendah.
Jika penghitungan kmem dinonaktifkan, kernel dapat menggunakan ruang kosong di halaman slab untuk alokasi lain. «
Pengontrol memori Slab yang diusulkan oleh Romano Gushchin tahun lalu cukup menjanjikan karena memungkinkan peningkatan efisiensi dalam penggunaan slab, mengurangi ukuran memori yang digunakan untuk slab sebesar 30-45%, dan secara signifikan mengurangi total konsumsi memori inti.
Selain itu, patch yang diterapkan menunjukkan bahwa Facebook sudah menggunakan kode tersebut dalam produksi di server mereka dan menghemat sekitar 650-700MB+ untuk server web front-end , caching basis data, dan server DNS, di antara manfaat lainnya.
Mengurangi jumlah slab yang tidak dapat dipindahkan juga berdampak positif pada fragmentasi memori. Pengontrol memori baru secara signifikan menyederhanakan kode untuk memperhitungkan slab dan menghilangkan kebutuhan akan algoritma kompleks untuk membuat dan menghapus cache slab secara dinamis untuk setiap c-group.
Semua cgroup untuk memori dalam implementasi baru menggunakan sekumpulan cache slab yang umum, dan masa pakai cache slab tidak lagi terikat dengan jangka waktu batasan memori yang ditetapkan melalui cgroup.
Penghitungan sumber daya yang lebih tepat yang diterapkan di pengontrol pelat baru secara teoritis akan memuat CPU lebih banyak, tetapi dalam praktiknya perbedaan tersebut ternyata dapat diabaikan.
Secara khusus, pengontrol slab baru ini telah digunakan selama beberapa bulan pada server Facebook yang menangani berbagai jenis beban, dan sejauh ini belum terdeteksi adanya penurunan kinerja yang signifikan.
Tambalan berisi beberapa bagian semi-independen, yang juga dapat digunakan di luar pengontrol memori slab:
- API Pemuatan Subhalaman, yang dapat digunakan di masa mendatang untuk menghitung objek lain yang bukan seukuran halaman, misalnya alokasi percpu
- API mem_cgroup_ptr, di mana pointer yang dihitung ke sebuah memcg, dapat digunakan kembali untuk reparenting yang efisien dari objek lain, misalnya pagecache.
Pada saat yang sama, terjadi penurunan signifikan dalam konsumsi memori : pada beberapa host dimungkinkan untuk menghemat hingga 1 GB memori, tetapi indikator ini sangat bergantung pada sifat beban, ukuran total RAM, jumlah CPU, dan karakteristik kerja dengan memori.
Alih-alih membuat satu set kmem_caches terpisah untuk setiap cgroup memori, dua set global digunakan: set root untuk tidak terhitung dan tugas cgroup grup root dan set kedua untuk semua tugas lainnya. Hal ini memungkinkan penyederhanaan pengelolaan seumur hidup dari setiap kmem_caches.
Terakhir, jika Anda tertarik untuk mempelajari tentang 19 patch baru tersebut, Anda dapat menemukannya di milis kernel.