Làm cách nào để tôi sửa đổi / / sys / kernel / mm / suốt_hugepage / đã bật


50

Tôi sử dụng mongodb 3.0 và tôi thấy một cảnh báo:

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

Tôi cố gắng sử dụng echo, nhưng nó không vĩnh viễn, sau khi khởi động lại nó sẽ được thiết lập lại.

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

Làm thế nào để tôi sửa đổi /sys/kernel/mm/transparent_hugepage/enabledvĩnh viễn?


1
Có thể có câu trả lời hay dưới đây, nhưng IMO bạn nên xem tài liệu chính thức của MongoDB: docs.mongodb.org/master/tutorial/transparent-huge-pages
hgoebl

Câu trả lời:


70

Bạn có thể

  1. cài đặt sysfsutilsgói:

    sudo apt install sysfsutils
    
  2. và nối một dòng với cài đặt đó vào /etc/sysfs.conf:

    kernel/mm/transparent_hugepage/enabled = never
    

Đây là giải pháp sạch nhất, bởi vì nó giữ tất cả các cấu hình sysfs ở một nơi thay vì dựa vào các kịch bản khởi động tùy chỉnh. Các câu trả lời khác, với các tập lệnh và biểu thức điều kiện, phù hợp nếu bạn không biết thông qua đường dẫn nào kernel sẽ hiển thị cài đặt đó, tức là nếu bạn thậm chí không có ý tưởng sơ bộ về phiên bản kernel chạy trên máy bị ảnh hưởng.


4
Điều này không làm được gì cho tôi trên Ubuntu 14.04 trên phiên bản AWS EC2. Tôi không biết nhiều về sysfs.conf nhưng có vẻ như đó là cấu hình hỗ trợ Ubuntu, tuy nhiên tệp không tồn tại trên hệ thống của chúng tôi trước đó, và thêm nó và khởi động lại không thay đổi cảnh báo đầu ra mongo. Cũng đã thử lời khuyên của clayzermk1 bên dưới, cảnh báo 'defrag' vẫn xuất hiện. Kịch bản init tài liệu mongo chính thức đã loại bỏ cả hai cảnh báo.
Neek

Đầu ra của cat /sys/kernel/mm/transparent_hugepage/enabledcái gì? Nó có tồn tại không? sysfs.confthường được đánh giá khi khởi động bởi /etc/init.d/sysutils. Nó được kích hoạt? Điều gì xảy ra, khi bạn gọi /etc/init.d/sysutils start?
David Foerster

3
Tôi cũng không có sysfs.conftập tin và /etc/init.d/sysutils. ubfox 16.04
HEX

1
@unhammer: Không, hai cái có phạm vi khác nhau. sysctldành cho các cài đặt mà bạn cũng có thể đạt được với các tham số kernel; sysfs.conflà cho các mục trong /sys.
David Foerster

1
@navossoc: Bạn có thể vui lòng mở một câu hỏi mới nếu bạn có câu hỏi mới hoặc theo dõi không? Phần bình luận không phù hợp hoặc có nghĩa là cho các câu hỏi mới hoặc thảo luận mở rộng. Bạn được chào đón để gửi cho tôi một bình luận với một thông báo để thu hút sự chú ý của tôi đến nó. Cảm ơn.
David foerster

25

Các tài liệu MongoDB có một vài gợi ý. http://docs.mongodb.org/manual/reference/transparent-huge-pages/

Cách "ưa thích" là chỉnh sửa /etc/default/grubvà nối transparent_hugepage=nevervào GRUB_CMDLINE_LINUX_DEFAULTsau đó chạy update-grubđể xây dựng lại cấu hình GRUB.

Hai lớp lót sau đây sẽ làm điều đó. Hãy chắc chắn để xác minh đầu ra!

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

Lưu ý rằng đó update-grublà một gói cho grub-mkconfig. grub-mkconfigsẽ ghi lại các mục trong /etc/default/grubvới những người từ /etc/default/grub.d/*. Nếu tình cờ bạn đang chạy trên AWS, bạn sẽ cần phải chỉnh sửa /etc/default/grub.d/50-cloudimg-settings.cfg.

Phương pháp "thay thế" là chỉnh sửa /etc/rc.localvà thêm vào sau đây 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

Cá nhân, cuối cùng tôi đã thực hiện cả hai phương pháp "ưa thích" và "thay thế" vì chúng không loại trừ lẫn nhau và nó loại bỏ cảnh báo về phân mảnh.

* Làm việc cho tôi trên Ubuntu 14.04, MongoDB 3.0.2 và AWS.


Tôi đã thử điều này tại máy chủ ứng dụng MongoDB chỉ với một cú nhấp chuột trên DigitalOcean và nó không hoạt động. Vẫn nhận được thông điệp cảnh báo tương tự.
đáng sợ

Cảm ơn bạn về phần EC2 và50-cloudimg-settings.cfg
Martin Konecny

16

Đây là một giải pháp đã được thử nghiệm để hoạt động trên Ubuntu 16.04 trên AWS EC2. Ubuntu 16.04 sử dụng hệ thống init systemd và tệp cấu hình này biểu thị rằng các cài đặt này sẽ được thay đổi trước khi MongoDB khởi động.

Tạo một tệp có tên /etc/systemd/system/mongodb-hugepage-fix.servicevà thêm nội dung sau:

[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

Để tải tập tin vào systemd:

systemctl daemon-reload

Để kích hoạt tệp dưới dạng phụ thuộc thời gian khởi động của MongoDB

systemctl enable mongodb-hugepage-fix

Nếu bạn muốn kích hoạt các thay đổi ngay lập tức (trước lần khởi động tiếp theo)

systemctl start mongodb-hugepage-fix
systemctl restart mongod

Giải pháp này không phù hợp với Ubuntu 14.04, sử dụng giải pháp khởi động Up thay vì systemd.


1
Bản sửa lỗi systemd là hoàn hảo cho các bản cài đặt MongoDB hiện đại, cảm ơn bạn.
bốn43

7

Nối các dòng sau dưới đây vào /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

Điều này sẽ chạy khi bạn khởi động lại máy chủ.


1
Có một tập tin cấu hình về điều này? rc.localkhông phải là một ý tưởng tốt, bởi vì RC.local sẽ thực thi vào cuối hệ thống khởi động. Vì vậy, dịch vụ mongodb vẫn sẽ sử dụng cài đặt mặc định.
Feng Yu

2
chỉnh sửa tệp / etc / default / grub và thay đổi dòng "GRUB_CMDLINE_LINUX_DEFAULT =" suốt_hugepage = never "và chạy lệnh update-grub sau đó khởi động lại máy chủ
PKumar 18/03/2015

2
Cảm ơn, nó hoạt động. Nhưng, có một cách tương tự để sửa đổi /sys/kernel/mm/transparent_hugepage/defrag? Khi tôi khởi động lại, vỏ mongo cũng cho tôi biết "** CẢNH BÁO: / sys / kernel / mm / suốt_hugepage / defrag là 'luôn luôn'."
Feng Yu


0

GRUB sẽ thay đổi sau khi nâng cấp và RC.local sẽ chỉ chạy sau khi mongo được khởi động, vì vậy có lẽ chúng ta nên thêm dịch vụ khởi động lại vào cuối của RC.local như thế này

nếu test -f / sys / kernel / mm / suốt_hugepage / được bật; sau đó
  echo không bao giờ> / sys / kernel / mm / suốt_hugepage / được bật
fi

if test -f / sys / kernel / mm / suốt_hugepage / defrag; sau đó
   echo không bao giờ> / sys / kernel / mm / suốt_hugepage / defrag
fi

chờ 1 && servie mongod khởi động lại

hoặc có thể ai đó đã thêm thành công các dòng trên vào init script trong Ubuntu 14.04?


0

Vì chúng tôi đang triển khai các máy có Ansible, tôi không thích sửa đổi các tệp RC.

Tôi đã thử sử dụng sysfsutils/ sysfs.confnhưng gặp vấn đề về thời gian khi khởi động dịch vụ trên máy nhanh (hoặc máy chậm). Có vẻ như đôi khi mongod đã được bắt đầu trước khi sysfsutils. Đôi khi nó làm việc, đôi khi không.

Vì mongod là một quá trình mới nhất, tôi thấy rằng giải pháp sạch nhất là thêm tệp /etc/mongo_vm_settings.confcó nội dung sau:

# 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

Điều này sẽ chạy tập lệnh ngay trước khi mongod sẽ được bắt đầu. Khởi động lại mongod ( sudo service mongod restart) và thực hiện.


Lưu ý rằng giải pháp này sử dụng hệ thống init "Upstart", trong khi Ubuntu 16.04 dựa trên hệ thống init systemd.
Mark Stosberg

0

Sau khi đọc một chút trong nhật ký cảnh báo, tôi đã thêm hai dòng này vào /etc/sysfs.confy voilá

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

Khởi động lại máy sau khi áp dụng những thay đổi này.


Điều đó vẫn đòi hỏi sysfsutilsgói (xem câu trả lời của tôi).
David Foerster

chắc chắn là cần thiết
Ulv3r
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.