
Adalah masuk akal untuk berasumsi bahwa untuk kernel akan sangat mudah untuk tidak melakukan apa pun - tetapi tidak. Pada konferensi
Resep Kernel 2018 ,
Rafael Vysotsky berbicara tentang apa yang prosesor lakukan, ketika mereka tidak melakukan apa-apa, bagaimana kernel memprosesnya, apa strategi saat ini, dan bagaimana kerjanya saat ini pada
siklus idle telah meningkatkan situasi energi sistem yang tidak melakukan apa-apa. .
Siklus tidak aktif, salah satu subsistem kernel yang didukung Vysotsky, mengontrol apa yang CPU lakukan ketika tidak perlu menjalankan proses apa pun. Vysotsky sangat akurat memberikan semua definisi: CPU adalah entitas yang dapat menerima instruksi dari memori dan menjalankannya secara bersamaan dengan entitas lain dalam sistem yang sama yang menangani hal yang sama. Pada sistem prosesor tunggal paling sederhana dengan satu inti, inti ini adalah CPU. Jika prosesor memiliki beberapa core, maka masing-masing core ini adalah CPU. Jika masing-masing inti memiliki beberapa antarmuka untuk menjalankan instruksi secara bersamaan - Intel menyebut sistem semacam itu "
hyperthreading " - maka masing-masing inti ini adalah CPU.
CPU menganggur ketika tidak memiliki tugas untuk dilakukan. Atau, lebih tepatnya, kernel Linux memiliki beberapa kelas internal untuk pengiriman, salah satunya adalah kelas idle khusus. Jika tidak ada tugas pada CPU ini di salah satu kelas, kecuali untuk kelas tidak aktif, maka CPU dianggap tidak aktif. Jika peralatan tidak memungkinkan ini, maka CPU harus melakukan instruksi yang tidak berguna sampai pekerjaan yang sebenarnya muncul. Namun, ini adalah penggunaan listrik yang sangat tidak efisien, itulah sebabnya sebagian besar prosesor mendukung beberapa negara berenergi rendah ke mana inti mentransfernya sampai mereka diperlukan untuk melakukan pekerjaan yang bermanfaat.
Anda tidak bisa hanya masuk atau keluar dari keadaan tidak bertindak. Dibutuhkan waktu untuk masuk dan keluar, dan di samping itu, ketika Anda memasuki kondisi ini, konsumsi daya dari kondisi saat ini sedikit meningkat, dan ketika Anda keluar, ia menghabiskan kondisi prosesor. Dan meskipun semakin dalam keadaan tidak aktif, semakin sedikit energi yang dikonsumsi prosesor, biaya masuk dan keluar ke keadaan tersebut meningkat. Ini berarti bahwa dalam kasus tidak aktif dalam waktu singkat, penggunaan terbaik sumber daya komputer akan menjadi tidak bertindak; untuk periode yang lebih lama, biaya pindah ke keadaan tidak aktif yang lebih dalam akan dibenarkan oleh peningkatan jumlah energi yang dihemat. Oleh karena itu, kepentingan kernel untuk memprediksi berapa lama prosesor akan diam sebelum memutuskan seberapa dalam keadaan tidak aktif yang dibutuhkannya. Ini adalah tugas dari siklus tidak bertindak.
Dalam siklus ini, penjadwal memperhatikan bahwa CPU dalam kondisi menganggur, karena tidak memiliki tugas yang dapat ditugaskan padanya. Kemudian scheduler memanggil regulator, yang mencoba memberikan prediksi terbaik dari keadaan tidak aktif yang sesuai, yang dapat Anda masukkan. Sekarang di kernel ada dua kontrol, menu dan tangga. Mereka digunakan dalam kasus yang berbeda, tetapi keduanya mencoba melakukan kira-kira hal yang sama: untuk memantau keadaan sistem ketika CPU masuk ke keadaan siaga dan waktu yang dihabiskan dalam keadaan tidak aktif. Hal ini dilakukan untuk memprediksi berapa lama CPU akan masuk ke keadaan tidak aktif di dalamnya, dan, oleh karena itu, negara mana yang paling cocok untuk situasi ini.
Pekerjaan ini sangat rumit oleh timer scheduler CPU. Penjadwal memulai timer ini untuk membagi waktu akses ke CPU: jika beberapa tugas perlu dilakukan pada satu prosesor, masing-masing dari mereka dapat dilakukan hanya sedikit, dan kemudian secara berkala ditunda demi tugas lain. Penghitung waktu ini tidak perlu dilakukan pada CPU idle, karena tidak ada tugas di mana CPU perlu dibagi. Selain itu, jika timer dibiarkan berjalan pada CPU idle, ini akan mencegah pengontrol memilih kondisi deep idle, membatasi interval di mana CPU idle. Oleh karena itu, dalam kernel hingga 4,16, scheduler mematikan timer sebelum memanggil regulator. Ketika CPU terbangun setelah gangguan, scheduler memutuskan apakah ada tugas yang diperlukan untuk eksekusi dan, jika ada, restart timer.
Jika controller memprediksi periode tidak aktif yang lama, dan periode ini benar-benar berubah menjadi lama, maka controller "menang": CPU masuk ke kondisi tidak aktif yang dalam, dan energi disimpan. Tetapi jika regulator memprediksi periode tidak aktif yang lama, dan periode ini ternyata pendek, maka regulator “kehilangan”, karena biaya untuk tidak melakukan tindakan tidak membayar dengan menghemat energi untuk periode tidak aktif yang singkat. Lebih buruk lagi, ketika regulator memperkirakan waktu henti singkat, maka ia “kehilangan” terlepas dari waktu henti: jika periode tersebut ternyata panjang, ia kehilangan kesempatan untuk menabung, dan jika pendek, biaya untuk menghentikan dan memulai kembali penghitung waktu terbuang sia-sia. Atau, dengan kata lain, karena sumber daya dihabiskan untuk menghentikan dan memulai pengatur waktu, tidak masuk akal untuk menghentikannya ketika pengontrol memperkirakan waktu henti singkat.
Vysotsky memutuskan untuk mencoba mengubah operasi regulator, tetapi sampai pada kesimpulan bahwa masalah utama adalah timer dihentikan sebelum regulator dipanggil, yaitu, sebelum keadaan tidak aktif yang direkomendasikan diketahui. Dia mengembalikan siklus idle di kernel 4.17 sehingga keputusan untuk menghentikan timer dibuat setelah regulator membuat rekomendasinya. Jika dia memperkirakan downtime yang lama, timer berhenti sehingga tidak membangunkan CPU sebelumnya. Jika downtime dianggap pendek, timer dibiarkan untuk menghindari pemborosan sumber daya pada saat shutdown. Ini berarti timer juga melakukan fungsi keamanan, membangkitkan CPU, jika waktu henti ternyata lebih lama dari yang diperkirakan, dan memberi regulator kesempatan kedua untuk keputusan yang tepat.
Ketika CPU menganggur terbangun melalui interupsi, apakah itu penghitung waktu yang tak terhentikan atau peristiwa lainnya, penjadwal segera membuat keputusan tentang ketersediaan pekerjaan. Jika ada pekerjaan, timer akan dihidupkan ulang seperlunya. Jika tidak, pengontrol disebut. Karena ini berarti bahwa regulator sekarang dapat dipanggil ketika timer bekerja dan ketika tidak berfungsi, regulator harus dipanggil untuk mempertimbangkan hal ini.
Setelah mempelajari daftar kemenangan dan kekalahan, Vysotsky percaya bahwa perubahannya akan meningkatkan gambaran. Dalam hal memprediksi periode tidak aktif yang lama, timer masih berhenti, jadi tidak ada yang berubah di sini; kita menang jika downtime panjang, dan kita kalah jika pendek. Tetapi jika waktu penghentian yang pendek diprediksi, kami menang: jika periode itu benar-benar singkat, kami akan menghemat waktu berhenti dan memulai penghitung waktu, dan jika lama, penghitung waktu yang tidak terhenti akan membangunkan kami dan memberi kami kesempatan untuk membuat prediksi lain.

Karena teori permainan tidak dapat berfungsi sebagai pengganti yang lengkap untuk situasi nyata, Vysotsky menguji pendekatan ini pada banyak sistem. Grafik di atas khas untuk semua sistem yang diuji; ini menunjukkan ketergantungan waktu konsumsi daya pada sistem idle. Garis hijau adalah siklus kelambanan yang lama, garis merah adalah yang baru. Menurut skema baru, lebih sedikit energi yang dikonsumsi, selain itu, lebih dapat diprediksi. Tidak semua CPU yang diuji memiliki celah besar di antara garis, namun semuanya menunjukkan garis merah datar di bawah warna hijau yang tidak rata. Seperti yang dikatakan Vysotsky, skema baru ini lebih kecil kemungkinannya untuk memprediksi periode tidak aktif yang pendek, tetapi lebih sering ternyata benar tentang durasi singkat mereka.
Menjawab pertanyaan dari hadirin, Vysotsky mengatakan bahwa pekerjaan ini tergantung pada arsitektur. Khususnya, prosesor Intel akan mendapat manfaat darinya, karena mereka memiliki sejumlah besar status tidak aktif yang dapat digunakan regulator untuk memilih yang akan memberikan peluang keberhasilan terbaik jika prediksi tersebut benar; tetapi prosesor ARM juga akan mendapat manfaat dari sirkuit baru.
Penurunan konsumsi daya 20% saat idle mungkin tampak seperti pencapaian yang tidak signifikan, tetapi sebenarnya tidak. Sistem apa pun yang ingin mengatasi beban puncak dengan baik harus memiliki cadangan daya dalam mode normal, yang akan memanifestasikan dirinya selama tidak aktif. Grafik di atas menunjukkan penggunaan prosesor untuk tahun ini di server saya, yang berkaitan dengan surat, transfer file, VPN, NTP, dll. Kuning berarti waktu yang sederhana. Hemat 20% dari energi ini akan disukai oleh penyedia saya, dan untuk planet ini akan lebih baik.