Menentukan prosesor tertentu di mana suatu proses sedang berjalan

10

Saya memiliki akses ke simpul 8-inti dari cluster Linux. Ketika masuk ke node, saya bisa melihat daftar prosesor menggunakan perintah ini:

more /proc/cpuinfo

Dalam simpul 8-core saya, prosesor diberi nomor dari 0 hingga 7. Setiap prosesor adalah CPU Intel Xeon (E5430 @ 2.66GHz).

Sekarang anggaplah saya memanggil program foodengan beberapa argumen args:

foo args

Program ini foomembutuhkan waktu lama untuk dieksekusi (jam atau hari, misalnya). Setelah dipanggil foo, apakah mungkin untuk menentukan prosesor tertentu (yaitu, 0 hingga 7) yang foosedang berjalan? The topProgram acara saya proses ID dan informasi serupa, tapi saya tidak melihat prosesor nomor . Apakah informasi tersebut tersedia?

Andrew
sumber
1
Kecuali Anda telah melakukan sesuatu yang spesifik, proses tidak akan tetap pada CPU yang sama sepanjang waktu. Mengapa Anda memerlukan info itu?
Mat
@Mat terima kasih atas waktu Anda. Ini adalah pertanyaan terpisah, tetapi pada akhirnya saya ingin melihat apakah saya dapat menetapkan dua panggilan fooke dua prosesor yang berbeda. Ketika saya menelepon foosekali, itu berjalan dengan %CPUsangat dekat dengan 100% (menurut top). Tetapi ketika saya memanggil fookedua kalinya, kedua fooproses berjalan sedemikian rupa sehingga %CPUuntuk kedua proses berjumlah kurang dari 100% (biasanya sekitar 45% untuk setiap fooproses). Bagi saya, ini menunjukkan bahwa dua panggilan untuk fooberjalan pada prosesor yang sama (walaupun ada delapan prosesor yang tersedia); Saya ingin memverifikasi bahwa ini masalahnya.
Andrew
1
Istilah ini disebut afinitas prosesor
slm
1
Penjadwal memungkinkan hal-hal untuk dijalankan pada beberapa prosesor (berbeda) .... NAMUN, program Anda harus dibangun sebagai program multi-utas untuk mengambil keuntungan dari menggunakan beberapa pemrosesan bersamaan pada program atau tugas tertentu. Bergantung pada siapa yang memprogram aplikasi, program java mencoba melakukan ini.
mdpc

Jawaban:

11

psdapat memberi Anda informasi itu jika Anda meminta psrkolom (atau menggunakan -Fbendera yang memasukkannya).

Ex:

$ ps -F $$
UID        PID  PPID  C    SZ   RSS PSR STIME TTY      STAT   TIME CMD
me        6415  6413  0  5210  2624   2 18:52 pts/0    SN     0:00 -su

Atau:

$ ps -o pid,psr,comm -p $$
  PID PSR COMMAND
 6415   0 bash

Shell saya berjalan pada CPU 2 ketika saya menjalankan perintah pertama, pada CPU 0 ketika saya menjalankan yang kedua. Hati-hati karena proses dapat mengubah CPU dengan sangat cepat sehingga informasi yang Anda lihat sebenarnya sudah basi.

Beberapa info lebih lanjut dalam jawaban pertanyaan Pengguna Super ini:

Linux: perintah untuk mengetahui nomor prosesor di mana suatu proses dimuat?

Tikar
sumber
4

Dengan topdari procps(umumnya default pada distribusi Linux saat ini), di top, tekan f, navigasikan ke P = Last User CPU (SMP)dan tekan Spaceuntuk memilih (Anda juga dapat memindahkan bidang misalnya sebelum COMMANDbidang dengan Righttombol dan kemudian bergerak ke atas dan ke bawah). quntuk kembali ke layar utama (di mana Anda akan melihat proses Anda berpindah dari satu prosesor ke prosesor lain kecuali Anda mengonfigurasinya secara eksplisit untuk tetap menggunakan satu). Anda dapat menekan Wuntuk menyimpannya sebagai default.

Tekan ?untuk bantuan.

Stéphane Chazelas
sumber
4

Perintahnya tasksetadalah apa yang Anda cari:

tasket - mengambil atau mengatur afinitas CPU suatu proses

Contoh

$ taskset -p 12345
pid 12345's current affinity mask: f

Topeng fberarti semua prosesor, 0x00000001akan menjadi hanya prosesor 0.

$ taskset -c -p 24389 
pid 24389's current affinity list: 0-3

Menampilkan format daftar cpu. Saya memiliki 4 core pada laptop saya dalam contoh ini.

Lihat halaman manual memiliki lebih banyak detail .

slm
sumber
1

Anda juga bisa mendapatkan info ini langsung dari /proc/[pid]/stat. Ini adalah bidang terbatas-ruang ke-39 (sejak Linux 2.2.8).

Misalnya untuk menampilkan prosesor CPU yang menjalankan shell saat ini (saat ini):

cat  /proc/$$/stat | cut -d' ' -f39
drgnfr
sumber