elasticsearch에 대한 vm.max_map_count를 변경할 수 없습니다


14

선사 시대

CentOS 6.5에서 elasticsearch와 SugarCRM7을 실행하고 있습니다. 매일 같은 문제에 직면합니다 : java outOfMemory error. 이는 262144가 권장되는 경우에만 작은 vm.max_map_count 값, 65530으로 인해 발생합니다.

문제

문제는 vm.max_map_count가 변경 불가능하다는 것입니다.

  1. 루트에서 변경

    sudo sysctl -w vm.max_map_count=262144
    

    보고

    오류 : 'vm.max_map_count'키에 대한 권한이 거부되었습니다.

    동안

    ps aux | grep java
    

    grep 프로세스 만 반환

  2. Elasticsearch 시작시 변경

    sudo service elasticsearch start
    

    오류도 반환

    오류 : 'vm.max_map_count'키에 대한 권한이 거부되었습니다.

    탄력적 검색 시작 : [OK]

  3. 파일을 통한 수동 변경 (dirty-dirty hack) :

    sudo vi /proc/sys/vm/max_map_count
    

    다음 중 하나도 작동하지 않습니다.

    "/ proc / sys / vm / max_map_count"[읽기 전용] 1L, 6C

    -INSERT-W10 : 경고 : 읽기 전용 파일 변경

    E45 : '읽기 전용'옵션이 설정되었습니다 (재정의하려면! 추가)

    "/ proc / sys / vm / max_map_count"E212 : 쓰기 위해 파일을 열 수 없습니다

    동안

    ls -la /proc/sys/vm/ | grep max_map_count
    

    보고

    -rw-r--r-- 1 루트 루트 0 4 월 10 일 09:36 max_map_count

    (그러나 이것이 리눅스가 / proc 디렉토리에 대해 이야기하는 것이 정상 일 수 있다고 생각합니다)

그렇다면이 변수의 값을 어떻게 바꿀 수 있습니까? 매일 밤 elasticsearch를 다시 시작하는 것은 좋은 생각이 아닙니다.


3
어떤 종류의 기계입니까? 가상? 그렇다면 어떤 종류의 가상화가 사용됩니까? OpenVZ 컨테이너와 같은 일부 가상화는 컨테이너에 제한을 가하고 커널 및 기타 저수준 항목을 "조정"할 수 없습니다.
Miroslav Koškár

@MiroslavKoskar 불행히도, 나는 모른다. 어떻게 알 수 있습니까?
Valentina

@MiroslavKoskar 언급을 잊어 버렸습니다 — 기계는 물론 가상입니다
Valentina

1
알아내는 방법? 글쎄, 어디에 호스팅됩니까? 그것은 일반적으로 호스팅 제공 업체와의 계약의 일부이기 때문에 다소 분명합니다. 그래도 확실하지 않은 경우 호스팅 제공 업체 지원 센터에 문의하십시오. IMHO는 시작하기 가장 좋은 곳입니다 (일반적으로 거래의 일부이며 지불 할 가능성이 있기 때문에).
Miroslav Koškár

@MiroslavKoskar는 공급자 가이 문제에 대해 나를 도울 수 없다는 기술을 언급하지 않고 대답했습니다 (합리적입니다). 도움을 주셔서 감사합니다
Valentina

답변:


13

가상 머신 또는 물리적 머신인지 여부는 중요하지 않으며 해당 설정은 항상 변경 가능합니다.

3 가지 방법을 보여 드리겠습니다.

사전 정보 :

1) 가능하면 루트로 실행하는 것이 좋습니다.

2) 유닉스의 / proc 는 실제 파일 시스템이 아니며, 인 메모리 커널 파일 시스템이지만 일반적인 디스크 파일 시스템처럼 보입니다. 파일을 '가짜 파일 시스템'또는 '특수 파일 시스템'이라고 부를 수 있습니다. 가짜 파일은 vi 나 다른 편집기로 편집 할 수 없습니다. 파일이 아니기 때문에 파일처럼 보입니다. 나는 몇 년 전에 같은 문제를 겪었다.

그러나 값을 변경하는 것은 간단합니다. 편집하려면 다른 종류의 '역학'이 필요합니다.

먼저 설명하겠습니다 : 먼저 루트 여야합니다 : (sudo는 일부 배포판에서 작동하지만 시도한 것과 같은 다른 배포판에서는 작동하지 않습니다.이 첫 번째 방법은 보편적이며 모든 Linux, macOS 또는 모든 Unix 기반에서 작동합니다 루트 암호에 액세스 할 수 있기를 바랍니다.

프롬프트에서 진행하십시오 :

    $ su root

루트 비밀번호를 입력하십시오.

이제 루트입니다. / proc / sys / vm / max_map_count 의 현재 값을 확인하십시오.

    $ cat /proc/sys/vm/max_map_count  
    65536

바꾸자 :

    echo 262144 > /proc/sys/vm/max_map_count

확인하자 :

    cat /proc/sys/vm/max_map_count
    262144

끝났다! 그리고 그것은 이미 적용되고 기능적입니다. / proc 아래의 의사 파일 값을 변경하면 설정이 즉시 활성화됩니다. 그러나 재부팅 후에도 지속되지 않습니다. elasticsearh 또는 기타 응용 프로그램 또는 시스템 메트릭 에서 값을 사용하여 성능 변화를 측정 할 수 있습니다 . 시스템을 조정하고 종이에 값을 쓰고 최상의 값을 유지하십시오. 실수로 재부팅하면 재부팅하면 모두 원래 값으로 돌아가고 원하는 값이 모두 최적화 될 때까지 다시 시작합니다. / proc에는 많은 디스크 및 메모리 조정 가능 매개 변수가 있습니다. 그리고 잘 튜닝하고 시간을 내면 큰 차이와 성능을 얻을 수 있습니다. 당신은 올바른 길을 가고 있습니다.

만족하면 영구적으로 만들어 봅시다 :

첫 번째 방법 :

/etc/rc.local 사용

    vi /etc/rc.local 

모든 매개 변수를 rc.local 파일에 넣으십시오 (예 :

    echo 220000000 > /proc/sys/vm/dirty_background_bytes
    echo 320000000 > /proc/sys/vm/dirty_bytes
    echo 0 > /proc/sys/vm/dirty_background_ratio
    echo 0 > /proc/sys/vm/dirty_ratio
    echo 500 > /proc/sys/vm/dirty_writeback_centisecs
    echo 4500 > /proc/sys/vm/dirty_expire_centisecs
    echo 1 > /proc/sys/net/ipv4/tcp_rfc1337
    echo 10 > /proc/sys/vm/swappiness
    echo never > /sys/kernel/mm/transparent_hugepage/enabled
    echo never > /sys/kernel/mm/transparent_hugepage/defrag
    echo 120 > /proc/sys/net/ipv4/tcp_keepalive_time
    echo 0 > /proc/sys/vm/zone_reclaim_mode
    echo deadline > /sys/block/sda/queue/scheduler
    echo 8 > /sys/class/block/sda/queue/read_ahead_kb
    echo 1048575 > /proc/sys/vm/max_map_count

vi 편집기를 종료하여 파일을 저장하십시오.

로그인 메시지가 표시되기 직전에 모든 초기화 서비스가 시작된 후 재부팅 할 때마다 해당 매개 변수가 설정됩니다.

( /etc/rc.local 파일은 모든 시작 Linux 서비스 후에 실행되며, Elasticsearch가 서비스로 시작되기 전에 작동하지 않을 수 있지만이 방법은 나중에 필요할 경우 다른 설정에서 유용하거나 다음과 같이 사용할 수 있습니다 init 스크립트는 루트로 실행되므로 init 스크립트 내에서 사용하는 것과 동일한 구문입니다.)

지금 복사하여 붙여 넣어 즉시 변경할 수도 있습니다. 위의 매개 변수는 내 Apache Apache 서버에서 유효하고 조정되어 실행 중입니다. 원하는 경우 시작점으로 조정하여 조정하십시오.

그것들을 영구적으로 만드는 두 번째 방법 :

리눅스에서 시작 서비스 전에 매개 변수가 설정됩니다.

/etc/sysctl.conf를 편집하고 내부에 매개 변수를 넣습니다.

 vm.max_map_count=1048575
 vm.zone_reclaim_mode=0
 vm.dirty_background_bytes=220000000
 vm.dirty_background_ratio=0
 vm.dirty_bytes=320000000
 vm.dirty_ratio=0
 vm.swappiness=10

다른 것들과 계속 진행하고 /etc/sysctl.conf를 저장하고 , 서버를 재부팅하여 변경 사항을 적용하거나, sysctl -p 를 실행 하여 재부팅하지 않고 변경 사항을 적용하십시오. 재부팅시 영구적으로 유지됩니다.

위의 두 가지 방법이 가장 많이 사용됩니다. 다른 하나가 있으며, 그것은 당신을 위해 효과가있을 수 있습니다 . 거의하고있는 것처럼 sudo 를 사용 하는 것입니다.

대신에:

  sudo sysctl -w vm.max_map_count=262144

시험:

  echo 262144 | sudo tee /proc/sys/vm/max_map_count

우분투에서 작동합니다.

확인:

   user@naos:~$ cat /proc/sys/vm/max_map_count
   262144

적어도 1 년 전의 질문이므로 문제를 처리 할 수있는 3 가지 옵션을 제공하여 어쨌든 도움이되기를 바랍니다.)

감사합니다, 라파엘 프라도


3
그들은 이미 이, 실패했습니다.
Michael Hampton

1
안녕 마이클, 네 말이 맞아. 처음에는 문제가 운영 체제 CentOS 및 유닉스 사용자 권한과 관련이 있다는 것을 이해했기 때문에 그 대답을 따라갔습니다. 그러나 최신 정보는 문제의 초점을 "호스트"OpenVZ에 두었습니다. 일부 설정은 제한됩니다. 내 지식은 Centos와 VmWare에 있지만 OpenVZ에는 없습니다.
user62739

4

"가상 컴퓨터"는 실제로 OpenVZ 컨테이너라고 생각합니다 (이를 실행하여 확인할 수 있음 virt-what).

이 경우 vm.max_map_countsysctl 또는 다른 많은 항목을 변경할 수 없습니다 . 값이 고정되어 있습니다.

이것은 elasticsearch에서 잘 알려진 문제입니다 ( 문제 # 4978 ). Elasticsearch만이 아닙니다. Java 응용 프로그램은 다양한 OpenVZ 공급자에서 성능이 좋지 않은 것으로 잘 알려져 있습니다. 주로 호스트가 제대로 조정되지 않아 수행 할 수있는 작업이 없기 때문입니다. 그 문제에 대한 한 의견자는 내 추천이 정확히 무엇인지 반향했습니다.

joshuajonah 님
이 2015 년 10 월 20 일에 댓글을 달았습니다 . KVM VPS로 전환 할 것 같습니다.


당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.