Gunakan case untuk memiliki prioritas proses yang berbeda untuk CPU dan IO?

9

Proses Linux dapat memiliki prioritas CPU dan IO yang berbeda (baik dan ionis).

Mengapa ada kebutuhan untuk memiliki prioritas CPU dan IO yang berbeda?

Apakah ada penggunaan dunia nyata untuk membuatnya berbeda?

Kasus penggunaan dunia nyata apa yang Anda temukan yang membutuhkan prioritas CPU dan IO yang berbeda? Suka lebih tinggi dari prioritas CPU tetapi lebih rendah dari prioritas IO normal atau sebaliknya.

Eduardo
sumber

Jawaban:

6

Perilaku default 'nice' adalah untuk menyesuaikan prioritas aplikasi 'io' juga ketika perubahan kebaikan.

Semuanya tentu saja tergantung pada beban kerja Anda, tetapi salah satu aspek utama dari setiap sistem operasi adalah bagaimana ia mengalokasikan sumber dayanya, dan bagaimana ia menangani pertengkaran .

Sebenarnya penting untuk memahami apa yang dilakukan kebaikan karena ketika di bawah beban dari proses yang bersaing cara sistem operasi berperilaku dapat berdampak pada sisa beban kerja Anda.

Contention adalah ukuran bagaimana berbagai aplikasi bersaing untuk sumber daya yang sama (seperti CPU).

Menangani Beban

Sejak penjadwal yang sepenuhnya adil diperkenalkan, nice hanyalah tampilan akhir dari klausa 'berat' dari setiap proses. Yang bisa dilihat di proc.

$ cat /proc/self/sched
---------------------------------------------------------
...
se.load.weight                     :                 1024
...

Mengubah kebaikan hanya mengubah berat:

$ nice -n 5 cat /proc/self/sched 
---------------------------------------------------------
...
se.load.weight                     :                 335
...

Ukuran untuk pertikaian CPU dilakukan oleh algoritma penjadwalan yang sepenuhnya adil. Setiap aplikasi diberi nilai 'bobot' dan dalam kasus waktu CPU yang bersaing maka waktu dibagi antara proses dengan menjumlahkan semua pemrosesan yang bersaing untuk waktu CPU dan menetapkan waktu CPU denominasi umum terendah berdasarkan dari nilai bobotnya.

Jika saya memiliki 3 aplikasi yang semuanya ingin menggunakan waktu CPU, secara default mereka menerima 1024 sebagai berat normal. Jika saya memiliki satu proses dengan +5 bagus seperti di atas, ketiga bobot akan berjumlah 2383, maka proses niced akan menerima sekitar 15% dari waktu cpu dalam detik yang diberikan jika ketiga proses meminta CPU di detik itu .

Mengapa ada kebutuhan untuk memiliki prioritas CPU dan IO yang berbeda?

Kejujuran benar-benar hanya bermain dengan apa yang harus dilakukan ketika sistem berada di bawah beban, yaitu - bagaimana sistem operasi memotong waktu antara proses yang bersaing sebagaimana didefinisikan oleh faktor apa pun yang diperlukan.

Bagaimana hal ini memengaruhi Anda atau relevan bagi Anda terikat oleh apa yang dimiliki oleh berbagai aplikasi pengiriman yang berbeda satu sama lain dan waktu untuk menyampaikan setiap aplikasi harus memiliki.

Keunikan benar-benar hanya melakukan sesuatu ketika sistem Anda sedang di bawah beban (ada lebih banyak hal yang ingin diperhatikan daripada CPU atau Disk dapat menangani). Ini hanya menginstruksikan kernel bagaimana mengalokasikan sumber daya dalam keadaan seperti itu.

Apakah ada penggunaan dunia nyata untuk membuatnya berbeda?

Jika Anda memiliki banyak proses atau pekerjaan yang bersaing untuk dilakukan yang lebih dari yang dapat dilakukan oleh CPU, kebaikan memberi Anda beberapa jaminan yang relatif stabil untuk apa pekerjaan selesai terlebih dahulu. Ini mungkin penting bagi Anda jika Anda mengatakan membuat laporan yang harus dikirim sebelum laporan lain selesai.

Pada sistem desktop, kebaikan bisa lebih penting. Aplikasi tertentu memiliki perilaku waktu-nyata di mana aplikasi tersebut lebih sering dibangun selama pemuatan mencegah data menjadi usang. Pulseaudio termasuk dalam kategori ini misalnya.

Aplikasi lain mungkin diperlukan untuk mengeluarkan pekerjaan untuk aplikasi tergantung. Misalnya banyak permintaan apache untuk mengatakan server SQL seperti MySQL dapat memblokir untuk jangka waktu yang lama karena SQL tidak melayani dengan cukup cepat karena - katakanlah beberapa laporan lain bersaing untuk waktu CPU. Jadi tidak hanya SQL yang macet tetapi juga Apache. SQL dapat merugikan di sini kadang-kadang karena biasanya ada jauh lebih sedikit thread pekerja daripada thread apache bersaing sebagai kelompok untuk ditimbang lebih baik oleh penjadwal, sehingga memberikan lebih banyak waktu CPU untuk SQL meratakan semuanya.

UpdateDB (sebuah program yang mengindeks file) berjalan larut malam dan sangat berat disk. Mungkin bermanfaat untuk mengurangi prioritas penjadwalan IO-nya sehingga aplikasi lain pada saat itu mendapatkan prioritas di atas sesuatu yang tidak sepenting urutan hal-hal tersebut.

Kasus penggunaan dunia nyata apa yang Anda temukan yang membutuhkan prioritas CPU dan IO yang berbeda?

Sangat sedikit. Keadilan terlalu banyak merupakan pendekatan upaya terbaik. Sebagai aturan praktis, saya kurang peduli tentang seberapa baik kinerja aplikasi dan lebih pada seberapa buruk mereka dapat melakukan. Ini mungkin terdengar mundur pada awalnya tetapi saya memiliki jaminan pengiriman layanan untuk bertemu yang lebih penting bagi saya.

Saya ingin kepercayaan diri mengatakan "barang Anda bahkan pada hari yang buruk akan dilakukan dalam periode waktu X". Jika berjalan lebih cepat, itu hanya bonus.

Saya biasanya akan memulai dengan menghasilkan spesifikasi yang disetujui seperti:

  • Semua aplikasi web dijamin untuk menyelesaikan permintaan dalam 0,3 detik.
  • Semua permintaan SQL pada suatu sistem dijamin akan selesai dalam 0,1 detik.
  • Aplikasi web harus menangani tidak lebih dari 50 IOPS dan memberikan file 1k.
  • Jejak memori aplikasi web tidak lebih tinggi dari 250 MB.

Dan menarik persyaratan untuk memenuhi seperti:

  • Semua permintaan web harus diselesaikan dalam 0,05 detik.
  • Semua permintaan SQL harus diselesaikan dalam 0,02 detik.
  • Harus ada memori yang cukup untuk menangani semua permintaan.
  • Persyaratan IO harus dipenuhi.

Memberikan spesifikasi yang benar, saya kemudian memenuhi tujuan ini tanpa melakukan virtualisasi, menggunakan pendekatan yang jauh lebih efisien dari kelompok kontrol.

Grup kontrol memungkinkan saya membuat jaminan tingkat layanan yang cukup andal untuk alokasi sumber daya asalkan aplikasi berperilaku dalam batas yang ditentukan. Ini berarti bahwa bahkan pada sistem yang sedang dimuat saya dapat menjamin ketersediaan sumber daya untuk aplikasi yang dimaksud dan menjamin ruang untuk aplikasi lain pada kotak yang sama!

Jika kami mengambil contoh CPU dan IO Anda. Saya menetapkan batas yang memenuhi persyaratan tersebut:

# cd /sys/fs/cgroup/blkio/apache
# echo "253:0 100" >blkio.throttle.read_iops_device 
# echo "253:0 50" >blkio.throttle.write_iops_device 
# echo "253:0 102400" >blkio.throttle.read_bps_device

Jadi 100k byte untuk membaca 100 iops.

# cd /sys/fs/cgroup/cpu/apache
# echo 1000000 >cpu.cfs_period_us
# echo 60000 >cpu.cfs_quota_us 

Dari periode waktu 1 detik, berikan CPU 0,06 detik.

# cd /sys/fs/cgroup/cpu/sql
# echo 1000000 >cpu.cfs_period_us
# echo 20000 >cpu.cfs_quota_us

Dari periode waktu 1 detik, berikan CPU 0,02 detik.

Menyediakan cgroup lain yang bersaing tidak melakukan hal yang konyol, menjadi beban kurang dari faktor dalam pengiriman layanan saya karena saya tahu bagaimana CPU sedang dilemparkan tentang untuk setiap aplikasi.

Kelompok kontrol dari sifat ini masih merupakan upaya terbaik tetapi mereka menawarkan jauh lebih banyak kontrol pada upaya itu daripada kebaikan dan ionisasi.

Matthew Ife
sumber
Saya bertanya tentang kebutuhan prioritas CPU dan IO yang berbeda. Anda mengatakan bahwa ada "sangat sedikit" kasus penggunaan di mana Anda menemukan kebutuhan untuk memiliki prioritas CPU dan IO yang berbeda. Bisakah Anda referensi mereka?
Eduardo