GNU/Linux >> Belajar Linux >  >> Debian

Debian – Bagaimana Cara Memastikan Ketersediaan CPU Eksklusif Untuk Proses yang Berjalan?

Pada awalnya, pertanyaannya tampak sedikit konyol/membingungkan karena OS melakukan tugas mengelola eksekusi proses.

Namun, saya ingin mengukur seberapa banyak beberapa proses terikat dengan 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 berubah secara drastis (perbedaan ~5 menit). Terasa seperti sesuatu di lingkungan saya menyebabkan semacam pertengkaran.

Saya ingin menghentikan setiap proses/layanan latar belakang yang memungkinkan untuk menghindari kebisingan apa pun selama eksperimen saya, tetapi saya menganggap diri saya sebagai pengguna unix pemula/menengah dan saya tidak tahu bagaimana menjaminnya.

Saya menggunakan Linux 4.4.0-45-generik 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

Jawaban yang Diterima:

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

isolcpus — Mengisolasi CPU dari penjadwal kernel.

Sinopsis isolcpus=cpu_number [, cpu_number ,…]

Deskripsi Hapus CPU yang ditentukan, seperti yang didefinisikan oleh nilai cpu_number
, dari algoritma penyeimbang dan penjadwal SMP kernel umum
. Satu-satunya cara untuk memindahkan proses ke atau dari CPU "terisolasi"
adalah melalui syscalls afinitas CPU. cpu_number dimulai dari 0, sehingga
nilai maksimum adalah 1 lebih kecil dari jumlah CPU pada sistem.

Konfigurasi ini yang akan saya jelaskan cara menyiapkannya, dapat memiliki lebih banyak kegunaan daripada untuk pengujian.

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

Saya juga menggunakannya di frontend web yang sangat sibuk, untuk alasan yang sama:Saya telah menemukan dari pengalaman hidup bahwa saya kehilangan kendali terlalu sering untuk selera saya dari server itu; harus mem-boot ulang secara 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 Debian/Ubuntu di file /etc/default/grub ke opsi GRUB_CMDLINE_LINUX :

GRUB_CMDLINE_LINUX="isolcpus=7"

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

Kemudian jalankan,

sudo update-grub

Ini memberi tahu kernel untuk tidak menggunakan salah satu inti 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 adalah satu-satunya yang menggunakan CPU tersebut.

Terkait:Htop CPU% pada ~ 100% tetapi grafik batang menunjukkan setiap inti jauh lebih rendah?

Untuk itu gunakan perintah:

taskset -cp 7 PID_number

taskset – mengambil atau mengatur afinitas CPU suatu proses

SINOPSIS

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

DESKRIPSI

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

Untuk membaca lebih lanjut tentangnya, lihat:isolcpus, numactl, dan taskset

Juga menggunakan ps -eF Anda akan melihat di kolom PSR prosesor yang digunakan.

Saya memiliki server dengan CPU 2 dan 3 terisolasi, dan memang, itu dapat dilihat dengan ps -e satu-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: [email protected]/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

Debian
  1. Cara Mendapatkan pembaruan LTS untuk Debian 6 (Squeeze)

  2. Cara Mengatur Afinitas CPU untuk Proses SISTEM di CentOS/RHEL 7

  3. cara menginstal gui untuk debian

  1. Pastikan Sebuah Proses Selalu Berjalan?

  2. Periksa Proses Jika Sama Sedang Berjalan?

  3. Debian – Bagaimana Menyembunyikan Proses Tertentu?

  1. Cara Membatasi Penggunaan CPU Suatu Proses Di Linux

  2. Cara Mengatur Ulang Kata Sandi untuk Sudo di Debian

  3. Bagaimana cara mengatur afinitas CPU untuk proses dari C atau C++ di Linux?