한 번 수정된 elasticsearch 파일 설명자 수량 기록하기

4994 단어
배경: 어느 해 어느 달 어느 날에es가 정상적으로 작동하지 않는 것을 발견했습니다. 로그를 보면 다음과 같은 오류가 발생했습니다.
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 항상 32768
2./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를 시작합니다. 명령줄에서 일반 사용자가 타임스 오류를 수정하고 루트 사용자는 ok
3./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.solimits가 필요합니다.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 191832Google을 보면 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 files6. 프로세스가 현재 열려 있는 파일 핸들 수를 보는 방법: 입력: lsof -n|awk '{print $2}'|sort|uniq -c|sort -nr|grep pid 출력: cnt pid

좋은 웹페이지 즐겨찾기