리눅스 장애 대응 · 파일디스크립터와 한도 · 퀴즈
퀴즈: 파일디스크립터와 한도
문항 6개. 정답과 해설은 풀어 본 뒤에 보여 드립니다.
nginx 가 Too many open files 를 냅니다. ulimit -n 은 1048576 입니다. 다음에 볼 곳은?
- /etc/security/limits.conf
- grep 'Max open files' /proc/<nginx PID>/limits
- fs.file-max 값
- 디스크 용량
Too many open files 와 Too many open files in system 의 차이는?
- 같은 뜻이고 커널 버전에 따른 표현 차이다
- 앞은 소켓, 뒤는 일반 파일에서 난다
- 앞은 EMFILE(프로세스 한계), 뒤는 ENFILE(시스템 전역 한계)
- 뒤는 컨테이너 환경에서만 발생한다
systemd 서비스의 fd 한도를 유닛 파일에서 올렸는데 반영되지 않습니다. 원인은?
- systemctl daemon-reload 를 하지 않았다
- 값이 fs.file-max 를 넘었다
- reload 만 하고 restart 를 하지 않았다. rlimit 은 프로세스 생성 시점에 적용된다
- LimitNOFILE 은 소프트만 지정한다
ss 로 보니 CLOSE-WAIT 소켓이 2만 개 쌓여 있고 전부 같은 상대입니다. 무엇을 뜻하나요?
- 우리 쪽 애플리케이션이 close() 를 호출하지 않고 있다
- 상대 서버가 과부하 상태다
- 커널이 곧 자동 정리할 것이므로 문제없다
- TIME-WAIT 가 너무 많아 재사용이 안 된다
TIME-WAIT 소켓이 많다고 fd 한도를 올리는 것이 무의미한 이유는?
- TIME-WAIT 는 fd 를 두 배로 소비하기 때문
- TIME-WAIT 는 소켓이 아니기 때문
- TIME-WAIT 는 fd 를 소비하지 않고 커널이 알아서 정리하기 때문
- fd 한도는 소켓에 적용되지 않기 때문
같은 파일을 50번 open 하면?
- fd 는 1개만 만들어지고 참조 카운트가 증가한다
- 두 번째부터는 오류가 난다
- fd 50개가 만들어지고 모두 같은 inode 를 가리킨다
- 파일이 50개로 복제된다