Hanya menggunakan satu inti cpu

9

Saya perlu menjalankan tes kinerja untuk program bersamaan saya dan persyaratan saya adalah bahwa itu harus dijalankan hanya pada satu inti CPU. (Saya tidak ingin utas kooperatif - Saya ingin selalu memiliki pengalihan konteks).

Jadi saya punya dua pertanyaan:

  1. Solusi terbaik - Cara masuk dan cadangan hanya satu inti CPU saja untuk program saya (untuk memaksa OS untuk tidak menggunakan inti CPU ini). Saya kira itu tidak mungkin tapi mungkin saya salah ...

  2. Bagaimana cara mengatur linux (Fedora 24) agar hanya menggunakan satu inti CPU?

peter55555
sumber
Lihat ini .
Kamil Maciorowski
1
Perhatikan bahwa CPU modern dapat mengubah kecepatannya tergantung pada berapa banyak inti yang digunakan secara total. Bahkan jika Anda memastikan bahwa proses Anda hanya menggunakan inti tunggal dan tidak ada proses lain yang menggunakannya, kecepatan inti itu akan berbeda tergantung pada bagaimana sistem operasi akan menggunakan inti lainnya. Pertimbangkan ini saat menjalankan tes Anda.
liori
Anda harus dapat menonaktifkan core CPU dari BIOS, mungkin lebih dapat diandalkan untuk pengujian Anda karena @liori menyatakan di atas bahwa OS dapat mengubah kecepatan inti.
Marcs
Bagaimana dengan membuat VM dan hanya menetapkan satu inti untuk itu? Oh, saya baru saja membaca "untuk tidak menggunakan inti CPU ini" jadi tidak apa-apa ...
sakisk

Jawaban:

26

Di linux, panggilan sistem untuk mengatur afinitas CPU untuk suatu proses adalah sched_setaffinity. Lalu ada tasksetalat untuk melakukannya di baris perintah.

Agar program tunggal itu berjalan hanya pada satu CPU, saya pikir Anda ingin sesuatu seperti

taskset -c 1 ./myprogram

(setel nomor CPU apa pun sebagai argumen ke -csakelar.)

Itu harus cukup dekat dengan sistem prosesor tunggal, selama proses Anda yang lain tidak berjalan terlalu banyak dibandingkan dengan yang ingin Anda ukur, atau mereka dijadwalkan untuk CPU lain. Jika Anda ingin mendedikasikan satu CPU untuk proses tunggal itu saja , dan mencegah proses lain dari berjalan pada CPU itu, Anda perlu mengatur afinitas mereka juga.

Itu, saya tidak tahu bagaimana melakukannya dengan benar. Anda harus mengatur afinitas prosesor initsejak awal dalam proses boot untuk memastikan itu diwarisi untuk semua proses pada sistem. Sebagai solusinya, Anda bisa menggunakan taskset -c -p 0 $PIDuntuk semua proses lain untuk memaksa mereka berjalan pada CPU # 0 saja.

systemd juga memilikiCPUAffinity= untuk mengontrol afinitas dalam file Unit dan ada beberapa dari pertanyaan tentang pengaturan afinitas bawaan di sini di unix.SE, tapi saya tidak menemukan apapun dengan solusi yang baik.

Meskipun ketika @Kamil Maciorowski berkomentar dan menjawab pertanyaan lain di superuser.com , pengaturan isolcpus=1 pada baris perintah kernel harus "mengisolasi CPU dari algoritma penjadwalan umum", yang merupakan sesuatu yang mungkin Anda inginkan.

ilkkachu
sumber
Ini tidak cukup menjawab pertanyaan. Sementara tasket (atau metode lain dalam menetapkan afinitas tugas) akan memastikan bahwa suatu proses hanya berjalan pada set core yang ditentukan, itu tidak akan menjamin bahwa hanya proses itu yang akan berjalan pada core tersebut. Dengan kata lain, sistem operasi dapat menjadwalkan proses-proses lain ke inti yang telah Anda atur afinitas proses Anda. Dalam praktiknya, ini adalah jawaban yang paling berguna, tetapi perhatikan batasannya, dan khususnya waspadai bahwa itu tidak memberikan apa yang Anda minta dalam 1) "cadangan hanya satu inti cpu hanya untuk program saya (untuk memaksa OS untuk tidak menggunakan inti cpu ini) "
James Greenhalgh
@ JamesGreenhalgh, tetapi, menemukan cara untuk mengatur afinitas CPU untuk setiap proses akan menjawab pertanyaan. Apakah mungkin untuk menetapkan afinitas cpu default untuk proses baru, sebagai opsi kernel (cmd line)? Itu akan berlaku di awal proses boot, dan memengaruhi semua proses.
jpaugh
Saya benar-benar merindukan klausa dalam tanda kurung tentang mencegah proses lain dari berjalan pada CPU itu. Atau mungkin saya pikir masalah terbesar adalah memastikan bahwa program yang dimaksud hanya berjalan pada satu inti, alih-alih mengatakan, empat, dan bahwa proses lainnya dapat dianggap sebagai gangguan, yang tidak akan menjadi masalah banyak dibandingkan dengan itu. Tapi saya akui, saya tidak punya jawaban yang tepat untuk bagian dari pertanyaan itu, terlepas dari apa yang Kamil komentari sekarang.
ilkkachu
@ jpaugh, saya pikir meskipun begitu Anda tidak akan dapat sepenuhnya mengisolasi diri dari kemungkinan proses lain yang dijalankan pada inti "Anda". Misalnya, yang mengatur ulang afinitasnya sendiri, atau bahkan kode kernel sendiri memakan waktu yang tidak terkait dengan pengelolaan proses Anda. Sekali lagi, saya sepenuhnya setuju bahwa dalam praktiknya, jawaban ini adalah apa yang akan dilakukan kebanyakan orang untuk menyelesaikan sebagian besar masalah, tetapi saya akan sangat tertarik membaca jawaban untuk bagian terakhir dalam tanda kurung!
James Greenhalgh