पारदर्शी विशालताओं को निष्क्रिय करें


63

हम एक RAID मशीन में SAP हाना स्थापित कर रहे हैं । स्थापना चरण के भाग के रूप में, यह उल्लेख किया गया है कि,

 To disable the usage of transparent hugepages set the kernel settings 
 at runtime with echo never > /sys/kernel/mm/transparent_hugepage/enabled 

इसलिए रनटाइम के बजाय, अगर मैं इसे एक स्थायी परिवर्तन बनाना चाहता था, तो क्या मुझे उपरोक्त लाइन को /proc/vmstatफ़ाइल के अंदर जोड़ना चाहिए ?


2
ध्यान दें कि यदि आप यहां बताए गए कुछ समाधानों का उपयोग कर रहे हैं, तो एक प्रणाली जो 'ट्यून' भी चलाती है, ट्यून उन समाधानों को ओवरराइड कर सकती है। अधिक जानकारी के लिए यहां देखें: Bugzilla.redhat.com/show_bug.cgi?id=1189868
Dejay Clayton

जवाबों:


80

इस स्थायी जैसे विकल्प बनाने के लिए आप उन्हें आमतौर पर फ़ाइल में जोड़ देंगे /etc/sysctl.conf। आप इस कमांड का उपयोग करके उपलब्ध विकल्पों की पूरी सूची देख सकते हैं:

$ sysctl -a

उदाहरण

$ sudo sysctl -a | head -5
kernel.sched_child_runs_first = 0
kernel.sched_min_granularity_ns = 6000000
kernel.sched_latency_ns = 18000000
kernel.sched_wakeup_granularity_ns = 3000000
kernel.sched_shares_ratelimit = 750000

आप hugepageआउटपुट को इस तरह देख सकते हैं :

$ sudo sysctl -a | grep hugepage
vm.nr_hugepages = 0
vm.nr_hugepages_mempolicy = 0
vm.hugepages_treat_as_movable = 0
vm.nr_overcommit_hugepages = 0

यह वहाँ नहीं है?

हालाँकि आउटपुट के माध्यम से मैं नहीं देख रहा था transparent_hugepage। थोड़ी और गुगली करते हुए मैं इस Oracle पृष्ठ पर आया, जो इस विषय पर चर्चा करता है। पेज का शीर्षक है: लिनक्स पर xge- के लिए कॉन्फ़िगरेशन का विस्तार (x86-64)

विशेष रूप से उस पृष्ठ पर वे उल्लेख करते हैं कि विशाल पृष्ठ सुविधा को कैसे अक्षम किया जाए

अंश

पारदर्शी HugePages को निष्क्रिय करने के लिए पसंदीदा तरीका "पारदर्शी_hugepage = never" को "/etc/grub.conf" फ़ाइल में कर्नेल बूट लाइन में जोड़ना है।

   title Oracle Linux Server (2.6.39-400.24.1.el6uek.x86_64)
            root (hd0,0)
            kernel /vmlinuz-2.6.39-400.24.1.el6uek.x86_64 ro root=/dev/mapper/vg_ol6112-lv_root rd_NO_LUKS  KEYBOARDTYPE=pc KEYTABLE=uk
    LANG=en_US.UTF-8 rd_NO_MD SYSFONT=latarcyrheb-sun16  rd_NO_DM rd_LVM_LV=vg_ol6112/lv_swap rd_LVM_LV=vg_ol6112/lv_root rhgb quiet numa=off
    transparent_hugepage=never
            initrd /initramfs-2.6.39-400.24.1.el6uek.x86_64.img

प्रभावी होने के लिए सर्वर को रीबूट किया जाना चाहिए।

वैकल्पिक रूप से आप अपनी /etc/rc.localफ़ाइल में कमांड जोड़ सकते हैं ।

if test -f /sys/kernel/mm/transparent_hugepage/enabled; then
   echo never > /sys/kernel/mm/transparent_hugepage/enabled
fi
if test -f /sys/kernel/mm/transparent_hugepage/defrag; then
   echo never > /sys/kernel/mm/transparent_hugepage/defrag
fi

मुझे लगता है कि मैं 2 वें विकल्प के साथ जाऊंगा, क्योंकि जब आप एक कर्नेल से दूसरे में अपग्रेड करते हैं, तो सबसे पहले परेशान होने का जोखिम होगा।

आप पुष्टि कर सकते हैं कि इसने रिबूट करने के बाद निम्न कमांड के साथ काम किया:

$ cat /sys/kernel/mm/transparent_hugepage/enabled
always madvise [never]

7
आप पारदर्शी वितरण का पहला विकल्प कर्नेल अपडेट जोड़ सकते हैं = अधिकांश वितरण पर / etc / default / default / GRUB_CMDLINE_LINUX_DEFAULT विकल्प में कभी नहीं।
रविकॉ

2
यदि का आउटपुट cat /sys/kernel/mm/transparent_hugepage/enabledहै [always] madvise never, तो स्थिति है alwaysया यह सक्षम है ( []चारों ओर कोष्ठक पर ध्यान दें always)
ub3rst4r

4
विशालकाय और पारदर्शी विशालकाय को भ्रमित न करें। उत्तरार्द्ध कई मुद्दों का कारण बन सकता है, मुख्य रूप से उच्च सीपीयू उपयोग जबकि लगातार मेमोरी को डीफ़्रैग्मेंट करने की कोशिश कर रहा है और सामान्य 4kB पृष्ठों को 2MB पृष्ठों में बदल देता है।
मार्की 555

2
@Rwky - जब आपके सुझाव के अनुसार ट्वीकिंग - मैं फाइल को सहेजने के बाद अगली कार्रवाई पर जोर दूंगा sudo update-grub"पत्थर में लिखी" नई सेटिंग्स प्राप्त करने के लिए निष्पादित करें। ग्रब फ़ाइल लाइन को इंगित करने के लिए +1।
फ़ारून

2
EC2 पर उन लोगों के लिए एक अपडेट, Cloudimg फ़ाइल /etc/default/grub.d/50-cloudimg-settings.cfg जोड़ता है जो सेटिंग्स को ओवरराइड करता है / etc / default / grub में फ़ाइल को जोड़ने के लिए /etc/default/grub.d/ 99-पारदर्शी-विशालपृष्ठ। सामग्री के साथ GRUB_CMDLINE_LINUX_DEFAULT = "$ GRUB_CMDLINE_LINUX_DEFAULT पारदर्शी_hugepage = never" इसे हल करेगा।
रॉकी

13

मैं सिर्फ इस सवाल को जोड़ना चाहता था क्योंकि मैं मारकोब के साथ टोकेबीडी को सक्षम करने के लिए CentOS v6 पर पारदर्शी विशालपदों को निष्क्रिय करने की कोशिश कर रहा था। मैंने @slm द्वारा उल्लिखित स्क्रिप्ट को जोड़ा /etc/rc.localऔर यह पारदर्शी विशालताओं को अक्षम कर दिया। हालाँकि, जिस तरह से लिनक्स में स्टार्टअप स्क्रिप्ट काम करती है, /etc/rc.localउसे सभी सेवाओं के शुरू होने के बाद निष्पादित किया जाता है। इसलिए, पारदर्शी विशाल पृष्ठों को अक्षम किया जा रहा था, क्योंकि MariaDB पहले ही शुरू हो चुका था और TokuDB इंजन आरंभ नहीं करेगा। पारदर्शी विशालपृष्ठों को निष्क्रिय करने का एकमात्र तरीका transparent_hugepage=neverकर्नेल पैरामीटर को जोड़कर है।

मैंने @ Rwky की टिप्पणी पर ध्यान दिया You can make the first option survive kernel updates by adding transparent_hugepage=never to the GRUB_CMDLINE_LINUX_DEFAULT option in /etc/default/grub on most distributions.और पाया कि CentOS /etc/default/grubफ़ाइल का समर्थन नहीं करता है और transparent_hugepage=neverइसे अपडेट किए जाने पर कर्नेल मापदंडों से गायब होने के बारे में चिंतित था । लेकिन चिंता की कोई बात नहीं है, CentOS को ग्रब में कर्नेल मापदंडों में किए गए किसी भी बदलाव को रखने के लिए सेटअप किया जाता है, ताकि जब यह अपडेट हो जाए तो उन्हें रखा जाए।

जोड़ने के लिए, ग्रब के लिए कर्नेल मापदंडों को संशोधित करने का उचित तरीका है grubby। मैंने इस सरल स्क्रिप्ट transparent_hugepage=neverको प्रत्येक कर्नेल के साथ जोड़ने के लिए बनाया grubby:

#!/bin/sh

if [[ $EUID -ne 0 ]]; then
   echo "This script must be run as root" 1>&2
   exit 1
fi

for KERNEL in /boot/vmlinuz-*; do
    grubby --update-kernel="$KERNEL" --args='transparent_hugepage=never'
done

इस तरह के एक विकल्प के लिए मैं अभी भी कोशिश करूंगा और इसे / etc/sysctl.confसे जोड़ दूंगा क्योंकि यह लगातार किसी भी कर्नेल पर लागू होगा जिसे कभी भी बॉक्स पर स्थापित किया जा सकता है।
स्लम

मैं सिर्फ यह जोड़ना चाहता था कि यदि आप <code> / etc / default / grub </ code> फ़ाइल को संशोधित करते हैं, तो आपको grub के grub-mkconfigलिए वास्तविक कॉन्फ़िगरेशन फ़ाइल बनाने के लिए 'root' के रूप में चलना होगा ।
सीटटलगूचो

3
EC2 ubuntu उदाहरण के लिए, मुझे इसे काम करने के लिए /etc/default/grub.d/50-cloudimg-settings.cfgफ़ाइल को संशोधित /etc/default/grubकरना होगा।
zhengyue

मैं CentOS 6.6 का उपयोग कर रहा हूं। मैंने संशोधित किया है, /etc/rc.localलेकिन यह मेरे लिए काम नहीं कर रहा है। क्या आप कृपया मुझे मूल मामले की व्याख्या कर सकते हैं।
संदीप सिंह

@ s.singh जैसा कि मैंने कहा /etc/rc.local is executed after all the services are startedकि इसे कर्नेल स्तर पर अक्षम करने की आवश्यकता है
ub3rst4r

6

यहाँ कठपुतली का उपयोग कर एक कार्यान्वयन है:

exec { "disable_transparent_hugepage_enabled":
  command => "/bin/echo never > /sys/kernel/mm/transparent_hugepage/enabled",
  unless  => "/bin/grep -c '\[never\]' /sys/kernel/mm/transparent_hugepage/enabled 2>/dev/null",
}

exec { "disable_transparent_hugepage_defrag":
  command => "/bin/echo never > /sys/kernel/mm/transparent_hugepage/defrag",
  unless  => "/bin/grep -c '\[never\]' /sys/kernel/mm/transparent_hugepage/defrag 2>/dev/null",
}

6

उपरोक्त सभी ने EC2 Ubuntu 16.04 पर मेरे लिए काम नहीं किया, लेकिन यह किया:

sudo apt install hugepages
sudo hugeadm --thp-never

4

चूँकि कर्नेल लाइन transparent_hugepage=neverकेवल आधे हिस्से को ही निष्क्रिय करती है, जो मुझे चाहिए (दोनों, कष्टप्रद मोंगोडब फेल / लॉग्स के लिए), कि मैं systemdस्टार्टअप स्क्रिप्ट के माध्यम से नहीं बनी रही, लेकिन अब है echo never | sudo tee /sys/kernel/mm/transparent_hugepage/enabled:। यह या तो systemctl बूट स्क्रिप्ट में काम करता है (जब ठीक से एक में कॉन्फ़िगर किया जाता है /etc/systemd/system) या सीधे सीएलआई से होता है।


क्या आप कृपया अपने निर्देशों का विस्तार करके "ठीक से कॉन्फ़िगर की गई स्क्रिप्ट" भी शामिल कर सकते हैं और हर चीज को कैसे सेटअप करना है? आधिकारिक MongoDB निर्देश docs.mongodb.org/manual/tutorial/transparent-huge-pages पुराने तरीके को दिखाते हैं, जबकि अब यह सिस्टमड अधिक सामान्य है, इसे सिस्टमैड तरीके से रखना अच्छा होगा।
ssasa

3

रेडिस के मामले में, यह एक चेतावनी भी देता है जो THP को अक्षम करने का सुझाव देता है। लेकिन जैसा कि बग रिपोर्ट में कहा गया है , कई डिस्ट्रोस /etc/rc.localको सेवाओं के बाद निष्पादित किया जाता है और उन पर इसका कोई असर नहीं होता है जब तक वे फिर से शुरू नहीं करते हैं। यह भी ध्यान दें कि वर्चुअलाइज्ड वातावरण (उदाहरण के लिए Digitalocean) में आप GRUB सेटिंग्स को नियंत्रित नहीं कर सकते हैं।

इस मामले में समाधान पारदर्शी विशाल पृष्ठों को निष्क्रिय करने के लिए समर्पित init स्क्रिप्ट का उपयोग करता है क्योंकि यह पृष्ठ सेटिंग्स द्वारा सुझाता है । उदाहरण के लिए, रेडिस के लिए डेबियन इनिट स्क्रिप्ट:X-Start-Before

#!/bin/bash
### BEGIN INIT INFO
# Provides:          disable-thp
# Required-Start:    $local_fs
# Required-Stop:
# X-Start-Before:    redis-server
# Default-Start:     2 3 4 5
# Default-Stop:      0 1 6
# Short-Description: Disable THP
# Description:       disables Transparent Huge Pages (THP) on boot
### END INIT INFO

case $1 in
start)
  if [ -d /sys/kernel/mm/transparent_hugepage ]; then
    echo 'never' > /sys/kernel/mm/transparent_hugepage/enabled
    echo 'never' > /sys/kernel/mm/transparent_hugepage/defrag
  else
    return 0
  fi
;;
esac 

ठीक वही जो मेरे द्वारा खोजा जा रहा था।
17'17

2

धन्यवाद करने के लिए GitHub और PyYoshi
मैं systemd के लिए इस उदाहरण पाया

फ़ाइल बनाएँ

sudo vim /etc/systemd/system/disable-transparent-huge-pages.service

इसे सर्विस फाइल में डालें

[Unit]
Description=Disable Transparent Huge Pages

[Service]
Type=oneshot
ExecStart=/usr/bin/sh -c "/usr/bin/echo "never" | tee /sys/kernel/mm/transparent_hugepage/enabled"
ExecStart=/usr/bin/sh -c "/usr/bin/echo "never" | tee /sys/kernel/mm/transparent_hugepage/defrag"

[Install]
WantedBy=multi-user.target

डेबियन / ubuntu उपयोगकर्ताओं के लिए

[Unit]
Description=Disable Transparent Huge Pages

[Service]
Type=oneshot
ExecStart=/bin/sh -c "/usr/bin/echo "never" | tee /sys/kernel/mm/transparent_hugepage/enabled"
ExecStart=/bin/sh -c "/usr/bin/echo "never" | tee /sys/kernel/mm/transparent_hugepage/defrag"

[Install]
WantedBy=multi-user.target

फिर सेवा को सक्षम करें

systemctl enable disable-transparent-huge-pages
systemctl start disable-transparent-huge-pages
systemctl status disable-transparent-huge-pages

1

यदि आप समस्या के साथ मिलते हैं

-bash: /sys/kernel/mm/transparent_hugepage/khugepaged/defrag: Permission denied

sudo के साथ भी, नीचे दिए गए आदेशों को आज़माएं:

sudo /bin/bash -c 'echo never > /sys/kernel/mm/transparent_hugepage/enabled'
sudo /bin/bash -c 'echo never > /sys/kernel/mm/transparent_hugepage/defrag'

नमस्ते, यूनिक्स एसई पर आपका स्वागत है! ध्यान दें, यह बहुत बेहतर होगा यदि आप यह भी बताएंगे कि आपके आदेश क्या कर रहे हैं।
user259412

1

यहाँ एक त्वरित हैक के लिए है Ansible (मैं एक टेम्पलेट के लिए प्रबंधन नहीं जाना चाहता /etc/rc.local):

- name: Disable Transparent Huge Pages at boot
  lineinfile:
    dest: /etc/rc.local
    line: "if [ -d /sys/kernel/mm/transparent_hugepage ]; then echo 'never' > /sys/kernel/mm/transparent_hugepage/enabled ; echo 'never' > /sys/kernel/mm/transparent_hugepage/defrag ; fi"
  register: transparent_hugepage
- name: Disable disabled rc.local
  lineinfile:
    dest: /etc/rc.local
    line: 'exit 0'
    state: absent
- name: Disable Transparent Huge Pages at run time 1/2
  command: echo never > /sys/kernel/mm/transparent_hugepage/defrag
  when: transparent_hugepage|changed
- name: Disable Transparent Huge Pages at run time 2/2
  command: echo never > /sys/kernel/mm/transparent_hugepage/enabled
  when: transparent_hugepage|changed

0

YAST और GRUB बूटलोडर के साथ SLES11 SP3 में हमें transparent_hugepage=never[YAST-bootloader-edit- लाइन को वैकल्पिक कर्नेल पैरामीटर के साथ] जोड़ना होगा । नोट: यह उपकरण फ़ाइल को बदलता है /boot/grub/menu.lst

इस परिवर्तन को करने और रिबूट करने के बाद ही टीएचपी को अक्षम किया गया।


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