한 번 수정된 elasticsearch 파일 설명자 수량 기록하기
java.io.IOException: Too many open files
다음 절차는 다음과 같습니다. 1.es 노드 정보 보기 결과:
{
"cluster_name" : "elasticsearch",
"nodes" : {
"eE4eHSOWTK-j6IO7JJzcXG" : {
"name" : "Hardcore",
"transport_address" : "inet[silence/192.168.1.111:9300]",
"host" : "silence",
"ip" : "192.168.1.111",
"version" : "1.6.0",
"build" : "cdd3ac4",
"http_address" : "inet[/192.168.1.111:9200]",
"process" : {
"refresh_interval_in_millis" : 1000,
"id" : 10598,
"max_file_descriptors" : 32768,
"mlockall" : false
}
}
}
}
의문: 분명히/etc/init에 있습니다.d/elasticsearch 시작 스크립트에
MAX_OPEN_FILES=65535
설정되어 있고 실행ulimits -n $MAX_OPEN_FILES
에 성공했지만es 노드 정보에 max_file_descriptors 항상 327682./etc/init 보기.d/elasticsearch 시작 스크립트 내용, 프로세스를 시작할 때/etc/init를 사용합니다.d/functions에서의daemon 함수 시작은 최종적으로daemon에서
runuser -s /bin/bash $user -c "$corelimit >/dev/null 2>&1 ; $*"
방식으로 프로세스를 시작합니다. 자연히 -c에 ulimit-n65535를 추가하려고 했는데 결과는 실패로 끝났습니다. 스크립트 오류 보고ulimit: open files: cannot modify limit: Operation not permitted
를 시작합니다. 명령줄에서 일반 사용자가 타임스 오류를 수정하고 루트 사용자는 ok3./etc/security/limits를 수정합니다.conf 파일에 다음과 같은 내용을 추가합니다. (es 실행 사용자는elasticsearch)
elasticsearch hard nofile 65535
elasticsearch soft nofile 65535
내용 수정 후 es 재부팅, 시작 후 es 노드 정보 조회 max_file_descriptors는 32768...지금 이미 미쳤어
4. 구글을 보면/etc/pam이라고 한다.d/login 파일에
session required pam_limits.so
limits가 필요합니다.conf 파일이 효과가 나요. 그래서 제가 추가했습니다. 결과는...니마는 왜 32768이야./etc/pam을 다시 봅니다.d/login에서 이런 말session include system-auth
이 발견되었는데, 바로 파일 시스템-auth를 가져온 것이다. 그래서 시스템-auth에 이미 존재하는 것을 발견하고session required pam_limits.so
, 그리고 니마는 단계 3에 추가된 내용을 삭제한다.이때 역번역pam_limits.so 파일은 도대체 무슨 일을 했는지 보자. 물론 파일이 어디에 있는지 조회한 다음find / -name pam_limits.so
을 사용해야 한다. strings pam_limits.so
그 결과 니마는 이 두 줄이 있다는 것을 발견했다./etc/security/limits.conf
.
.
.
/etc/security/limits.d/*.conf
당연히/etc/security/limits를 보고 싶습니다.d/하의*.conf 결과, def를 발견했습니다.conf, 내용:
* hard nofile 32768
* soft nofile 32768
설명: * 모든 사용자에게 적용됨
결과는 당연히 def를 수정해 보아야 한다.conf 파일
분석 원인: 1.why 는/etc/init.d/elasticsearch에 ulimit-n이 설정되어 있는데 왜 runuser 명령 형식이 적용되지 않았습니까?
runuser -s [shell] [uid/gid] -c "command"
, 설명: 대체된 사용자나 그룹 ID로 셸을 실행합니다. 세션의 PAM hooks만 실행되고 비밀번호 알림이 없습니다. 이 명령은 루트 사용자만 실행할 때 테스트를 통해 알 수 있듯이 ulimit-n은 현재 세션의 열기 파일 설명자 수량만 수정하고 새 메시지를 열거나 새 사용자를 전환하면 효력을 상실합니다.그리고 설명에 의하면 runuser가 세션을 연 후에 PAM hooks 인증 모듈이 실행된다는 것을 알았기 때문에 이전의 설정 매개 변수는 모두 무효입니다2. why가runuser에 -c에ulimit-n65535를 추가하여 오류를 찾아낸 자료를 보면 일반 사용자가ulimit-n을 설정할 때 크기가 미리 설정한 값을 초과할 수 없습니다. 그러면 미리 설정한 값이 누구일까요?conf, limits에서 테스트할 수 있습니다.conf에 자신의 사용자 정보 (silence is me) 를 추가하면 다시 수정하는 것이 정상적임을 발견할 수 있습니다
silence hard nofile 65535
silence soft nofile 65535
3.limits.conf와 limits.d/*.ff의 관계는 이때 파일 불러오는 순서와 설정 내용과 관련이 있습니다. 같은 내용을 설정했지만 값이 통하지 않을 때 나중에 불러오는 설정 파일의 값이 적용됩니다. 테스트를 해보겠습니다:limits.d/def.conf 프로필에 정보를 추가합니다. 두 번째 단계는limit에 있기 때문입니다.conf에서 65535로 설정하고 테스트에 성공하면 이 때 다시 테스트
ulimit -n 50000
가 정상적이고 ulimit -n 65535
가 정상적이지 않으면 우리의 추측을 검증할 수 있습니다silence hard nofile 50000
결과는 자연과 추측이 일치합니다. 반번역 결과에 따라pam_limits.그래서 먼저 limits를 불러옵니다.conf 다음에 limits를 불러옵니다.d/.conf는 이때 일정한 순서가 있지만,limits.d/.conf에서 불러오는 순서는 어떻습니까?시스템 정렬과 관련이 있을 것으로 추측되지만 테스트되지 않았습니다. 일반적인 상황에서 좋은 시스템 관리자는 서로 다른 사용자에게userid에 따라limits에 있어야 합니다.d에서 서로 다른 파일을 따로 설정하여 왜 limits에 있는지 관리하기 쉽습니다.d/def.conf에서 값을 하드값으로 설정할까요?설정 파일의 규칙을 볼 수 있습니다. 하드 설정은 수정할 수 있는 최대값이고 soft 설정은 새 메시지가 생성될 때 기본 설정입니다.
4. 이때 이 값을 얼마나 크게 설정할 수 있는지 물어볼 것이다.파일 보기/proc/sys/fs/filemax 및/proc/sys/fs/file-nr 내용 입력:
cat /proc/sys/fs/file-max
출력: 191832
입력: cat/proc/sys/fs/file-nr
출력: 1792 0 191832
Google을 보면 file-nr 파일의 세 개는 시스템이 이미 분배한 파일 핸들 수, 사용하지 않은 핸들 수와 모든 분배할 수 있는 최대 핸들 수, file-max의 값은 최대 분배할 수 있는 핸들 수이기 때문에 ulimit-n은 설정된 값이 file-max가 기록한 값을 초과할 수 없습니다. file-nr 파일 내용은 일반적으로 시스템이 시작될 때 시스템 메모리에 따라 계산되고 시스템 메모리가 커지면 file-max가 커집니다.5. 다른 프로세스가 현재 설정한 max_ 보기file_descriptors는 linux 커널이 2.6.24 및 이후 버전에 대한 입력:
cat /proc/34690/limits | grep "Max open files"
출력: Max open files 32768 32768 files
6. 프로세스가 현재 열려 있는 파일 핸들 수를 보는 방법: 입력: lsof -n|awk '{print $2}'|sort|uniq -c|sort -nr|grep pid
출력: cnt pid
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.