elasticsearch에 대한 vm.max_map_count를 변경할 수 없습니다 인해 발생합니다. 문제 문제는 vm.max_map_count가 변경 불가능하다는 것입니다. 루트에서 변경 sudo

선사 시대

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 가지 방법을 보여 드리겠습니다.

사전 정보 :

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 가지 옵션을 제공하여 어쨌든 도움이되기를 바랍니다.)

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


답변

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

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

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

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


답변

공식 지침을 따를 수 있습니다.

sysctl -w vm.max_map_count=262144

/etc/sysctl.conf에서 vm.max_map_count 설정을 영구적으로 업데이트하려면

https://www.elastic.co/guide/en/elasticsearch/reference/current/vm-max-map-count.html을 참조 하십시오


답변