Dalam skenario cloud-native, Namespace dan Cgroup memberikan dukungan dasar untuk isolasi sumber daya, tetapi kemampuan isolasi keseluruhan dari kontainer masih belum lengkap. Secara khusus, beberapa informasi statistik sumber daya di sistem file /proc dan /sys belum di-container-kan, yang menyebabkan beberapa perintah umum yang dijalankan di dalam kontainer (seperti free, top) tidak dapat menampilkan penggunaan sumber daya kontainer dengan akurat.
Untuk mengatasi masalah ini, kernel TencentOS meluncurkan solusi cgroupfs yang bertujuan untuk meningkatkan tampilan sumber daya kontainer. cgroupfs mengimplementasikan sistem file virtual yang mencakup file /proc dan /sys yang diperlukan untuk aplikasi, yang dilihat dari perspektif kontainer. Struktur direktori ini konsisten dengan procfs dan sysfs global untuk memastikan kompatibilitas dengan alat pengguna. Saat file-file ini dibaca, cgroupfs secara dinamis menghasilkan tampilan informasi kontainer yang sesuai berdasarkan konteks proses pembaca.
Memasang sistem berkas cgroupfs
1. Eksekusi perintah berikut untuk memasang sistem file cgroupfs.
mount -t cgroupfs cgroupfs /cgroupfs/
Tangkapan layar seperti berikut:
2. Gunakan opsi -v untuk me-mount file yang diperlukan dari direktori cgroupfs ke dalam kontainer yang ditentukan. Berikut adalah perintah untuk memulai docker:
docker run -itd --cpus 2 --cpuset-cpus 0,1,2,4 -v
/cgroupfs/sys/devices/system/cpu/:/sys/devices/system/cpu -v
/cgroupfs/proc/cpuinfo:/proc/cpuinfo -v
/cgroupfs/proc/stat:/proc/stat -v
/cgroupfs/proc/meminfo:/proc/meminfo <image-id> /bin/bash
3. Selanjutnya, saya melihat informasi cpuinfo, stat, dan meminfo yang hanya milik perspektif container di dalam wadah.
Isolasi pagecache
Ketika penggunaan halaman file oleh proses terlalu banyak, itu akan memakan banyak memori, yang menyebabkan jumlah memori yang tersedia untuk aplikasi lainnya berkurang. Situasi ini membuat alokasi memori mesin sering terjebak dalam jalur yang tidak efisien, dan dapat dengan mudah memicu kesalahan kehabisan memori (OOM). Dalam konteks cloud-native, kami telah memperluas cache halaman kernel (page cache) dan menerapkan pembatasan penggunaan cache halaman untuk kontainer (page cache limit), sehingga memungkinkan pembatasan penggunaan cache halaman untuk kontainer tertentu secara terpisah.
Pembatasan pagecache pada seluruh mesin:
sysctl -w vm.memory_qos=1
sysctl -w vm.pagecache_limit_global=1
echo x > /proc/sys/vm/pagecache_limit_ratio
Proses pemulihan halaman kotor relatif memakan waktu. pagecache_limit_ignore_dirty Digunakan untuk menilai dalam perhitungan page cache Apakah pagecache diabaikan saat memori digunakan? Posisinya adalah sebagai berikut:
/proc/sys/vm/pagecache_limit_ignore_dirty.
Nilai default adalah 1, yang berarti mengabaikan pagecache
Menetapkan cara pemulihan page cache:
/proc/sys/vm/pagecache_limit_async
1 menunjukkan pemulihan page cache secara asinkron, TencentOS akan membuat sebuah thread kernel [kpclimitd], yang bertanggung jawab untuk pemulihan page cache.
0 menunjukkan pemulihan sinkron, yang tidak akan membuat thread pemulihan khusus, melainkan pemulihan dalam konteks proses yang dipicu oleh page cache limit. Nilai default adalah 0.
Batasan pagecache kontainer:
Selain mendukung batasan pagecache tingkat sistem global, TencentOS juga mendukung batasan pagecache tingkat kontainer, dengan cara penggunaan sebagai berikut:
1. Mengaktifkan QOS Memori:
sysctl -w vm.memory_qos=1
2. Menonaktifkan batasan pagecache keseluruhan:
sysctl -w vm.pagecache_limit_global=0
3. Masuk ke memcg yang berisi kontainer dan atur batas memory:
echo value > memory.limit_in_bytes
4. Setel penggunaan maksimum pagecache sebagai persentase dari batas memori saat ini, misalnya atur menjadi 10%:
echo 10 > memory.pagecache.max_ratio
5. Atur rasio pemulihan setelah kelebihan pagecache:
echo 5 > memory.pagecache.reclaim_ratio
Batas kecepatan baca dan tulis yang seragam
Skema pembatasan kecepatan IO asli pada kernel Linux memisahkan pembatasan kecepatan untuk baca dan tulis, yang mengharuskan administrator untuk membagi bandwidth IO sesuai dengan model bisnis dan menerapkan pembatasan kecepatan untuk masing-masing, sehingga ada potensi pemborosan bandwidth. Misalnya, jika dikonfigurasi untuk 50MB/s baca dan 50MB/s tulis, tetapi bandwidth IO aktual adalah 20MB/s baca dan 50MB/s tulis, maka akan ada pemborosan bandwidth baca sebesar 30MB/s. Untuk mengatasi masalah ini, TencentOS memperkenalkan skema pembatasan kecepatan baca dan tulis yang terintegrasi. Skema ini memberikan antarmuka konfigurasi pembatasan kecepatan baca dan tulis yang terintegrasi di ruang pengguna, sementara di ruang kernel, pembagian proporsi baca dan tulis dilakukan secara dinamis berdasarkan aliran bisnis. Cara penggunaan adalah sebagai berikut:
Masuk ke cgroup yang sesuai dengan blkio dan gunakan konfigurasi berikut:echo MAJ:MIN VAL > FILE.
Di mana MAJ:MIM mewakili nomor perangkat, FILE dan VAL seperti yang ditunjukkan pada tabel di bawah ini:
|
blkio.throttle.readwrite_bps_device | Batas total pembatasan Bps baca-tulis |
blkio.throttle.readwrite_iops_device | Batas total iops untuk baca dan tulis |
blkio.throttle.readwrite_dynamic_ratio | Prediksi dinamis rasio membaca dan menulis: 0: Tutup. Gunakan rasio tetap (baca - 3:1) 1~5:Membuka skema prediksi dinamis. |
dukungan pembatasan kecepatan buffer io
Di dalam kernel asli Linux, cgroup v1 memiliki kekurangan dalam membatasi kecepatan buffer IO. Penulisan kembali buffer IO biasanya merupakan proses asinkron, dan saat kernel melakukan operasi pencucian kotor secara asinkron, kernel tidak dapat menentukan ke blkio cgroup mana IO tersebut harus diserahkan, sehingga kebijakan pembatasan kecepatan blkio yang sesuai tidak dapat diterapkan.
Berdasarkan hal ini, TencentOS lebih lanjut menyempurnakan fungsi pembatasan buffer IO pada cgroup v1, menjadikannya konsisten dengan fungsi pembatasan buffer IO yang berbasis cgroup v2. Untuk cgroup v1, kami menyediakan antarmuka pengguna ruang pengguna yang memungkinkan untuk menghubungkan mem_cgroup dari page cache dengan blkio cgroup yang sesuai, sehingga kernel dapat membatasi kecepatan buffer IO berdasarkan informasi penghubungan tersebut.
1. Untuk mengaktifkan fitur pembatasan kecepatan buffer io, perlu mengaktifkan dua fitur, yaitu kernel.io_qos dan kernel.io_cgv1_buff_wb.
sysctl -w kernel.io_qos=1
sysctl -w kernel.io_cgv1_buff_wb=1
2. Untuk mencapai pembatasan kecepatan buffer IO pada kontainer, perlu mengikat cgroup memcg dan blkcg yang sesuai dengan kontainer secara eksplisit. Langkah-langkahnya adalah sebagai berikut:
echo /sys/fs/cgroup/blkio/A > /sys/fs/cgroup/memory/A/memory.bind_blkio
Setelah terikat, mekanisme pembatasan sumber daya buffer IO untuk kontainer yang disediakan oleh blkio cgroup dapat dilihat melalui antarmuka berikut:
blkio.throttle.read_bps_device
blkio.throttle.write_bps_device
blkio.throttle.write_iops_device
blkio.throttle.read_iops_device
blkio.throttle.readwrite_bps_device
blkio.throttle.readwrite_iops_device
fork asinkron
Ketika bisnis dengan memori besar melakukan panggilan sistem fork untuk membuat proses anak, waktu yang dibutuhkan untuk panggilan fork relatif lama, yang menyebabkan bisnis mungkin berada dalam mode kernel untuk waktu yang lama dan tidak dapat memproses permintaan bisnis. Oleh karena itu, mengoptimalkan waktu fork pada kernel untuk skenario ini sangat penting.
Pada Linux, dalam alur default penanganan fork oleh kernel, proses induk perlu menyalin banyak metadata proses ke proses anak, di mana penyalinan tabel halaman adalah bagian yang paling memakan waktu, biasanya menyumbang lebih dari 97% dari total waktu eksekusi panggilan fork. Desain fork asinkron berfokus pada memindahkan pekerjaan penyalinan tabel halaman dari proses induk ke proses anak. Dengan demikian, waktu yang diperlukan untuk proses induk melakukan panggilan sistem fork dan terjebak dalam mode kernel dapat dipersingkat, memungkinkan aplikasi segera kembali ke mode pengguna untuk menangani permintaan bisnis, sehingga mengatasi masalah gangguan kinerja yang disebabkan oleh fork.
Fungsi ini mengendalikan melalui cgroup untuk mengaktifkan atau menonaktifkan, dengan penggunaan dasar sebagai berikut:
echo 1 > <daftar isi cgroup>/memory.async_fork
echo 0 > <daftar isi cgroup>/memory.async_fork
Antarmuka ini memiliki nilai default 0, yaitu defaultnya dimatikan.