Bagaimana cara membatasi jumlah inti CPU yang dapat digunakan setiap pengguna?

18

Kami memiliki komputer yang CPU-nya memiliki 32 core dan akan digunakan untuk menjalankan program oleh beberapa pengguna yang berbeda. Apakah ada cara untuk membatasi jumlah core yang dapat digunakan setiap pengguna setiap saat sehingga satu pengguna tidak akan memonopoli semua daya CPU?

Reza
sumber
5
Bukan jawaban, hanya sebuah ide. Anda mungkin ingin melihat ke pengaturan beberapa mesin virtual. Masing-masing hanya dapat memiliki jumlah CPU-s yang terbatas. Setiap pengguna hanya akan berada di salah satu mesin virtual, dan pengguna di VM itu akan terbatas dalam penggunaan CPU. Mungkin beberapa perangkat lunak virtualisasi memiliki alat untuk mendukung ini.
ghellquist
1
@ ghellquist, Anda harus menjawabnya
slebetman
@ ghellquist: Anda mungkin menginginkan sesuatu yang seringan mungkin, seperti wadah Linux, jika Anda hanya ingin pengguna yang berbeda hanya melihat beberapa CPU. (mis. jadi ketika mereka memulai OpenMP atau program lain yang memulai banyak utas seperti yang dilihat core, itu akan memulai angka yang sesuai untuk jumlah core yang Anda biarkan digunakan oleh setiap pengguna). Virtualisasi penuh, seperti KVM, memiliki biaya kinerja bahkan dengan dukungan perangkat keras seperti VT-X atau AMD-V, dari level tambahan tabel halaman bahkan ketika VM keluar, dalam kode yang membuat setiap TLB kehilangan kesempatan untuk menyentuh banyak memori.
Peter Cordes
Maaf, tetapi apakah ada kebutuhan untuk ini? Sebagai sistem multi-pengguna, Linux secara default sudah menerapkan preemptive multitasking, sehingga situasi di mana satu pengguna (non-jahat) hanya memonopoli seluruh sistem untuk diri mereka sendiri seharusnya tidak muncul.
Cubic

Jawaban:

16

Meskipun ini mungkin , itu rumit dan hampir pasti merupakan ide yang buruk. Jika hanya satu pengguna yang menggunakan mesin saat ini, membatasi mereka ke core N adalah pemborosan sumber daya. Pendekatan yang jauh lebih baik adalah menjalankan semuanya dengan nice:

NAME
       nice - run a program with modified scheduling priority

SYNOPSIS
       nice [OPTION] [COMMAND [ARG]...]

DESCRIPTION
       Run  COMMAND  with an adjusted niceness, which affects process scheduling.  With
       no COMMAND, print the current niceness.  Niceness values range  from  -20  (most
       favorable to the process) to 19 (least favorable to the process).

Ini adalah alat yang hebat yang menetapkan prioritas suatu proses. Jadi, jika hanya satu pengguna yang menjalankan sesuatu, mereka akan mendapatkan waktu CPU sebanyak yang mereka butuhkan, tetapi jika orang lain meluncurkan pekerjaan mereka sendiri (juga rasa), mereka akan baik dan berbagi satu sama lain. Dengan begitu, jika semua pengguna Anda menjalankan perintah nice 10 command, tidak ada yang akan memonopoli sumber daya (dan tidak ada yang akan membuat server bertekuk lutut).

Perhatikan bahwa nilai bagus yang tinggi berarti prioritas rendah. Ini adalah ukuran seberapa baik kita seharusnya dan semakin bagus kita, semakin banyak kita berbagi.

Perhatikan juga bahwa ini tidak akan membantu mengatur alokasi memori, itu hanya memengaruhi penjadwalan CPU. Jadi, jika banyak pengguna meluncurkan beberapa proses intensif-memori, Anda masih akan mengalami masalah. Jika itu masalah, Anda harus melihat sistem antrian yang tepat seperti torsi .

terdon
sumber
Terima kasih atas jawaban anda. Ada beberapa "manajer beban kerja" seperti SLURM tetapi mereka untuk komputer dengan banyak node. Saya kira masuk akal bahwa orang belum mengembangkan aplikasi serupa untuk komputer node tunggal karena tidak ada banyak permintaan.
Reza
@Reza coba nice, dari apa yang Anda jelaskan, itu persis seperti yang Anda butuhkan.
terdon
3
@ Reza: Itu karena OS sudah melakukan itu. Secara otomatis membagi waktu CPU yang tersedia untuk utas / proses sesuai kebutuhan.
BlueRaja - Danny Pflughoeft
13

TL; DR : Dari penelitian singkat, tampaknya ada kemungkinan untuk membatasi perintah pada jumlah inti tertentu, namun dalam semua kasus Anda harus menggunakan perintah yang benar-benar memberlakukan pembatasan.

cgroups

Linux memiliki cgroupsyang sering digunakan tepat untuk tujuan membatasi sumber daya yang tersedia untuk proses. Dari penelitian yang sangat singkat, Anda dapat menemukan contoh di Arch Wiki dengan konfigurasi Matlab (perangkat lunak ilmiah) yang diatur dalam /etc/cgconfig.conf:

group matlab {
    perm {
        admin {
            uid = username;
        }
        task {
            uid = username;
        }
    }

    cpuset {
        cpuset.mems="0";
        cpuset.cpus="0-5";
    }
    memory {
        memory.limit_in_bytes = 5000000000;
    }
}

Agar konfigurasi tersebut berlaku, Anda harus menjalankan proses melalui cgexecperintah, misalnya dari halaman wiki yang sama:

$ cgexec -g memory,cpuset:matlab /opt/MATLAB/2012b/bin/matlab -desktop

tasket

Sebuah pertanyaan terkait tentang Tanyakan pada Ubuntu dan Bagaimana cara membatasi proses untuk satu inti CPU di Linux? [duplikat] di situs Unix & Linux menunjukkan contoh penggunaan tasksetuntuk membatasi CPU untuk proses. Pada pertanyaan pertama, itu dicapai melalui penguraian semua proses untuk pengguna tertentu

$ ps aux | awk '/^housezet/{print $2}' | xargs -l taskset -p 0x00000001

Dalam pertanyaan lain, proses dimulai dengan tasksetsendirinya:

$ taskset -c 0 mycommand --option  # start a command with the given affinity

Kesimpulan

Meskipun dimungkinkan untuk membatasi proses, tampaknya tidak mudah untuk mencapai hal itu bagi pengguna tertentu. Contoh di posting Ask Ubuntu yang tertaut akan membutuhkan pemindaian yang konsisten untuk proses yang dimiliki oleh setiap pengguna dan digunakan tasksetpada setiap yang baru. Pendekatan yang jauh lebih masuk akal adalah dengan menjalankan aplikasi intensif CPU secara selektif, baik melalui cgexecatau taskset; tidak masuk akal untuk membatasi semua proses pada jumlah CPUS tertentu, terutama bagi mereka yang benar-benar memanfaatkan paralelisme dan konkurensi untuk menjalankan tugas mereka lebih cepat - membatasi mereka ke jumlah CPU tertentu dapat memiliki efek memperlambat pemrosesan. Selain itu, seperti jawaban terdon yang disebutkan itu adalah pemborosan sumber daya

Menjalankan aplikasi tertentu melalui tasksetatau cgexecmembutuhkan komunikasi dengan pengguna Anda untuk memberi tahu mereka aplikasi apa yang dapat mereka jalankan, atau membuat skrip wrapper yang akan meluncurkan aplikasi tertentu melalui taskselatau cgexec.

Selain itu, pertimbangkan pengaturan jumlah proses yang dapat ditelurkan oleh pengguna atau grup alih-alih menetapkan batas jumlah CPU. Ini dapat dicapai melalui /etc/security/limits.conffile .

Lihat juga

Sergiy Kolodyazhnyy
sumber
1
baik, ada cgrulesengd dan cgrules.conf untuk secara otomatis memindahkan proses ke cgroup yang sesuai berdasarkan pengguna / grup alih-alih mengandalkan pengguna yang menjalankan proses mereka dengan cgexec. Tapi sepertinya, pengaturan ini di ubuntu agak tidak sepele.
Hans-Jakob
@ Hans-Jakob Kelihatannya agak berbelit-belit, ditambah membutuhkan penambahan flag kernel di GRUB. Mungkin untuk mesin tingkat perusahaan, di mana Anda memiliki banyak pengguna dan tidak ingin mereka merusak sistem, itu mungkin bermanfaat, tetapi untuk desktop - terlalu banyak pekerjaan. Terima kasih telah menghubungkannya.
Sergiy Kolodyazhnyy
2
sched_setaffinity(2)kata topeng afinitas terpelihara di seluruh execve(2), dan bahwa seorang anak mewarisinya fork(2). Jadi jika Anda tasket shell untuk pengguna (atau shell grafis mereka untuk sesi X), semua yang mereka mulai dari shell itu akan, secara default, menggunakan topeng afinitas yang sama.
Peter Cordes
1
Satu kelemahan yang mungkin terjadi adalah program yang memeriksa berapa banyak CPU yang dimiliki mesin ketika memutuskan berapa banyak utas untuk memulai; mereka akan memiliki terlalu banyak utas untuk jumlah inti yang akan mereka jadwalkan. Apakah Anda mencari tahu apakah cgroup mungkin melakukan sesuatu tentang itu?
Peter Cordes
@PeterCordes Gagasan pemijahan shell terdengar menarik. Saya perlu melihatnya. Terima kasih! Adapun komentar kedua, tidak, saya belum cukup meneliti cgroup pada saat ini.
Sergiy Kolodyazhnyy