선사 시대
CentOS 6.5에서 elasticsearch와 SugarCRM7을 실행하고 있습니다. 매일 같은 문제에 직면합니다 : java outOfMemory error. 이는 262144가 권장되는 경우에만 작은 vm.max_map_count 값, 65530으로 인해 발생합니다.
문제
문제는 vm.max_map_count가 변경 불가능하다는 것입니다.
-
루트에서 변경
sudo sysctl -w vm.max_map_count=262144
보고
오류 : ‘vm.max_map_count’키에 대한 권한이 거부되었습니다.
동안
ps aux | grep java
grep 프로세스 만 반환
-
Elasticsearch 시작시 변경
sudo service elasticsearch start
오류도 반환
오류 : ‘vm.max_map_count’키에 대한 권한이 거부되었습니다.
탄력적 검색 시작 : [OK]
-
파일을 통한 수동 변경 (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_count
sysctl 또는 다른 많은 항목을 변경할 수 없습니다 . 값이 고정되어 있습니다.
이것은 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을 참조 하십시오