मशीन स्टार्टअप में हाइपरथ्रेडिंग को अक्षम करने के लिए एक स्क्रिप्ट ...
हाइपरथ्रेडिंग को अक्षम करने के लिए मैं मशीन /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- गहन" कार्यों के बारे में मैं बात कर रहा हूँ वे कृत्रिम बुद्धिमत्ता डेटा खनन और प्राधिकरण सर्वर (मेरा काम) हैं। सस्ते कंप्यूटर और क्लस्टर में ब्लेंडर प्रतिपादन (मेरे भविष्य के घर को स्केच करने के लिए)।
इसके अलावा, यह अनुमान है।
मुझे लगता है कि बेहतर है, लेकिन यह नहीं हो सकता है।
sysbench --num-threads=1 --test=cpu run
अलग-अलग अंकों के थ्रेड्स और एचटी को चालू करने और बंद करने का उपयोग करने से यह कहा जाता है कि कई थ्रेड होने पर एचटी को अक्षम करने से परफ्यूम की कमी हो जाती है, और यहां तक कि अगर सिर्फ एक थ्रेड है तो एचटी को बंद करने से कोई लाभ नहीं है। इसलिए मैं इसे छोड़ने का सुझाव देता हूं क्योंकि यह है: यह इष्टतम है।