Çalışan bir işlem için özel CPU kullanılabilirliği nasıl sağlanır?


25

İlk başta, OS işlem yürütme işini yaparken soru biraz saçma / kafa karıştırıcı gibi görünüyor.

Bununla birlikte, bazı işlemlerin CPU / IO'ya ne kadar bağlı olduğunu ölçmek istiyorum ve örneğin işletim sistemimin zamanlanmış işletim sistemi işlemleri ile olan denemelerime müdahale ettiğini hissediyorum.

Örnek olarak şu durumu ele alalım: A sürecini iki kez koştum ve "time" aracından (saniye cinsinden zaman sütunları) aşağıdaki çıktıyı aldım:

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

Gördüğümüz gibi, kullanıcı ve sys zamanı benzer olsa da, her ikisinin de geçen zamanları büyük ölçüde değişmektedir (fark, ~ 5 dakika). Ortamımdaki bir şeyin bir çeşit çekişmeye yol açtığını hissediyorum

Deneylerim sırasında her türlü gürültüyü önlemek için mümkün olan her arka plan sürecini / hizmetini durdurmak istiyorum ancak kendimi acemi / orta düzey bir unix kullanıcısı olarak görüyorum ve bunun nasıl garanti edileceğini bilmiyorum.

Ubuntu 14.04 LTS 64 bit ile Linux 4.4.0-45-jenerik kullanıyorum .

Yardımın için minnettarım. Herhangi bir eksik bilgiye ihtiyacınız olursa, derhal yazımı düzenlerim.

CPU Bilgisi

$ 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

Prosesinize yüksek öncelikli bir yöntem kullanarak başlayabilirsiniznice -19 process
Dababi

Yanıtlar:


26

Bir CPU'nun işletim sistemi tarafından kullanılmayacağı bir çekirdek seçenek yapılandırmasına sahipsiniz isolcpus.

isolcpus - İşlemcileri çekirdek zamanlayıcıdan ayırın.

Özet: isolcpus = cpu_number [, cpu_number, ...]

Tanım cpu_number değerleri tarafından tanımlanan belirli CPU'ları genel çekirdek SMP dengeleme ve zamanlayıcı algoritmalarından kaldırın. Bir işlemi "yalıtılmış" bir işlemciye taşımanın veya kapatmanın tek yolu CPU benzeşimi sistemleridir. cpu_number 0 ile başlar, bu yüzden maksimum değer sistemdeki CPU sayısından 1 daha azdır.

Nasıl kurulacağını açıklamak üzere olduğum bu yapılandırma, test etmekten çok daha fazla kullanıma sahip olabilir.

Örneğin Meru, ağ trafiğinin işletim sisteminin iç işleyişine, yani G / Ç işlemlerine karışmasını engellemek için Linux tabanlı AP denetleyicilerinde bu teknolojiyi kullanır.

Aynı zamanda çok yoğun bir web arayüzünde de aynı sebeplerle kullanıyorum: Yaşam deneyiminden, o sunucunun zevkine göre kontrolümü çok düzenli kaybettiğimi öğrendim; Ön uç daemon'unu kendi özel işlemcileriyle ayırana kadar zorla yeniden başlatmak zorunda kaldım.

8 işlemciniz olduğu için komutun çıktısını kontrol edebilirsiniz:

$ grep -c proc /proc/cpuinfo
8

veya

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

/etc/default/grubİsteğe bağlı olarak Debian / Ubuntu dosyasına ekleyin GRUB_CMDLINE_LINUX:

GRUB_CMDLINE_LINUX="isolcpus=7"

(7'dir, çünkü 0'da başlar ve 8 çekirdeğiniz vardır)

O zaman koş,

sudo update-grub

Bu, çekirdeğe çekirdeklerinden birini kullanmamasını söylüyor.

Sistemi yeniden başlatın.

O zaman işlemine başla.

Başlattıktan hemen sonra, 8. CPU için değişiklik yapabilirsiniz (7, çünkü 0'dır) ve bu CPU'yu kullanan tek kişi siz olduğunuzdan emin olabilirsiniz.

Bunun için şu komutu kullanın:

taskset -cp 7 PID_number

tasket - bir işlemcinin CPU benzeşimini al veya ayarla

ÖZET

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

AÇIKLAMA

Taslaklar, PID'leri verilen çalışan bir işlemin CPU afinitesini ayarlamak veya almak veya verilen bir CPU afinitesi ile yeni bir COMMAND başlatmak için kullanılır. CPU benzeşimi, bir işlemi sistemdeki belirli bir CPU kümesine "bağlayan" bir zamanlayıcı özelliğidir. Linux zamanlayıcısı, verilen CPU benzeşimini onurlandıracak ve işlem diğer CPU'larda çalışmaz. Linux zamanlayıcısının ayrıca doğal CPU benzeşimini de desteklediğini unutmayın: Zamanlayıcı, performans açısından aynı işlemleri mümkün olduğu sürece aynı CPU üzerinde tutmaya çalışır. Bu nedenle, belirli bir CPU benzeşimini zorlamak sadece belirli uygulamalarda yararlıdır.

Bununla ilgili daha fazla bilgi için, bakınız: isolcpus, numactl ve tasket

Ayrıca ps -eFPSR sütununda kullanılan işlemciyi görmelisiniz.

CPU 2 ve 3 ile izole edilmiş bir sunucum var ve gerçekten de, kullanıcı alanındaki amaçlanan ps -etek işlem ile görülebiliyor .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

İzole olmayan CPU'larla karşılaştırırsanız, çok daha fazla şey çalıştırıyorlar (aşağıdaki pencerede slaytlar ):

# 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

Bunun mümkün olduğunu bilmiyordum :) Referanslarınızı kontrol edeceğim. Bu konuyu çözülmüş olarak işaretlemek için sabırsızlanıyoruz;)
Jeanderson Candido

Neredeyse unutuyordum ... bu izolasyonun çalışıp çalışmadığını kontrol etmek için yürütmeyi izlemenin bir yolu var mı?
Jeanderson Candido

Rica ederim. 2. paragraf olarak küçük bir giriş eklendi. Net'te görev seti hakkında konuşurken bazı dersler gördüğümü unutmayın, ancak çoğu zaman bununla birlikte bahsetmiyorlarisolcpus
Rui F Ribeiro
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.