Cara yang tepat dalam menafsirkan beban sistem pada prosesor 4 inti 8 benang

13

Seperti yang kita semua tahu, memuat 1,00 pada satu prosesor berarti ada beban 100% . Secara analog, beban 4,00 pada quad core adalah 100% .

Bagaimana cara menafsirkan beban pada prosesor 4 inti 8 benang? Kapan saya mencapai kapasitas maksimum CPU? Pukul 4.00 atau 8.00 ?

Bartek Szablowski
sumber

Jawaban:

17

Tidak pasti, tetapi kebanyakan terus 1.00*n_cpu.

Muatannya berarti sebagai berikut: jika ada beberapa proses pada sistem cpu tunggal, mereka tampaknya berjalan paralel. Tetapi itu tidak benar. Apa yang secara praktis terjadi: kernel memberikan 1/100 detik untuk suatu proses, dan kemudian memecahnya berjalan dengan interupsi. Dan memberikan 1/100 detik berikutnya untuk proses lain.

Praktis pertanyaan, "proses mana yang harus mendapatkan interval 1/100 detik berikutnya?", Akan diputuskan oleh heuristik yang kompleks. Ini dinamai penjadwalan tugas .

Tentu saja, proses yang diblokir, misalnya mereka menunggu data apa yang mereka baca dari disk, dibebaskan dari penjadwalan tugas ini.

Apa yang dimuat mengatakan: berapa banyak proses yang saat ini menunggu kerangka waktu 1/100 detik berikutnya. Tentu saja, itu adalah nilai rata-rata. Ini karena Anda dapat melihat beberapa angka dalam a cat /proc/loadavg.

Situasi dalam sistem multi-cpu sedikit lebih rumit. Ada beberapa CPU, yang kerangka waktunya dapat diberikan untuk beberapa proses. Itu membuat penjadwalan tugas sedikit - tapi tidak terlalu - kompleks. Tetapi situasinya sama.

Kernel cerdas, ia mencoba berbagi sumber daya sistem untuk efisiensi optimal, dan itu sudah dekat dengan itu (ada hal-hal optimasi kecil, misalnya lebih baik jika suatu proses akan dijalankan waktu yang paling lama mungkin pada saat yang sama cpu karena pertimbangan caching, tetapi mereka tidak masalah di sana). Ini karena jika kita memuat 8, itu berarti: sebenarnya ada 8 proses menunggu slice waktu berikutnya. Jika kita memiliki 8 cpus, kita dapat memberikan irisan waktu ini kepada cpus satu-ke-satu, dan dengan demikian sistem kita akan digunakan secara optimal.

Jika Anda melihat a top, Anda dapat melihat bahwa jumlah proses yang berjalan sebenarnya sangat rendah: mereka adalah proses yang ditandai di Rsana. Bahkan pada sistem yang tidak terlalu hardcore sering di bawah 5. Ini sebagian karena proses menunggu data mereka dari disk atau dari jaringan juga ditangguhkan (ditandai dengan Sdi atas). Muatan hanya menunjukkan penggunaan cpu.

Ada alat untuk mengukur beban disk juga, karena mereka seharusnya setidaknya penting sebagai pemantauan penggunaan CPU, tetapi entah bagaimana itu tidak begitu dikenal di sini di dunia sysadmin profesional kami.


Alat Windows sering membagi beban dengan jumlah CPU yang sebenarnya. Hal ini menyebabkan beberapa administrator sistem windows profesional menggunakan beban sistem dalam pengertian dibagi-per-CPU. Mereka tidak benar dan mungkin akan lebih bahagia setelah Anda menjelaskan hal ini kepada mereka.


CPU Multicore praktis adalah beberapa CPU pada chip silikon yang sama. Tidak ada perbedaan.

Dalam kasus CPU hyperthreaded ada efek samping yang menarik: memuat cpu membuat pasangan hyperthreaded lebih lambat. Tetapi ini terjadi pada lapisan yang lebih dalam yang ditangani oleh penjadwalan tugas normal, meskipun itu dapat (dan harus) memengaruhi keputusan pemindahan proses penjadwal.

Tetapi dari sudut pandang kami saat ini - apa yang menentukan beban sistem - tidak masalah juga.

peterh - Pasang kembali Monica
sumber
4

Karena hyperthreading sebenarnya bukan inti ke-2, inti tidak akan pernah mengambil inti hingga 200% tetapi akan melampaui 100% untuk beban kerja tertentu.

Jadi, beban maksimum Anda di suatu tempat tidak diketahui antara sekitar 4 dan 6

(tentu saja ini bisa naik lebih tinggi ketika kelebihan karena itu sebenarnya menghitung proses yang bisa dijalankan, terutama ketika mereka sedang menunggu IO)

JamesRyan
sumber
4

Rata-rata muatan tidak berarti apa yang Anda pikirkan artinya. Ini bukan tentang penggunaan CPU instan, melainkan berapa banyak proses yang menunggu untuk dijalankan. Biasanya itu karena banyak hal menginginkan CPU, tetapi tidak selalu. Penyebab umum adalah proses menunggu IO - disk atau jaringan.

Coba jalankan ps -e vdan cari bendera status proses.

state    The state is given by a sequence of characters, for example, "RWNA". The      first character indicates the run state of the process:
D    Marks a process in disk (or other short term, uninterruptible) wait.
I    Marks a process that is idle (sleeping for longer than about 20 seconds).  
L    Marks a process that is waiting to acquire a lock.
R    Marks a runnable process.
S    Marks a process that is sleeping for less than about 20 seconds.
T    Marks a stopped process.
W    Marks an idle interrupt thread.
Z    Marks a dead process (a "zombie").

Ini dari halaman psmanual, jadi Anda dapat menemukan lebih banyak detail di sana - Rdan Dprosesnya mungkin menarik.

Anda dapat berakhir dengan 'lonjakan' rata-rata beban untuk segala macam alasan, jadi itu bukan ukuran yang baik untuk apa pun selain 'apakah sistem ini sibuk-ish'. Terjebak dalam memetakan rata-rata beban ke inti CPU tidak akan membantu Anda.

Sobrique
sumber
3

Pada sistem Linux, tidak hanya proses dalam antrian runnable yang dihitung untuk menghitung beban, tetapi juga proses dalam kondisi sleep yang tidak terputus, wikipedia , menyebabkan beban melonjak ketika Anda memiliki banyak proses menunggu disk.

przRocco
sumber
Saya tidak tahu itu, akan selalu diingat!
Bartek Szablowski
2

Saya melakukan beberapa percobaan pada sistem Xeon 24-core kami (2 socket x 12 core). Beban maksimum adalah 48.0 dalam hal ini karena cara Linux mengatur hyperthreading.

Namun, Anda tidak mendapatkan yang setara dengan 48 core throughput. Apa yang saya amati adalah bahwa Anda mendapatkan sekitar 90% dari throughput dalam 24 prosesor logis pertama, yaitu jika beban berjalan ke 24.0. Kemudian Anda mendapatkan throughput tambahan sekitar 10% untuk 24 prosesor logis yang tersisa (beban berjalan hingga 48,0). Cara lain untuk berpikir tentang hal itu adalah bahwa jika Anda menjalankan 48 thread pada 24 core, Anda akan mendapatkan dorongan sekitar 10-20% jika Anda mengaktifkan hyperthreading versus tidak. Ini bukan peningkatan 100% seperti yang disiratkan oleh para marketing.

Misalnya, salah satu cara menguji pengamatan ini adalah memiliki proses yang menjalankan 48 utas (katakanlah menggunakan TBB atau model threading handrolled), kemudian jalankan

time numactl --physcpubind=0-23  ./myprocess

dan kemudian jalankan

time numactl --physcpubind=0-47  ./myprocess

Yang terakhir harus berjalan dalam waktu sekitar 10-20% lebih sedikit. Jika proses Anda sangat I / O diblokir, maka hasilnya mungkin berbeda.

Yang pertama akan menonaktifkan hyperthreading dengan hanya membiarkan utas berjalan pada prosesor logis tunggal (dari masing-masing inti), sedangkan yang kedua akan memungkinkan hiperlebar dengan membiarkan utas berjalan pada 2 prosesor logis (dari masing-masing inti).

Beban dalam kedua kasus harus dilaporkan sebagai 48.0 ... yang seperti yang Anda lihat sangat menyesatkan.

Mark Lakata
sumber