“/ sys / kernel / mm / transparent_hugepage / enabled”를 수정하는 방법


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
이것은 AWS EC2 인스턴스의 Ubuntu 14.04에서는 아무런 효과가 없었습니다. sysfs.conf에 대해 잘 모르지만 Ubuntu 지원 구성 인 것 같지만 파일이 이전에 시스템에 존재하지 않았으므로 파일을 추가하고 재부팅해도 mongo 출력 경고가 전혀 변경되지 않았습니다. 또한 아래의 clayzermk1의 조언을 시도해보십시오. '조각 모음'경고는 여전히 나타납니다. 공식 mongo docs init 스크립트는 두 가지 경고를 모두 제거했습니다.
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/sysutils. 우분투 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/

"선호하는"방법은 GRUB 구성을 다시 빌드 하기 위해 편집 /etc/default/grub및 추가 한 후 실행 하는 것입니다.transparent_hugepage=neverGRUB_CMDLINE_LINUX_DEFAULTupdate-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에 대한 래퍼입니다 grub-mkconfig. grub-mkconfig의 항목을 읽어 오기 /etc/default/grub에서 사람들과 /etc/default/grub.d/*. 우연히 AWS에서 실행중인 경우 대신 편집해야합니다 /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에서 저를 위해 일했습니다.


DigitalOcean의 원 클릭 MongoDB 응용 프로그램 서버 에서이 작업을 시도했지만 작동하지 않았습니다. 여전히 같은 경고 메시지가 나타납니다.
scaryguy

EC2와 대한 부분 주셔서 감사합니다50-cloudimg-settings.cfg
마틴 코네 크니

16

다음은 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

이 솔루션은 시스템 대신 Upstart init 솔루션을 사용하는 Ubuntu 14.04 에는 적합 하지 않습니다 .


1
체계적인 수정 프로그램은 최신 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
이것에 관한 설정 파일이 있습니까? rc.localrc.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 쉘은 "** 경고 : / sys / kernel / mm / transparent_hugepage / defrag는 '항상'입니다"라고 알려줍니다.
Feng Yu


0

GRUB은 업그레이드 후 변경되며 rc.local은 mongo가 시작된 후에 만 ​​실행되므로 rc.local 끝에 서비스 mongo restart를 추가해야합니다.

테스트 인 경우 -f / sys / kernel / mm / transparent_hugepage / enabled; 그때
  echo never> / sys / kernel / mm / transparent_hugepage / enabled
fi

테스트 경우 -f / sys / kernel / mm / transparent_hugepage / defrag; 그때
   echo never> / sys / kernel / mm / transparent_hugepage / defrag
fi

대기 1 && servie mongod 재시작

또는 누군가 우분투 14.04의 초기화 스크립트에 위의 줄을 성공적으로 추가 했습니까?


0

Ansible을 사용하여 머신을 배포하기 때문에 rc 파일을 수정하는 것을 좋아하지 않습니다.

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

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)를 다시 시작 하고 완료하십시오.


이 솔루션은 "Upstart"init 시스템을 사용하는 반면, Ubuntu 16.04는 systemd init 시스템을 기반으로합니다.
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.