रनिंग प्रक्रिया के लिए अनन्य सीपीयू उपलब्धता कैसे सुनिश्चित करें?


25

सबसे पहले, सवाल थोड़ा मूर्खतापूर्ण / भ्रमित करने वाला लगता है क्योंकि ओएस प्रक्रिया के निष्पादन का काम करता है।

हालाँकि, मैं यह मापना चाहता हूं कि कितनी प्रक्रियाएँ CPU / IO- बद्ध हैं और मुझे ऐसा लगता है कि मेरा OS मेरे प्रयोगों में, उदाहरण के लिए, अनुसूचित OS प्रक्रियाओं में हस्तक्षेप कर रहा है।

एक उदाहरण के रूप में निम्न स्थिति लें: मैंने प्रक्रिया ए को दो बार चलाया और टूल "टाइम" (सेकंड में समय कॉलम) से निम्न आउटपुट मिला:

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

जैसा कि हम देख सकते हैं, हालांकि उपयोगकर्ता और sys का समय समान है, दोनों का समय काफी हद तक बदलता है (~ 5 मिनट का अंतर)। लगता है कि मेरे वातावरण में कुछ इस तरह के विवाद का कारण बना।

मैं अपने प्रयोगों के दौरान किसी भी तरह की शोर से बचने के लिए हर संभव पृष्ठभूमि प्रक्रिया / सेवाओं को रोकना चाहता हूं, लेकिन मैं खुद को नौसिखिया / मध्यवर्ती यूनिक्स-उपयोगकर्ता मानता हूं और मुझे नहीं पता कि यह कैसे गारंटी है।

मैं Ubuntu 14.04 LTS 64 बिट के साथ लिनक्स 4.4.0-45-जेनेरिक का उपयोग कर रहा हूं

मैं वास्तव में सहायता की सराहना करता हूं। यदि आप लोगों को किसी भी लापता जानकारी की आवश्यकता है, तो मैं तुरंत अपनी पोस्ट को संपादित करूंगा।

सीपीयू जानकारी

$ 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

आप अपनी प्रक्रिया को एक उच्च प्राथमिकता का उपयोग करके शुरू कर सकते हैंnice -19 process
Dababi

जवाबों:


26

आपके पास एक कर्नेल विकल्प कॉन्फ़िगरेशन है जहां OS द्वारा CPU का उपयोग नहीं किया जाएगा, इसे कहा जाता है isolcpus

आइसोलपेकस - कर्नेल शेड्यूलर से सीपीयू को अलग करें।

सिनोप्सिस आइसक्यूपस = cpu_number [, cpu_number, ...]

विवरण निर्दिष्ट CPUs को निकालें, जैसा कि cpu_number मानों द्वारा परिभाषित किया गया है, सामान्य कर्नेल एसएमपी संतुलन और अनुसूचक अल्ग्रोथ्स से। एक "पृथक" सीपीयू पर एक प्रक्रिया को स्थानांतरित करने का एकमात्र तरीका सीपीयू आत्मीयता syscalls के माध्यम से है। cpu_number 0 से शुरू होता है, इसलिए अधिकतम मान सिस्टम पर CPU की संख्या से 1 कम है।

यह कॉन्फ़िगरेशन मैं सेटअप करने के तरीके के बारे में बताने वाला हूं, इसमें परीक्षण के लिए कहीं अधिक उपयोग हो सकते हैं।

उदाहरण के लिए, मेरु इस तकनीक का उपयोग अपने लिनक्स-आधारित एपी नियंत्रकों में करता है, ताकि नेटवर्क ट्रैफिक को ओएस के आंतरिक कामकाज के साथ दखल देने से बचाया जा सके, अर्थात I / O संचालन।

मैं इसे बहुत व्यस्त वेब फ्रंटेंड में भी उपयोग करता हूं, समान कारणों से: मैंने जीवन के अनुभव से पाया है कि मैंने उस सर्वर के अपने स्वाद के लिए नियमित रूप से नियंत्रण खो दिया है; यह बलपूर्वक रिबूट करने के लिए था जब तक कि मैं अपने स्वयं के समर्पित सीपीयू पर फ्रंट एंड डेमॉन को अलग नहीं करता।

जैसा कि आपके पास 8 सीपीयू हैं, जिसे आप कमांड के आउटपुट से जांच सकते हैं:

$ grep -c proc /proc/cpuinfo
8

या

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

/etc/default/grubविकल्प में फ़ाइल में डेबियन / उबंटू जोड़ें GRUB_CMDLINE_LINUX:

GRUB_CMDLINE_LINUX="isolcpus=7"

(यह 7 है, क्योंकि यह 0 में शुरू होता है, और आपके पास 8 कोर हैं)

तो भागो,

sudo update-grub

यह कर्नेल को आपके कोर में से एक का उपयोग नहीं करने के लिए कह रहा है।

सिस्टम को रिबूट करें।

फिर अपनी प्रक्रिया शुरू करें।

इसे शुरू करने के तुरंत बाद, आप 8 वें सीपीयू (7 क्योंकि 0 1 है) के लिए बदल सकते हैं, और सुनिश्चित करें कि आप उस सीपीयू का उपयोग करने वाले एकमात्र हैं।

उसके लिए, कमांड का उपयोग करें:

taskset -cp 7 PID_number

कार्यपत्रक - प्रक्रियाओं के सीपीयू आत्मीयता को पुनः प्राप्त या सेट करता है

SYNOPSIS

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

विवरण

कार्यपत्रक का उपयोग उसके पीआईडी ​​दिए गए चल रहे उपकर के सीपीयू आत्मीयता को सेट या पुनः प्राप्त करने के लिए किया जाता है या किसी दिए गए सीपीयू आत्मीयता के साथ एक नया COMMAND लॉन्च करने के लिए किया जाता है। सीपीयू आत्मीयता एक अनुसूचक संपत्ति है जो सिस्टम पर सीपीयू के दिए गए सेट के लिए एक प्रक्रिया "बांड" करता है। लिनक्स अनुसूचक दिए गए सीपीयू आत्मीयता का सम्मान करेगा और प्रक्रिया किसी अन्य सीपीयू पर नहीं चलेगी। ध्यान दें कि लिनक्स शेड्यूलर प्राकृतिक सीपीयू आत्मीयता का भी समर्थन करता है: शेड्यूलर प्रदर्शन कारणों के लिए व्यावहारिक रूप से एक ही सीपीयू पर प्रक्रियाओं को रखने का प्रयास करता है। इसलिए, एक विशिष्ट सीपीयू आत्मीयता को मजबूर करना केवल कुछ अनुप्रयोगों में उपयोगी है।

इसके बारे में अधिक पढ़ने के लिए, देखें: आइसोलिपस, न्यूक्लिटल और टास्कसेट

इसके अलावा ps -eFआपको पीएसआर कॉलम में देखा जाना चाहिए कि प्रोसेसर का उपयोग किया जा रहा है।

मेरे पास सीपीयू 2 और 3 के साथ एक सर्वर है, और वास्तव में, इसे उपयोगकर्तालैंडps -e में एकमात्र प्रक्रिया के साथ देखा जा सकता है , जैसा कि है ।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

यदि आप इसे गैर-पृथक सीपीयू के साथ तुलना करते हैं, तो वे कई और चीजें चला रहे हैं ( स्लाइड के नीचे की खिड़की ):

# 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

मुझे नहीं पता था कि ऐसा करना संभव है :) मैं आपके संदर्भों की जांच करने जा रहा हूं। इस धागे को हल करने के लिए आगे देख रहे हैं;)
जेन्डर्सन कैंडिडो

मैं लगभग भूल गया ... क्या यह अलगाव की जांच के लिए निष्पादन की निगरानी करने का कोई तरीका है?
जेन्डरसन कैंडिडो

आपका स्वागत है। 2 पैरा के रूप में एक छोटा सा परिचय जोड़ा गया। ध्यान दें कि मैंने नेटसेट में टास्क के बारे में बात करते हुए कुछ ट्यूटोरियल देखे हैं, लेकिन अक्सर वे इसका एक साथ उल्लेख नहीं करते हैंisolcpus
रुई एफ रिबेरो
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.