लिनक्स के भीतर से हाइपरथ्रेडिंग अक्षम करें (BIOS तक पहुंच नहीं)


26

मेरे पास एक दूरस्थ सुविधा पर वित्तीय ट्रेडिंग एप्लिकेशन चलाने वाला एक सिस्टम है। मेरे पास ILO / DRAC तक पहुंच नहीं है, लेकिन हाइपरथ्रेडिंग को अक्षम करने की आवश्यकता है। सिस्टम इंटेल वेस्टमेरे 3.33GHz X5680 हेक्स-कोर सीपीयू चलाता है। मैं रिबूट कर सकता हूं, लेकिन यह सुनिश्चित करना चाहता हूं कि सिस्टम प्रदर्शन समस्याओं के कारण हाइपरथ्रेडिंग को सक्षम न करे। क्या लिनक्स के भीतर से ऐसा करने का एक साफ तरीका है?

संपादित करें: nohtकर्नेल बूट कमांड लाइन में जोड़ा गया निर्देश काम नहीं करता था। RHEL के लिए भी।

देखें: https://bugzilla.redhat.com/show_bug.cgi?id=440321#c9

जवाबों:


21

आप इसे रनटाइम पर कर सकते हैं यदि आप चाहते हैं। मुझे यहाँ वर्णित एक अच्छा समाधान मिला: http://www.absolutelytech.com/2011/08/01/how-to-disable-cpu-cores-in-linux/

चरण 1: उस लिनक्स सीपीयू को पहचानें जिसे आप बंद करना चाहते हैं:

cat /proc/cpuinfo

सीपीयू के लिए देखें जिसमें समान "कोर आईडी" है, आप प्रत्येक जोड़ी में से एक को स्विच करना चाहते हैं।

चरण 2: हाइपरथ्रेडिंग सीपीयू स्विच करें (मेरे मामले में लिनक्स द्वारा देखे गए कुल 8 "सीपीयू" के अंतिम चार)

echo 0 > /sys/devices/system/cpu/cpu4/online
echo 0 > /sys/devices/system/cpu/cpu5/online
echo 0 > /sys/devices/system/cpu/cpu6/online
echo 0 > /sys/devices/system/cpu/cpu7/online

आप अपने आप को एक स्क्रिप्ट सेट कर सकते हैं जिसे आप सिस्टम शुरू होने के बाद चलाते हैं।


1
यह लगभग मेरी अपेक्षा के अनुरूप काम करता है। वर्चुअल कोर अक्षम हैं, अब जब मैं एक सीपीयू-खपत धागा निष्पादित करता हूं तो यह भौतिक कोर को 100% तक लोड करता है। लेकिन sysbench --num-threads=1 --test=cpu runअलग-अलग अंकों के थ्रेड्स और एचटी को चालू करने और बंद करने का उपयोग करने से यह कहा जाता है कि कई थ्रेड होने पर एचटी को अक्षम करने से परफ्यूम की कमी हो जाती है, और यहां तक ​​कि अगर सिर्फ एक थ्रेड है तो एचटी को बंद करने से कोई लाभ नहीं है। इसलिए मैं इसे छोड़ने का सुझाव देता हूं क्योंकि यह है: यह इष्टतम है।
सेर्गेई पी। उर्फ ​​अजुर

क्या आप जानते हैं कि उन्हें वापस चालू करने की आज्ञा क्या है? आपके उत्तर की शुरुआत में लिंक मर चुका है ~। धन्यवाद!
user189035

@ user189035: echo 1इसके बजाय echo 0उन्हें वापस चालू करना चाहिए।
पीटर कॉर्डेस

@ SergeyP.akaazure, मुझे लगता है कि वित्तीय सेवाओं के लिए आवेदन, HT बंद करने का मुख्य कारण प्रदर्शन नहीं है, लेकिन सुरक्षा है।
साइमन रिक्टर

@SimonRichter जिस समय यह प्रश्न मूल रूप से लिखा गया था, यह वास्तव में प्रदर्शन था। SMT / HT उस युग के CPU पर कुछ वर्कलोड के रूप में लगभग अच्छे नहीं थे। मेल्टडाउन / स्पेक्टर बात, और हाल ही में फ़ोरशेडो हमले, वर्षों बाद हुए।
माइकल हैम्पटन

14

मशीन स्टार्टअप में हाइपरथ्रेडिंग को अक्षम करने के लिए एक स्क्रिप्ट ...

हाइपरथ्रेडिंग को अक्षम करने के लिए मैं मशीन /etc/rc.local पर एक स्क्रिप्ट शामिल करता हूं। यह निर्मल स्वच्छ नहीं है, लेकिन स्थापित करना आसान है, सीपीयू वास्तुकला से स्वतंत्र है और किसी भी आधुनिक लिनक्स वितरण पर काम करना चाहिए।

nano /etc/rc.local

    # place this near the end before the "exit 0"

    for CPU in /sys/devices/system/cpu/cpu[0-9]*; do
        CPUID=$(basename $CPU)
        echo "CPU: $CPUID";
        if test -e $CPU/online; then
                echo "1" > $CPU/online; 
        fi;
        COREID="$(cat $CPU/topology/core_id)";
        eval "COREENABLE=\"\${core${COREID}enable}\"";
        if ${COREENABLE:-true}; then        
                echo "${CPU} core=${CORE} -> enable"
                eval "core${COREID}enable='false'";
        else
                echo "$CPU core=${CORE} -> disable"; 
                echo "0" > "$CPU/online"; 
        fi; 
    done;    

यह कैसे काम करता है?

लिनक्स कर्नेल सूचना और नियंत्रण को आधुनिक लिनक्स वितरण पर फ़ाइलों / sys निर्देशिका के रूप में एक्सेस किया जा सकता है। उदाहरण के लिए:

/ sys / devices / system / cpu / cpu3 में तार्किक cpu 3 के लिए कर्नेल जानकारी और नियंत्रण शामिल हैं।

cat / sys / devices / system / cpu / cpu3 / topology / core_id कोर नंबर दिखाएगा जो इस तार्किक cpu के लिए है।

इको "0"> / एसआईएस / डिवाइस / सिस्टम / सीपीयू / सीपीयू 3 / ऑनलाइन तार्किक सीपीयू 3 को अक्षम करने की अनुमति देता है।

यह काम क्यों करता है?

मुझे नहीं पता कि आखिर क्यों ... लेकिन सिस्टम हाइपरथ्रेडिंग ऑफ (मेरे i5 नोटबुक पर और 60+ कोर के साथ बड़े पैमाने पर Xeon सर्वर) के साथ अधिक संवेदनशील हो जाता है। मुझे लगता है कि प्रति-सीपीयू कैश, प्रति-सीपीयू मेमोरी आवंटन, सीपीयू शेड्यूलर आवंटन और प्रक्रिया की प्राथमिकताएं पुनरावृत्तियों के साथ करना है। मुझे लगता है कि हाइपरथ्रेडिंग के लाभ cpu शेड्यूलर्स बनाने की जटिलता से अधिक वजन वाले हैं जो जानते हैं कि इसका उपयोग कैसे करना है।

मेरे लिए, हाइपरथ्रेडिंग के साथ समस्या यह है: यदि मैं तार्किक कोर के रूप में कई सीपीयू-गहन धागे शुरू करता हूं, तो मेरे पास सीपीयू गहन कार्यों के लिए तेज़ संदर्भ स्विच होंगे, लेकिन हाइपरथ्रेडिंग पूरी तरह से उपभोग करने के बाद से पृष्ठभूमि कार्यों के लिए महंगा है। सीपीयू गहन कार्य। दूसरी ओर, अगर मैं कई सीपीयू-गहन धागे के रूप में शुरू करता हूं क्योंकि मेरे पास भौतिक कोर हैं तो मेरे पास उन कार्यों के लिए कोई संदर्भ स्विच नहीं होंगे और पृष्ठभूमि कार्यों के लिए तेजी से संदर्भ स्विच होंगे। अच्छा लगता है, लेकिन पृष्ठभूमि के कार्यों में मुफ्त तार्किक प्रोसेसर मिलेंगे और लगभग imediatedly चलेगा। यह ऐसा है जैसे वे रियलटाइम परफॉर्मेंस (अच्छा -20) हैं।

पहले परिदृश्य में हाइपरथ्रेडिंग uselles है, पृष्ठभूमि कार्य महंगे संदर्भ स्विच का उपयोग करेंगे क्योंकि मैंने सामान्य प्रसंस्करण के साथ हाइपरथ्रेडिंग को अधिकतम किया। दूसरा अप्राप्य है क्योंकि मेरी सीपीयू शक्ति का 50% तक पृष्ठभूमि कार्यों के लिए प्राथमिकता दी जाती है।

जिन "cpu- गहन" कार्यों के बारे में मैं बात कर रहा हूँ वे कृत्रिम बुद्धिमत्ता डेटा खनन और प्राधिकरण सर्वर (मेरा काम) हैं। सस्ते कंप्यूटर और क्लस्टर में ब्लेंडर प्रतिपादन (मेरे भविष्य के घर को स्केच करने के लिए)।

इसके अलावा, यह अनुमान है।

मुझे लगता है कि बेहतर है, लेकिन यह नहीं हो सकता है।


मुझे लगता है कि मेरी स्क्रिप्टलेट का पालन करना थोड़ा आसान है।
पॉल एम

9

वास्तव में पुरानी गुठली (लिनक्स 2.6.9 या तो) के लिए, बूट पर कर्नेल के लिए noht पैरामीटर संलग्न करें ।

यह कर्नेल कमांड-लाइन विकल्प कम से कम लिनक्स 2.6.18 के बाद से हटा दिया गया है


से http://www.faqs.org/docs/Linux-HOWTO/BootPrompt-HOWTO.html :

The `noht' Argument

This will disable hyper-threading on intel processors that have this feature. 

यदि लिलो का उपयोग करके आप /etc/lilo.conf को संपादित करते हैं (और बाद में लिलो को चलाते हैं) या यदि ग्रब का उपयोग करते हैं तो अपने /boot/grub/menu.lst को संपादित करें।


क्या यह कार्यात्मक रूप से BIOS में HT को अक्षम करने के बराबर है?
इविविट

मुझे नहीं पता कि निश्चित रूप से, लेकिन हां, मुझे उम्मीद है कि यह BIOS पर अक्षम करने के बराबर नहीं होगा।
18

2
यह एक जेंटू प्रणाली है। मैंने nohtग्रब कर्नेल कमांड लाइन में प्रविष्टि की कोशिश की । सिस्टम ने nohtआदेश का सम्मान नहीं किया । RHEL के लिए भी। देखें: Bugzilla.redhat.com/show_bug.cgi?id=440321#c9
ewwhite

1
यह कम से कम लिनक्स 2.6.18 के बाद से अप्रचलित हैnohtकर्नेल विकल्प हटा दिया गया था। यह दुर्भाग्यपूर्ण है, क्योंकि लिनक्स कुछ हसवेल परफेक्ट-काउंटर इरेटा (BJ122, BV98, HSD29) के लिए केवल वर्कआउट को सक्षम बनाता है, अगर HT चालू है , और initramfs के लोड होने से पहले भी ऐसा होता है।
पीटर कॉर्डेस

9

आप एचटी जोड़ी में दूसरे कोर को बंद करने के लिए प्रत्येक कोर के लिए "थ्रेड_सिंगिंग्स_लिस्ट" का उपयोग कर सकते हैं।

निम्न कमांड पाइप लाइन हैक की गई है, अनुकूलित नहीं है, और इस तरह से उम्मीद की है कि इसे समझना आसान हो जाए।

cat /sys/devices/system/cpu/cpu*/topology/thread_siblings_list | \
awk -F, '{print $2}' | \
sort -n | \
uniq | \
( while read X ; do echo $X ; echo 0 > /sys/devices/system/cpu/cpu$X/online ; done )

इसलिए, सभी थ्रेड भाई-बहनों की सूची लें, प्रत्येक जोड़ी के लिए दूसरा सीपीयू निकालें, एक अद्वितीय सूची प्राप्त करें, और फिर उन्हें बंद कर दें।

इसका कोई मतलब भी है क्या?

अगर मैं ऊपर चलने के बाद "कैट / प्रॉप / cpuinfo" करता हूं, तो कोर की संख्या घट जाती है।


यह एक बेहतरीन जवाब है। मुझे अपने उद्देश्यों के लिए काम करने के लिए इसे संशोधित करना पड़ा: echo 0 > /sys/devices/system/cpu/cpu$X/onlineहो जाता हैecho 0 | sudo tee /sys/devices/system/cpu/cpu$X/online
कार्बोकेशन

5

नए कर्नेल एक बहुआयामी मल्टीथ्रेडिंग (SMT) नियंत्रण प्रदान करते हैं।

आप एसएमटी की स्थिति की जांच कर सकते हैं;

cat /sys/devices/system/cpu/smt/active

के साथ राज्य बदलें

echo off > /sys/devices/system/cpu/smt/control

विकल्प हैं;

  • पर
  • बंद
  • मजबूरन बंद

हमने लिनक्स कर्नेल 4.4.0 के साथ इसका परीक्षण किया है


हाय निक और साइट पर आपका स्वागत है। परीक्षण (और संस्करण) के बारे में जानकारी काफी मूल्यवान है।
कुबंझक

उत्कृष्ट, Ubuntu 16.04.6 LTS पर परीक्षण किया गया
एल्डर गीक

4

लुकास का जवाब अच्छा है लेकिन वास्तव में एचटी को निष्क्रिय करने के लिए काम नहीं करता है क्योंकि कोर आईडी एचटी भाई-बहनों की पहचान के लिए काम नहीं कर सकता है। इसके बजाय यह स्क्रिप्ट काम करती है:

#!/bin/bash
for CPU in /sys/devices/system/cpu/cpu[0-9]*; do
    CPUID=`basename $CPU | cut -b4-`
    echo -en "CPU: $CPUID\t"
    [ -e $CPU/online ] && echo "1" > $CPU/online
    THREAD1=`cat $CPU/topology/thread_siblings_list | cut -f1 -d,`
    if [ $CPUID = $THREAD1 ]; then
        echo "-> enable"
        [ -e $CPU/online ] && echo "1" > $CPU/online
    else
        echo "-> disable"
        echo "0" > $CPU/online
    fi
done

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

@PaMM वही है जहाँ मैंने इसका परीक्षण किया था और अपने उद्देश्यों के लिए इसका इस्तेमाल किया था: 2 सॉकेट हैसवेल सिस्टम।
एंटोन

0

मुझे तब तक इंतजार करना पड़ा जब तक कि मैं ILO / Drac में नहीं जा सका। कर्नेल बूट पैरामीटर वर्तमान लिनक्स वितरण पर काम नहीं करते हैं।


0

Libsmbios-bin पैकेज (डेबियन, उबंटू, आदि) में, आपके पास बायनेरिज़ isCmosTokenActive और activateCmosToken है। एक साथ के साथ टोकन सूची , आप तो कुछ इस तरह की कोशिश कर सकते हैं:

# isCmosTokenActive 0x00d1 # CPU_Hyperthreading_Enable
[...] Type 0x00d1  Location 0x46 AND(fe) OR(0)  BITFIELD: 1
# isCmosTokenActive 0x00d2 # CPU_Hyperthreading_Disable
[....] Type 0x00d2  Location 0x46 AND(fe) OR(1)  BITFIELD: 0

तब CPU_Hyperthreading_Disable टोकन सक्रिय करें:

# activateCmosToken 0x00d2 # CPU_Hyperthreading_Disable
[...] Type 0x00d2  Location 0x46 AND(fe) OR(1)  BITFIELD: 1

सत्यापित करें:

# isCmosTokenActive 0x00d1 # CPU_Hyperthreading_Enable
[...] Type 0x00d1  Location 0x46 AND(fe) OR(0)  BITFIELD: 0
# isCmosTokenActive 0x00d2 # CPU_Hyperthreading_Disable
[...] Type 0x00d2  Location 0x46 AND(fe) OR(1)  BITFIELD: 1

अब, बड़ा सवाल यह है कि क्या आपको प्रभावी होने के लिए बस रिबूट की आवश्यकता है या नहीं, या यदि पूर्ण शक्ति चक्र की आवश्यकता है। इसे आज़माएं और देखें कि यह कैसे जाता है!


0

पॉल एम द्वारा यहां दी गई जानकारी के आधार पर , मैं इसे इस तरह "स्क्रिप्ट" करूंगा:

fgrep , /sys/devices/system/cpu/cpu*/topology/thread_siblings_list |
cut -d, -f2 | sort -u |
sudo xargs -rI, sh -c 'echo 0 > /sys/devices/system/cpu/cpu,/online'

निश्चित रूप से यह हाइपर-थ्रेडिंग को उसी अर्थ में बंद नहीं कर रहा है जैसा कि BIOS के साथ छेड़छाड़ करना होगा , मूल रूप से यह केवल कर्नेल कार्य अनुसूचक को बताता है कि कुछ कोर का उपयोग न करने के कारण हम जानते हैं कि वे नकली हैं।

सॉफ़्टवेयर जिसने पिछली स्थिति /procया /sysउप-प्रणाली के आधार पर अपनी धारणा बनाई थी, वह अभी भी उप-इष्टतम चल रहा हो सकता है या इस रन-टाइम परिवर्तन के कारण विफल हो सकता है, इसलिए इसके पुनरारंभ की आवश्यकता हो सकती है। उदाहरण के लिए, मैंने देखा irqbalanceहै कि उस परिस्थितियों में असफल होने का खतरा था।


0

HT अक्षम करें:

echo 0 |sudo tee /sys/devices/system/cpu/cpu{4..7}/online

HT सक्षम करें:

echo 1 |sudo tee /sys/devices/system/cpu/cpu{4..7}/online

नोट: यह वास्तव में हाइपरथ्रेडिंग को अक्षम नहीं करता है लेकिन वे "नकली" कोर को लगभग उसी परिणाम को प्राप्त करने में अक्षम करते हैं।


मुझे आपके द्वारा उपयोग किए जा रहे तरीके पसंद हैं tee, लेकिन यह प्रश्न का वास्तविक उत्तर प्रदान करने में अभी भी कम है। वे आदेश केवल विशिष्ट हार्डवेयर कॉन्फ़िगरेशन पर लागू होते हैं और अन्य हार्डवेयर कॉन्फ़िगरेशन पर अनपेक्षित प्रभाव पड़ सकते हैं। और उन आदेशों का एक स्पष्टीकरण पूरी तरह से अनुपस्थित है।
कास्परड

चूँकि 0 का मतलब बंद है और 1 का मतलब है, मुझे लगा कि यह समझना आसान है कि पहला 4 कोर (नकली 8 के साथ एक हाइपरथ्रेड पर हाइपरथ्रेडिंग के साथ) स्विच करता है और दूसरा उन्हें वापस स्विच करता है ... यदि आपके पास डीयूएल है कोर की संख्या {4..7} के बजाय {3,4} होनी चाहिए यदि आप एक ऑक्टाकोर का उपयोग करते हैं तो यह {8..15} होना चाहिए
Zibri

0

पुराना विषय, लेकिन इस प्रयोग को आजमाने का कारण था। सबसे पहले, मैं बिल्कुल भी निश्चित नहीं हूं कि रनटाइम के दौरान (थोड़ा नकली) सीपीयू को निष्क्रिय करना वास्तव में बूट पर हाइपरथ्रेडिंग को अक्षम करने के बराबर है। उस ने कहा, मैंने हमारे आवेदन में एक छोटा प्रदर्शन बढ़ाया है। (लेकिन रखने के लिए पर्याप्त नहीं है।)

सक्षम / अक्षम करने के लिए एक कुंजी के रूप में थ्रेड_सिस्टिंग मान (हाइपरथ्रेडेड सीपीयू के लिए सामान्य) का उपयोग किया:

for i in /sys/devices/system/cpu/cpu[0-9]* 
do echo "$(cat $i/topology/thread_siblings) $i" 
done | 
awk '{v = (a[$1] ? 0 : 1); a[$1] = 1; print "echo " v " > " $2 "/online"}' | 
sudo sh 

सही सत्यापित करने के लिए अंतिम sudo श की कमांड w / o की कोशिश करें।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.