Bagaimana memastikan ketersediaan CPU eksklusif untuk proses yang berjalan?

25

Pada awalnya, pertanyaannya tampaknya sedikit konyol / membingungkan karena OS melakukan pekerjaan mengelola proses eksekusi.

Namun, saya ingin mengukur berapa banyak proses yang terikat CPU / IO dan saya merasa OS saya mengganggu eksperimen saya dengan, misalnya, proses OS terjadwal.

Ambil contoh situasi berikut: Saya menjalankan proses A dua kali dan mendapatkan output berikut dari alat "waktu" (kolom waktu dalam detik):

+---+-------+---------+-----------+---------+
|Run|Process|User Time|System Time|Wall time|
+---+-------+---------+-----------+---------+
|1  |A      |196.3    |5.12       |148.86   |
|2  |A      |190.79   |4.93       |475.46   |
+---+-------+---------+-----------+---------+

Seperti yang dapat kita lihat, meskipun waktu pengguna dan sistem serupa, waktu yang telah berlalu dari keduanya secara drastis berubah (perbedaan ~ 5 menit). Terasa seperti sesuatu di lingkungan saya menyebabkan pertikaian.

Saya ingin menghentikan setiap proses latar belakang / layanan yang mungkin untuk menghindari segala jenis kebisingan selama percobaan saya, tetapi saya menganggap diri saya pengguna pemula / menengah unix dan saya tidak tahu bagaimana menjamin ini.

Saya menggunakan Linux 4.4.0-45-generic dengan Ubuntu 14.04 LTS 64 bit.

Saya sangat menghargai bantuannya. Jika kalian membutuhkan informasi yang hilang, saya akan segera mengedit posting saya.

Info CPU

$ grep proc /proc/cpuinfo | wc -l
8
$ lscpu
Architecture:          x86_64
CPU op-mode(s):        32-bit, 64-bit
Byte Order:            Little Endian
CPU(s):                8
On-line CPU(s) list:   0-7
Thread(s) per core:    2
Core(s) per socket:    4
Socket(s):             1
NUMA node(s):          1
Vendor ID:             GenuineIntel
CPU family:            6
Model:                 60
Stepping:              3
CPU MHz:               4002.609
BogoMIPS:              7183.60
Virtualization:        VT-x
L1d cache:             32K
L1i cache:             32K
L2 cache:              256K
L3 cache:              8192K
NUMA node0 CPU(s):     0-7
Jeanderson Candido
sumber
Anda dapat memulai proses Anda menggunakan prioritas tingginice -19 process
Dababi

Jawaban:

26

Anda memiliki konfigurasi opsi kernel di mana CPU tidak akan digunakan oleh OS, itu disebut isolcpus.

isolcpus - Mengisolasi CPU dari penjadwal kernel.

Synopsis isolcpus = cpu_number [, cpu_number, ...]

Deskripsi Lepaskan CPU yang ditentukan, seperti yang didefinisikan oleh nilai cpu_number, dari algroithms penjadwalan dan penjadwalan SMP kernel. Satu-satunya cara untuk memindahkan proses ke atau dari CPU "terisolasi" adalah melalui syscalls afinitas CPU. cpu_number dimulai pada 0, sehingga nilai maksimum adalah 1 kurang dari jumlah CPU pada sistem.

Konfigurasi ini saya akan menjelaskan cara men-setup, dapat memiliki lebih banyak kegunaan daripada untuk pengujian.

Meru misalnya, menggunakan teknologi ini di pengontrol AP berbasis Linux mereka, untuk menjaga lalu lintas jaringan dari mengganggu kerja bagian dalam OS, yaitu operasi I / O.

Saya juga menggunakannya di web frontend yang sangat sibuk, untuk alasan yang sama: Saya telah mengetahui dari pengalaman hidup bahwa saya kehilangan kontrol terlalu teratur untuk selera server itu; harus me-reboot dengan paksa sampai saya memisahkan daemon ujung depan pada CPU khusus itu sendiri.

Karena Anda memiliki 8 CPU, Anda dapat memeriksa dengan output dari perintah:

$ grep -c proc /proc/cpuinfo
8

atau

$ lscpu | grep '^CPU.s'
CPU(s):                8

Tambahkan di Debian / Ubuntu di file /etc/default/grubke opsi GRUB_CMDLINE_LINUX:

GRUB_CMDLINE_LINUX="isolcpus=7"

(ini 7, karena dimulai pada 0, dan Anda memiliki 8 core)

Lalu lari,

sudo update-grub

Ini memberitahu kernel untuk tidak menggunakan salah satu core Anda.

Mulai ulang sistem.

Kemudian mulailah proses Anda.

Segera setelah memulainya, Anda dapat mengubah CPU ke-8 (7 karena 0 adalah yang pertama), dan pastikan Anda satu-satunya yang menggunakan CPU itu.

Untuk itu, gunakan perintah:

taskset -cp 7 PID_number

tasket - mengambil atau mengatur afinitas CPU suatu proses

RINGKASAN

   taskset [options] [mask | list ] [pid | command [arg]...]

DESKRIPSI

tasket digunakan untuk mengatur atau mengambil afinitas CPU dari proses yang berjalan yang diberikan PID-nya atau untuk meluncurkan PERINTAH baru dengan afinitas CPU yang diberikan. Afinitas CPU adalah properti penjadwal yang "mengikat" suatu proses ke serangkaian CPU pada sistem. Penjadwal Linux akan menghormati afinitas CPU yang diberikan dan proses tidak akan berjalan pada CPU lain. Perhatikan bahwa penjadwal Linux juga mendukung afinitas CPU alami: penjadwal mencoba untuk menjaga proses pada CPU yang sama selama praktis untuk alasan kinerja. Oleh karena itu, memaksa afinitas CPU tertentu hanya berguna dalam aplikasi tertentu.

Untuk membaca lebih lanjut tentang itu, lihat: isolcpus, numactl dan tasket

Juga menggunakan ps -eFAnda harus melihat di kolom PSR prosesor yang digunakan.

Saya memiliki server dengan CPU 2 dan 3 terisolasi, dan memang, itu dapat dilihat dengan ps -esatu-satunya proses di userland sebagaimana dimaksud, adalah pound.

# ps -eo psr,command | tr -s " " | grep "^ [2|3]"
 2 [cpuhp/2]
 2 [watchdog/2]
 2 [migration/2]
 2 [ksoftirqd/2]
 2 [kworker/2:0]
 2 [kworker/2:0H]
 3 [cpuhp/3]
 3 [watchdog/3]
 3 [migration/3]
 3 [ksoftirqd/3]
 3 [kworker/3:0]
 3 [kworker/3:0H]
 2 [kworker/2:1]
 3 [kworker/3:1]
 3 [kworker/3:1H]
 3 /usr/sbin/pound

Jika Anda membandingkannya dengan CPU yang tidak terisolasi, mereka menjalankan lebih banyak hal (jendela di bawah slide ):

# ps -eo psr,command | tr -s " " | grep "^ [0|1]"
 0 init [2]
 0 [kthreadd]
 0 [ksoftirqd/0]
 0 [kworker/0:0H]
 0 [rcu_sched]
 0 [rcu_bh]
 0 [migration/0]
 0 [lru-add-drain]
 0 [watchdog/0]
 0 [cpuhp/0]
 1 [cpuhp/1]
 1 [watchdog/1]
 1 [migration/1]
 1 [ksoftirqd/1]
 1 [kworker/1:0]
 1 [kworker/1:0H]
 1 [kdevtmpfs]
 0 [netns]
 0 [khungtaskd]
 0 [oom_reaper]
 1 [writeback]
 0 [kcompactd0]
 0 [ksmd]
 1 [khugepaged]
 0 [crypto]
 1 [kintegrityd]
 0 [bioset]
 1 [kblockd]
 1 [devfreq_wq]
 0 [watchdogd]
 0 [kswapd0]
 0 [vmstat]
 1 [kthrotld]
 0 [kworker/0:1]
 0 [deferwq]
 0 [scsi_eh_0]
 0 [scsi_tmf_0]
 1 [vmw_pvscsi_wq_0]
 0 [bioset]
 1 [jbd2/sda1-8]
 1 [ext4-rsv-conver]
 0 [kworker/0:1H]
 1 [kworker/1:1H]
 1 [bioset]
 0 [bioset]
 1 [bioset]
 1 [bioset]
 1 [bioset]
 1 [bioset]
 1 [bioset]
 1 [bioset]
 0 [jbd2/sda3-8]
 1 [ext4-rsv-conver]
 1 /usr/sbin/rsyslogd
 0 /usr/sbin/irqbalance --pid=/var/run/irqbalance.pid
 1 /usr/sbin/cron
 0 /usr/sbin/sshd
 1 /usr/sbin/snmpd -Lf /dev/null -u snmp -g snmp -I -smux -p /var/run/snmpd.pid
 1 /sbin/getty 38400 tty1
 1 /lib/systemd/systemd-udevd --daemon
 0 /usr/sbin/xinetd -pidfile /run/xinetd.pid -stayalive
 1 [kworker/1:2]
 0 [kworker/u128:1]
 0 [kworker/0:2]
 0 [bioset]
 1 [xfsalloc]
 1 [xfs_mru_cache]
 1 [jfsIO]
 1 [jfsCommit]
 0 [jfsCommit]
 0 [jfsCommit]
 0 [jfsCommit]
 0 [jfsSync]
 1 [bioset]
 0 /usr/bin/monit -c /etc/monit/monitrc
 1 /usr/sbin/pound
 0 sshd: rui [priv]
 0 sshd: rui@pts/0,pts/1
 1 -bash
 1 -bash
 1 -bash
 1 [kworker/u128:0]
 1 -bash
 0 sudo su
 1 su
 1 bash
 0 bash
 0 logger -t cmdline root[/home/rui] 
 1 ps -eo psr,command
 0 tr -s 
 0 grep ^ [0|1]
 0 /usr/bin/vmtoolsd
Rui F Ribeiro
sumber
Saya tidak tahu itu mungkin untuk dilakukan :) Saya akan memeriksa referensi Anda. Menantikan untuk menandai utas ini sebagai terselesaikan;)
Jeanderson Candido
Saya hampir lupa ... apakah ada cara untuk memantau eksekusi untuk memeriksa apakah isolasi ini berfungsi?
Jeanderson Candido
Sama sama. Menambahkan intro kecil sebagai paragraf ke-2. Perhatikan bahwa saya telah melihat beberapa tutorial di internet berbicara tentang tasket, tetapi sering kali mereka tidak menyebutkannyaisolcpus
Rui F Ribeiro