आपके पास एक कर्नेल विकल्प कॉन्फ़िगरेशन है जहां 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
nice -19 process