ฉันจะแก้ไข“ / sys / kernel / mm / transparent_hugepage / เปิดใช้งาน” ได้อย่างไร


50

ฉันใช้ mongodb 3.0 และพบคำเตือน:

MongoDB shell version: 3.0.0
connecting to: test
Server has startup warnings: 
2015-03-13T16:28:29.405+0800 I CONTROL  [initandlisten] 
2015-03-13T16:28:29.406+0800 I CONTROL  [initandlisten] ** WARNING: /sys/kernel/mm/transparent_hugepage/enabled is 'always'.
2015-03-13T16:28:29.406+0800 I CONTROL  [initandlisten] **        We suggest setting it to 'never'
2015-03-13T16:28:29.406+0800 I CONTROL  [initandlisten] 
2015-03-13T16:28:29.407+0800 I CONTROL  [initandlisten] ** WARNING: /sys/kernel/mm/transparent_hugepage/defrag is 'always'.
2015-03-13T16:28:29.407+0800 I CONTROL  [initandlisten] **        We suggest setting it to 'never'
2015-03-13T16:28:29.407+0800 I CONTROL  [initandlisten]

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

~# cat /sys/kernel/mm/transparent_hugepage/defrag
[always] madvise never

ฉันพยายามใช้ echo แต่มันไม่ถาวรหลังจากรีบูตมันจะถูกรีเซ็ต

echo never > /sys/kernel/mm/transparent_hugepage/defrag

ฉันจะแก้ไข/sys/kernel/mm/transparent_hugepage/enabledอย่างถาวรได้อย่างไร


1
อาจจะมีคำตอบที่ดีด้านล่าง แต่ IMO คุณควรจะมีดูที่เอกสารอย่างเป็นทางการของ MongoDB: docs.mongodb.org/master/tutorial/transparent-huge-pages
hgoebl

คำตอบ:


70

คุณสามารถ

  1. ติดตั้งsysfsutilsแพคเกจ:

    sudo apt install sysfsutils
    
  2. และต่อท้ายบรรทัดที่มีการตั้งค่าเพื่อ/etc/sysfs.conf:

    kernel/mm/transparent_hugepage/enabled = never
    

นี่เป็นโซลูชันที่สะอาดที่สุดเนื่องจากเก็บการกำหนดค่า sysfs ทั้งหมดไว้ในที่เดียวแทนที่จะใช้สคริปต์เริ่มทำงานที่กำหนดเอง คำตอบอื่น ๆ ที่มีสคริปต์และนิพจน์แบบมีเงื่อนไขนั้นเหมาะสมถ้าคุณไม่ทราบว่าเส้นทางใดที่เคอร์เนลจะเปิดเผยการตั้งค่านั้นเช่นหากคุณไม่มีความคิดคร่าวๆเกี่ยวกับเวอร์ชันเคอร์เนลที่ทำงานอยู่บนเครื่องที่ได้รับผลกระทบ


4
นี่ไม่ได้ทำอะไรกับฉันใน Ubuntu 14.04 ในอินสแตนซ์ของ AWS EC2 ฉันไม่ค่อยรู้เรื่อง sysfs.conf มากนัก แต่ดูเหมือนว่ามันจะเป็นการตั้งค่าที่รองรับของ Ubuntu แต่ไฟล์นั้นไม่ได้อยู่ในระบบของเราก่อนหน้านี้และการเพิ่มและการรีบูตเครื่องก็ไม่เปลี่ยนคำเตือนเอาต์พุต mongo เลย ลองคำแนะนำของ Clayzermk1 ด้านล่างคำเตือน 'defrag' ยังคงปรากฏอยู่ สคริปต์เริ่มต้น Mongo docs อย่างเป็นทางการได้ลบคำเตือนทั้งสองแล้ว
Neek

ผลลัพธ์ของcat /sys/kernel/mm/transparent_hugepage/enabledอะไร มันมีอยู่หรือไม่? ได้รับการประเมินตามปกติโดยที่บูตsysfs.conf /etc/init.d/sysutilsมันเปิดใช้งานหรือไม่ จะเกิดอะไรขึ้นเมื่อคุณเรียก/etc/init.d/sysutils start?
David Foerster

3
ฉันยังไม่ได้มีไฟล์และsysfs.conf /etc/init.d/sysutilsubuntu 16.04
HEX

1
@unhammer: ไม่ทั้งสองมีขอบเขตที่แตกต่างกัน sysctlสำหรับการตั้งค่าที่คุณสามารถทำได้ด้วยพารามิเตอร์ของเคอร์เนล สำหรับรายการในsysfs.conf /sys
David Foerster

1
@navossoc: คุณช่วยเปิดคำถามใหม่ได้ไหมถ้าคุณมีคำถามใหม่หรือคำถามติดตาม? ส่วนความคิดเห็นไม่เหมาะสมหรือมีความหมายสำหรับคำถามใหม่หรือการอภิปรายเพิ่มเติม คุณสามารถส่งความคิดเห็นพร้อมแจ้งเตือนเพื่อดึงความสนใจของฉันไปที่ฉัน ขอบคุณ
David Foerster

25

เอกสาร MongoDB มีคำแนะนำเล็กน้อย http://docs.mongodb.org/manual/reference/transparent-huge-pages/

"ความต้องการ" วิธีการคือการแก้ไข/etc/default/grubและผนวกtransparent_hugepage=neverไปGRUB_CMDLINE_LINUX_DEFAULTแล้วเรียกใช้update-grubเพื่อสร้างการกำหนดค่าด้วง

สองซับต่อไปนี้จะทำเช่นนั้น ตรวจสอบให้แน่ใจเพื่อตรวจสอบผลลัพธ์!

sed -r 's/GRUB_CMDLINE_LINUX_DEFAULT="[a-zA-Z0-9_= ]*/& transparent_hugepage=never/' /etc/default/grub | sudo tee /etc/default/grub
sudo update-grub

โปรดทราบว่าเป็นเสื้อคลุมสำหรับupdate-grub จะข่มขี่รายการในกับผู้ที่มาจาก ถ้าโดยโอกาสที่คุณกำลังทำงานอยู่บน AWS, คุณจะต้องแก้ไขแทนgrub-mkconfiggrub-mkconfig/etc/default/grub/etc/default/grub.d/*/etc/default/grub.d/50-cloudimg-settings.cfg

วิธี "ทางเลือก" คือการแก้ไข/etc/rc.localและเพิ่มสิ่งต่อไปนี้ก่อนหน้าexit 0:

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

โดยส่วนตัวแล้วฉันลงเอยด้วยการทำทั้งวิธี "ที่ต้องการ" และ "ทางเลือก" เนื่องจากพวกเขาไม่ได้เป็นผู้ใช้ร่วมกันโดยเฉพาะและมันกำจัดคำเตือนเกี่ยวกับการจัดเรียงข้อมูล

ทำงานกับฉันใน Ubuntu 14.04, MongoDB 3.0.2 และ AWS


ฉันลองสิ่งนี้ในแอปพลิเคชันเซิร์ฟเวอร์ MongoDB ในคลิกเดียวของฉันบน DigitalOcean และไม่ทำงาน ยังคงได้รับข้อความเตือนเดียวกัน
scaryguy

ขอบคุณสำหรับส่วนที่เกี่ยวกับ EC2 และ50-cloudimg-settings.cfg
Martin Konecny

16

นี่คือวิธีการแก้ปัญหาที่ได้รับการทดสอบการทำงานบน Ubuntu 16.04 บน AWS EC2 Ubuntu 16.04 ใช้ระบบ systemd init และไฟล์กำหนดค่านี้แสดงว่าควรเปลี่ยนการตั้งค่าเหล่านี้ก่อนที่ MongoDB จะบู๊ต

สร้างชื่อไฟล์/etc/systemd/system/mongodb-hugepage-fix.serviceและเพิ่มเนื้อหาต่อไปนี้:

[Unit]
Description="Disable Transparent Hugepage before MongoDB boots"
#WARN: check service name on your system
# If you are using MongoDB Cloud, service name is "mongodb-mms-automation-agent.service"
Before=mongodb.service      

[Service]
Type=oneshot
ExecStart=/bin/bash -c 'echo never > /sys/kernel/mm/transparent_hugepage/enabled'
ExecStart=/bin/bash -c 'echo never > /sys/kernel/mm/transparent_hugepage/defrag'

[Install]
#WARN: check service name on your system
# If you are using MongoDB Cloud, service name is "mongodb-mms-automation-agent.service"
RequiredBy=mongodb.service

ในการโหลดไฟล์เข้าสู่ systemd:

systemctl daemon-reload

เพื่อเปิดใช้งานไฟล์เป็นการพึ่งพาเวลาบูตของ MongoDB

systemctl enable mongodb-hugepage-fix

หากคุณต้องการเปิดใช้งานการเปลี่ยนแปลงทันที (ก่อนบู๊ตครั้งถัดไป)

systemctl start mongodb-hugepage-fix
systemctl restart mongod

โซลูชันนี้ไม่เหมาะสำหรับ Ubuntu 14.04 ซึ่งใช้โซลูชัน init พุ่งพรวดแทนที่จะเป็น systemd


1
การแก้ไข systemd นั้นสมบูรณ์แบบสำหรับการติดตั้ง MongoDB ที่ทันสมัยขอบคุณ
four43

7

ผนวกบรรทัดต่อไปนี้ลงใน /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

สิ่งนี้จะทำงานเมื่อคุณรีบูตเซิร์ฟเวอร์


1
มีไฟล์ config เกี่ยวกับเรื่องนี้หรือไม่? rc.localไม่ใช่ความคิดที่ดีเพราะ rc.local จะทำงานเมื่อสิ้นสุดระบบ ดังนั้นบริการ mongodb จะยังคงใช้การตั้งค่าเริ่มต้น
Feng Yu

2
แก้ไขไฟล์ / etc / default / grub และทำการเปลี่ยนแปลงบรรทัด "GRUB_CMDLINE_LINUX_DEFAULT =" transparent_hugepage = never "และเรียกใช้คำสั่ง update-grub จากนั้นรีสตาร์ทเซิร์ฟเวอร์
PKumar

2
ขอบคุณมันใช้งานได้ แต่มีวิธีที่คล้ายกันในการแก้ไข/sys/kernel/mm/transparent_hugepage/defragหรือไม่ เมื่อฉันรีบูต mongo shell ยังบอกฉันด้วย "** คำเตือน: / sys / kernel / mm / transparent_hugepage / defrag คือ 'always'"
Feng Yu

@FengYu ลองใช้หน้านี้docs.mongodb.org/manual/tutorial/transparent-huge-pages
PKumar

0

GRUB จะเปลี่ยนหลังจากการอัพเกรดและ rc.local จะทำงานหลังจากเริ่ม mongo เท่านั้นดังนั้นบางทีเราควรเพิ่ม mongo เริ่มบริการที่ส่วนท้ายของ rc.local เช่นนี้

ถ้าทดสอบ -f / sys / kernel / mm / transparent_hugepage / เปิดใช้งาน; แล้วก็
  echo never> / sys / kernel / mm / transparent_hugepage / เปิดใช้งาน
Fi

ถ้าทดสอบ -f / sys / kernel / mm / transparent_hugepage / defrag; แล้วก็
   echo never> / sys / kernel / mm / transparent_hugepage / defrag
Fi

รอ 1 && servie mongod รีสตาร์ท

หรืออาจมีคนเพิ่มบรรทัดด้านบนเพื่อเริ่มต้นสคริปต์ใน Ubuntu 14.04 สำเร็จหรือไม่


0

เนื่องจากเรากำลังปรับใช้เครื่องจักรด้วย Ansible ฉันไม่ชอบการแก้ไขไฟล์ rc

ฉันพยายามใช้sysfsutils/ sysfs.confแต่พบปัญหาเกี่ยวกับเวลาเมื่อเริ่มบริการบนเครื่องที่รวดเร็ว (หรือเครื่องช้า) ดูเหมือนว่าบางครั้ง mongod ก็เริ่มต้นก่อน sysfsutils บางครั้งมันทำงานได้บางครั้งก็ไม่ได้

ตั้งแต่ mongod เป็นกระบวนการพุ่งพรวดฉันพบว่าทางออกที่สะอาดที่สุดคือการเพิ่มไฟล์ที่/etc/mongo_vm_settings.confมีเนื้อหาดังต่อไปนี้:

# Ubuntu upstart file at /etc/init/mongod_vm_settings.conf
#
#   This file will set the correct kernel VM settings for MongoDB
#   This file is maintained in Ansible

start on (starting mongod)
script
  echo "never" > /sys/kernel/mm/transparent_hugepage/enabled
  echo "never" > /sys/kernel/mm/transparent_hugepage/defrag
end script

สิ่งนี้จะเรียกใช้สคริปต์ก่อนที่ mongod จะเริ่มทำงาน รีสตาร์ท mongod ( sudo service mongod restart) และเสร็จสิ้น


โปรดทราบว่าการแก้ปัญหานี้ใช้ระบบเริ่มต้น "พุ่งพรวด" ในขณะที่ Ubuntu 16.04 ขึ้นอยู่กับระบบเริ่มต้น systemd
Mark Stosberg

0

หลังจากอ่านเล็กน้อยในบันทึกคำเตือนฉันได้เพิ่มสองบรรทัดนี้ใน/etc/sysfs.confy voilá

kernel/mm/transparent_hugepage/enabled = never
kernel/mm/transparent_hugepage/defrag = never

รีบูทเครื่องหลังจากใช้การเปลี่ยนแปลงเหล่านี้


ยังคงต้องการsysfsutilsแพ็คเกจ (ดูคำตอบของฉัน)
David Foerster

แน่นอนว่าเป็นสิ่งจำเป็น
Ulv3r
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.