모든 프로세스에 대한 열린 파일 제한 늘리기: 소프트/하드 제한을 설정해야 합니까?

모든 프로세스에 대한 열린 파일 제한 늘리기: 소프트/하드 제한을 설정해야 합니까?

하루 이틀 정도 게임 서버를 실행한 후 아래와 같은 오류가 발생하는 것을 해결하려고 합니다.

2017/12/13 12:08:35 http: Accept error: accept tcp [::]:8081: accept4: too many open files; retrying in 1s

/etc/sysctl.conf에 "fs.file-max=2000000"을 추가하고 실행했습니다.

sysctl -w fs.file-max=2000000
sysctl -p

이제 전역 제한이 업데이트되었지만(재부팅해야 합니까?) 소프트 제한과 하드 제한은 여전히 ​​각각 1024와 4096입니다.

또한 루트 사용자에 대한 "파일 열기"를 확인할 때 다음 명령을 사용하십시오.

su - root -c 'ulimit -aHS' -s '/bin/bash'

저도 1024 받았어요.

소프트 제한과 하드 제한의 기능은 무엇입니까? 전역 제한 사항을 적용하려면 이를 변경해야 합니까? 사용자(루트) 제한은 어떻습니까?

감사해요!

답변1

설정한 제한은 sysctl전체 시스템에 적용되는 시스템 설정입니다. 이는 단일 프로세스에 적용되는 제한이 아닙니다.

각 프로세스는 최대 N개의 파일을 열 수 있습니다. 여기서 N은 프로세스의 NOFILE소프트 제한이며 하드 제한을 초과하지 않도록 자체 소프트 제한을 변경할 수 있습니다. 루트로 실행되는 프로세스만 하드 제한을 늘릴 수 있습니다. 프로세스는 상위 프로세스의 제한 사항을 상속합니다.

개별 서비스에 대한 제한을 변경하는 방법(사용자가 수행해야 하는 작업)은 초기화 시스템에 따라 다릅니다.

  • /etc/rc.d/init.dSysVinit(CentOS 6 이하): 데몬을 실행하기 전에 호출되도록 서비스의 초기화 스크립트(일반적으로 상주하는 위치)를 편집한 ulimit다음 서비스를 다시 시작합니다.
  • Systemd(CentOS ≥7)의 경우: 편집서비스 단위 파일 /etc/systemd/system/my_game_server.service그리고 지시문을 추가하세요

    LimitNOFILE=16384
    

    그런 다음 실행 systemctl daemon-reload하여 구성을 다시 로드하고 서비스를 다시 시작합니다.

답변2

에서 제한을 변경할 수 있습니다 /etc/security/limits.conf. 적용하려면 로그아웃한 후 다시 로그인하세요.

Hardlimit: 특정 사용자에 대한 경계 - 런타임 시 사용자를 늘릴 수 없으며 감소만 가능합니다 ulimit -Hu 2000. 하드 제한 목록:ulimit -Ha

소프트 제한: 사용자가 런타임 시 변경할 수 있는 하드 제한 내의 "소프트" 경계: ulimit -Su 10000소프트 제한 목록:ulimit -Sa

실행 중인 프로세스의 ulimit를 변경합니다: prlimit -p $$ --nproc=1200:. 그러면 현재 셸의 프로세스 수(softlimit)가 1200 으로 변경됩니다 $$.

답변3

다음과 같이 추가해야 하는 파일의 제한 번호 /etc/security/limits.conf(특정 사용자 또는 모든 사람에 대해)를 변경할 수 있습니다.

username               soft    nofile          4096
username               hard    nofile          5120

그러면 열린 파일 수가 4096(소프트 제한)으로 설정되고 최대 5120이 설정됩니다.

이 편집을 수행한 후에는 다시 로그인하고 서비스를 다시 시작해야 이 작업을 수행할 수 있습니다.

내가 기억하는 한, ulimit해당 사용자에서 로그아웃할 때까지는 변경 사항이 적용되지 않습니다.

관련 정보