“/ sys / kernel / mm / transparent_hugepage / enabled”를 수정하는 방법 3.0.0 connecting to: test Server has startup

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. sysfsutils패키지를 설치하십시오 :

    sudo apt install sysfsutils
    
  2. 그 설정을 가진 라인을 추가 /etc/sysfs.conf:

    kernel/mm/transparent_hugepage/enabled = never
    

이 방법은 사용자 지정 시작 스크립트에 의존하지 않고 모든 sysfs 구성을 한 곳에 보관하기 때문에 가장 깨끗한 솔루션입니다. 스크립트와 조건식을 사용하는 다른 답변은 커널이 어떤 경로를 통해 해당 설정을 노출하는지 알 수없는 경우, 즉 영향을받는 시스템에서 실행중인 커널 버전에 대한 대략적인 아이디어가없는 경우에 적합합니다.


답변

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에서 저를 위해 일했습니다.


답변

다음은 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 에는 적합 하지 않습니다 .


답변

아래 행을 /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

서버를 재부팅 할 때 실행됩니다.


답변

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의 초기화 스크립트에 위의 줄을 성공적으로 추가 했습니까?


답변

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


답변

경고 로그에서 조금 읽은 후 /etc/sysfs.confy voilá 에이 두 줄을 추가했습니다.

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

이 변경 사항을 적용한 후 머신을 재부팅하십시오.