vô hiệu hóa các vòng đệm trong suốt


63

Chúng tôi đang cài đặt SAP HANA trong một máy RAID . Là một phần của bước cài đặt, nó được đề cập rằng,

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

Vì vậy, thay vì thời gian chạy, nếu tôi muốn biến điều này thành một thay đổi vĩnh viễn, tôi có nên thêm dòng trên vào trong /proc/vmstattệp không?


2
Lưu ý rằng nếu bạn đang sử dụng một số giải pháp được đề cập ở đây, trên một hệ thống cũng chạy 'điều chỉnh', điều chỉnh có thể ghi đè các giải pháp đó. Xem tại đây để biết thêm thông tin: bugzilla.redhat.com/show_orms.cgi?id=1189868
Dejay Clayton

Câu trả lời:


80

Để thực hiện các tùy chọn như vĩnh viễn này, bạn thường sẽ thêm chúng vào tệp /etc/sysctl.conf. Bạn có thể thấy một danh sách đầy đủ các tùy chọn có sẵn bằng lệnh này:

$ sysctl -a

Thí dụ

$ 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

Bạn có thể tìm kiếm hugepagetrong đầu ra như vậy:

$ 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

Nó không có ở đó à?

Tuy nhiên nhìn qua đầu ra tôi không thấy transparent_hugepage. Googling thêm một chút tôi đã đi qua trang Oracle này thảo luận về chính chủ đề này. Trang này có tiêu đề: Định cấu hình HugePages cho Oracle trên Linux (x86-64) .

Cụ thể trên trang đó họ đề cập đến cách vô hiệu hóa tính năng hugepage .

đoạn trích

Phương pháp ưa thích để vô hiệu hóa Huge HugePages là thêm "trong suốt_hugepage = never" vào dòng khởi động kernel trong tệp "/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

Máy chủ phải được khởi động lại để điều này có hiệu lực.

Ngoài ra, bạn có thể thêm lệnh vào /etc/rc.localtập tin của bạn .

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

Tôi nghĩ rằng tôi sẽ đi với tùy chọn thứ 2, vì tùy chọn đầu tiên sẽ có nguy cơ bị hủy đặt khi bạn nâng cấp từ hạt nhân này sang hạt nhân tiếp theo.

Bạn có thể xác nhận rằng nó hoạt động với lệnh sau sau khi khởi động lại:

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

7
Bạn có thể thực hiện tùy chọn đầu tiên tồn tại các bản cập nhật kernel bằng cách thêm trong suốt_hugepage = không bao giờ vào tùy chọn GRUB_CMDLINE_LINUX_DEFAULT trong / etc / default / grub trên hầu hết các bản phân phối.
Rwky

2
Nếu đầu ra cat /sys/kernel/mm/transparent_hugepage/enabled[always] madvise never, thì trạng thái là alwayshoặc nó được bật (lưu ý các []dấu ngoặc xung quanh always)
ub3rst4r

4
Đừng nhầm lẫn giữa những cái ôm và những cái ôm trong suốt. Cái sau có thể gây ra nhiều vấn đề, chủ yếu là sử dụng CPU cao trong khi liên tục cố gắng chống phân mảnh bộ nhớ và chuyển đổi các trang 4kB bình thường thành các trang 2MB khổng lồ.
Marki555

2
@Rwky - khi điều chỉnh theo đề xuất của bạn - Tôi sẽ nhấn mạnh hành động tiếp theo sau khi lưu tệp là thực thi sudo update-grubđể có được các cài đặt mới "được viết bằng đá". +1 để trỏ dòng tệp grub.
Faron

2
Một bản cập nhật cho những người trên EC2, cloudimg thêm tệp /etc/default/grub.d/50-cloudimg-sinstall.cfg, ghi đè cài đặt trong / etc / default / grub thêm tệp /etc/default/grub.d/ 99-minh bạch
Rwky

13

Tôi chỉ muốn thêm vào câu hỏi này khi tôi đang cố gắng vô hiệu hóa các vòng đệm trong suốt trên CentOS v6 để kích hoạt TokuDB cho MariaDB. Tôi đã thêm tập lệnh được đề cập bởi @slm /etc/rc.localvà nó đã vô hiệu hóa các tệp trong suốt. Tuy nhiên, do cách các kịch bản khởi động hoạt động trong Linux, /etc/rc.localđược thực thi sau khi tất cả các dịch vụ được khởi động. Do đó, các trang lớn trong suốt đã bị vô hiệu hóa sau khi MariaDB đã được khởi động và công cụ TokuDB sẽ không khởi tạo. Cách duy nhất khác để vô hiệu hóa các vòng đệm trong suốt là bằng cách thêm transparent_hugepage=nevervào tham số kernel.

Tôi nhận thấy bình luận của @ 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.và phát hiện ra rằng CentOS không hỗ trợ /etc/default/grubtệp và lo lắng về việc transparent_hugepage=neverbiến mất khỏi các tham số kernel khi được cập nhật. Nhưng đừng lo lắng, CentOS được thiết lập để giữ bất kỳ thay đổi nào được thực hiện đối với các tham số kernel trong grub để khi nó được cập nhật, chúng sẽ được giữ.

Để thêm, cách thích hợp để sửa đổi các tham số kernel cho grub là với grubby. Tôi đã tạo tập lệnh đơn giản này để thêm transparent_hugepage=nevervào từng kernel với 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

Đối với một tùy chọn như thế này, tôi vẫn có thể thử và thêm nó vào / etc/sysctl.confvì điều đó sẽ được áp dụng nhất quán cho bất kỳ Kernel nào có thể được cài đặt trên hộp.
slm

Tôi chỉ muốn thêm rằng nếu bạn sửa đổi tệp <code> / etc / default / grub </ code>, bạn cần chạy grub-mkconfigdưới dạng 'root' để tạo tệp cấu hình thực tế cho grub.
Seattlegaucho

3
Đối với phiên bản EC2 ubfox, tôi phải sửa đổi /etc/default/grub.d/50-cloudimg-settings.cfgtệp thay vì /etc/default/grubđể nó hoạt động.
zhengyue

Tôi đang sử dụng CentOS 6.6. Tôi đã sửa đổi /etc/rc.localnhưng nó không làm việc cho tôi. Bạn có thể vui lòng giải thích trường hợp gốc cho tôi.
Sandeep Singh

@ s.singh Như tôi đã nói /etc/rc.local is executed after all the services are startedvì vậy nó cần được tắt ở cấp kernel
ub3rst4r

6

Đây là một triển khai sử dụng con rối:

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

Tất cả những điều trên không hoạt động với tôi trên EC2 Ubuntu 16.04, nhưng điều này đã làm:

sudo apt install hugepages
sudo hugeadm --thp-never

4

Vì dòng kernel transparent_hugepage=neverchỉ vô hiệu hóa một nửa những gì tôi cần (cả hai, đối với lỗi / nhật ký mongodb gây phiền nhiễu), nên tôi đã không kiên trì thông qua systemdtập lệnh khởi động nhưng giờ đã có : echo never | sudo tee /sys/kernel/mm/transparent_hugepage/enabled. Nó hoạt động trong một trong hai tập lệnh khởi động systemctl (khi được cấu hình đúng một trong /etc/systemd/system) hoặc trực tiếp từ cli.


Bạn có thể vui lòng mở rộng hướng dẫn của mình để bao gồm "tập lệnh được cấu hình đúng" và các bước để thiết lập mọi thứ không? Các hướng dẫn chính thức của MongoDB docs.mongodb.org/manual/tutorial/transparent-huge-pages hiển thị theo cách cũ, trong khi bây giờ systemd phổ biến hơn, sẽ rất tuyệt nếu có cách này theo cách systemd.
ssasa

3

Trong trường hợp của Redis, nó cũng phát ra một cảnh báo đề nghị vô hiệu hóa THP. Nhưng như đã lưu ý trong báo cáo lỗi , trên nhiều bản phân phối /etc/rc.localđược thực thi sau các dịch vụ và nó không có tác dụng gì với chúng cho đến khi chúng khởi động lại. Cũng lưu ý rằng trong môi trường ảo hóa (ví dụ Digitalocean), bạn không thể kiểm soát cài đặt GRUB.

Giải pháp trong trường hợp đó là sử dụng tập lệnh init chuyên dụng để vô hiệu hóa các trang lớn trong suốt như trang này gợi ý, theo cài đặt X-Start-Before. Ví dụ: tập lệnh init Debian cho Redis:

#!/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 

Chính xác những gì tôi đang tìm kiếm.
nelaaro

2

Nhờ github & PyYoshi
tôi đã tìm thấy ví dụ này cho systemd

Tạo tập tin

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

Đặt nó vào tập tin dịch vụ

[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

Dành cho người dùng debian / ubfox

[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

Sau đó kích hoạt dịch vụ

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

1

Nếu bạn gặp vấn đề

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

ngay cả với sudo, hãy thử các lệnh dưới đây:

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

Xin chào, chào mừng bạn đến với Unix SE! Lưu ý, sẽ tốt hơn nhiều nếu bạn cũng giải thích, các lệnh của bạn đang làm gì.
dùng259412

1

Đây là một bản hack nhanh cho Ansible (Tôi không muốn quản lý một mẫu cho /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

Trong SLES11 SP3 với bộ tải khởi động YAST và GRUB, chúng ta phải thêm transparent_hugepage=nevervào [YAST-bootloader-edit- line với tham số kernel tùy chọn]. LƯU Ý: Công cụ này thay đổi tập tin /boot/grub/menu.lst.

Chỉ sau khi thực hiện thay đổi này và khởi động lại dẫn đến vô hiệu hóa THP.


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.