"/sys/kernel/mm/transparent_hugepage/enabled"를 어떻게 수정합니까?

"/sys/kernel/mm/transparent_hugepage/enabled"를 어떻게 수정합니까?

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 never > /sys/kernel/mm/transparent_hugepage/defrag

영구적으로 수정하려면 어떻게 해야 합니까 /sys/kernel/mm/transparent_hugepage/enabled?

답변1

당신은 할 수 있습니다

  1. 패키지 를 설치하십시오 sysfsutils:

    sudo apt install sysfsutils
    
  2. 해당 설정이 포함된 줄을 다음 항목에 추가합니다 /etc/sysfs.conf.

    kernel/mm/transparent_hugepage/enabled = never
    

이는 사용자 정의 시작 스크립트에 의존하는 대신 모든 sysfs 구성을 한 곳에 유지하므로 가장 깔끔한 솔루션입니다. 스크립트와 조건식을 사용하는 다른 답변은 커널이 해당 설정을 노출할 경로를 모르는 경우, 즉 영향을 받는 시스템에서 실행 중인 커널 버전에 대한 대략적인 아이디어조차 없는 경우에 적합합니다.

답변2

MongoDB 문서에는 몇 가지 제안이 있습니다.http://docs.mongodb.org/manual/reference/transparent-huge-pages/

"선호되는" 방법은 편집 /etc/default/grub하고 추가한 transparent_hugepage=never다음 GRUB_CMDLINE_LINUX_DEFAULT실행하여 update-grubGRUB 구성을 다시 빌드하는 것입니다.

다음 두 개의 라이너가 바로 그 일을 할 것입니다. 출력을 꼭 확인하세요!

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대한 래퍼입니다 grub-mkconfig. 의 항목과 함께 grub-mkconfig항목을 방해합니다 . 우연히 AWS에서 실행 중인 경우에는 대신 ./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에서 저를 위해 일했습니다.

답변3

다음은 AWS EC2의 Ubuntu 16.04에서 작동하도록 테스트된 솔루션입니다. 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

이 솔루션은~ 아니다systemd 대신 Upstart init 솔루션을 사용하는 Ubuntu 14.04에 적합합니다.

답변4

Ansible을 사용하여 머신을 배포하고 있으므로 rc 파일을 수정하는 것을 좋아하지 않습니다.

sysfsutils/를 사용해 보았지만 sysfs.conf빠른(또는 느린 컴퓨터)에서 서비스를 시작할 때 타이밍 문제가 발생했습니다. 때때로 mongod가 sysfsutils 이전에 시작된 것처럼 보였습니다. 때로는 효과가 있었고 때로는 그렇지 않았습니다.

/etc/mongo_vm_settings.confmongod는 신생 프로세스이므로 가장 깨끗한 솔루션은 다음 내용이 포함된 파일을 추가하는 것임을 알았습니다 .

# 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)를 다시 시작하고 완료합니다.

관련 정보