Bagaimana cara cgroup berinteraksi dengan proses yang tidak dikelompokkan?

12

Saya memiliki 3 proses pada satu mesin inti. Setiap proses persis sama dan membakar CPU secepat mungkin (loop ketat). Dua di antaranya ( Adan B) diluncurkan dengan cgexec dalam grup terpisah dengan pembagian diatur ke 512 dan 512. Yang ketiga ( C) diluncurkan secara teratur, bukan dengan cgexec.

Setelah semuanya aktif dan berjalan, Cdapatkan 66% dari CPU sementara Adan Bbagi 33%. Jika saya bunuh Cmaka Adan Bdapatkan masing-masing 50% (seperti yang diharapkan).

Mengapa Cmendapat 66%? Saya akan mengharapkan masing-masing 33% dalam skenario ini, atau mungkin 50% (C), 25% (A) dan 25% (B). 66% tidak akan Cberhasil tidak peduli bagaimana saya menghitungnya.

Secara umum, saya ingin memahami bagaimana proses diluncurkan tanpa cgexecberinteraksi dengan proses yang diluncurkan dengan cgexecketika datang ke berbagi sumber daya (CPU pada khususnya, tetapi jawaban yang lebih umum akan dihargai jika tidak terlalu rumit).

Mikha Zoltu
sumber
Pertama-tama, saya bertanya-tanya bagaimana Anda mengukur persentase penggunaan CPU? Apa prioritas Anda menjalankan A, B dan C?
KWubbufetowicz
Saya percaya saya mengukur penggunaan CPU topdan saya percaya mereka dimulai cukup hanya dari prompt perintah: cgexec -g cpu:foo myprogramdan ./myprogram. Sudah lama jadi saya tidak ingat dengan pasti.
Micah Zoltu
Mungkinkah myprogram menggunakan lebih dari satu utas / proses? Btw apakah Anda masih tertarik untuk menyelesaikan masalah ini?
KWubbufetowicz
Program ini adalah aplikasi tes yang ditulis hanya untuk menguji perilaku ini. Itu sengaja berulir tunggal untuk mempersempit hasil. Saya masih tertarik dengan jawaban untuk pertanyaan ini.
Micah Zoltu
Halaman ini dari RedHat dapat membantu di sini. cpu.sharesadalah opsi konfigurasi yang sangat aneh; Saya merekomendasikan pemisahan hal-hal oleh CPU jika memungkinkan menggunakan cpuset.cpussebagai gantinya.
Wildcard

Jawaban:

3

Cgroup bersifat hierarkis dan diwariskan oleh semua subproses. Jadi semua proses harus dalam beberapa cgroup. Secara default itu adalah root cgroup dan secara default ia memiliki 1024 saham yang dua kali lipat A dan B dalam contoh Anda.

Waktu CPU dibagi antara kelompok berdasarkan berat yang diberikan kepada mereka di cpu.shares.

Jika A memiliki 1024 saham dan B 512 dan C 256 dan D 256, distribusi waktu cpu adalah A - 50%, B - 25%, C dan D 12,5%.

Lazy404
sumber
Jadi setiap proses yang tidak diluncurkan dengan cgexec ada di root cgroup dengan 1024 saham, dibagi secara merata di antara semua anak langsung. Salah satu anak langsung tersebut adalah cgroup yang dihasilkan oleh panggilan cgexec. Jadi non- cgexecproses akan mendapatkan 50% dan proses yang dikelompokkan akan berbagi 50% sisanya. Dalam proses cgrouped mereka berbagi 50% secara merata, yang berarti keduanya mendapatkan 25%. Ini masuk akal, tetapi itu bukan perilaku yang saya amati. Apa yang saya lihat adalah 66%, 33% dan 33%. Bisakah Anda memperbarui jawaban untuk memasukkan lebih banyak detail dan mungkin contoh distribusi?
Micah Zoltu
Oh, kurasa begitu. Setiap proses pada OS yang diluncurkan tanpa cgexecmendapat 1024 saham. Setiap proses yang diluncurkan dengan cgexecmendapatkan bagian yang ditentukan. Jadi dalam hal ini, satu proses mendapat 1024 saham dan dua lainnya mendapatkan masing-masing 512, sehingga distribusi yang saya lihat. Maukah Anda memperbarui jawaban Anda untuk memberikan sedikit kejelasan, misalnya, dengan contoh?
Micah Zoltu
Sebenarnya, itu masih belum sesuai. 1024 + 512 + 512 = 2048. 512/2048 == 25%. Saya tidak percaya jawaban ini benar, paling tidak di permukaan.
Micah Zoltu
apakah Anda memiliki cgroup lain? Ini mungkin mempengaruhi angka. Anda juga dapat memeriksa dokumen redhat, ada contoh serupa access.redhat.com/documentation/en-US/Red_Hat_Enterprise_Linux/…
Lazy404
Tidak ada hal lain yang berjalan signifikan, kotak itu menganggur sebelum dan sesudah uji coba. Semua contoh hanya menunjukkan apa yang terjadi ketika semua proses dimulai dengan pengaturan cgroup. Itu tidak membahas apa yang terjadi ketika beberapa proses tidak menggunakan cgroup, yang saya coba cari tahu.
Micah Zoltu