2023.09.23
운영을 운영을 하다보면 서버 이벤트를 만날때가 있다. 여러 이벤트를 볼 수 있는데, 최근 봤던 이벤트는 Too many open files: "Too many open files" 라는 이벤트다. 자주 접하는 이벤트는 아니지만, 추후에도 이런 일이 일어날 수 있으니 어떤 상황인지 알아야할 필요가 있다고 생각되었다.
그래서, 저 이벤트는 어떤 상황에 일어나는지 알아보고자 한다.
발생원인
1. 리소스 제한 초과 : 운영 체제는 각 프로세스가 동시에 열 수 있는 파일 디스크립터의 수에 제한을 둔다. 이 제한은 시스템 설정 또는 리소스 제한과 관련이 있으며, 일반적으로 하드웨어 및 운영 체제에 따라 다르다. 프로세스가 이 제한을 초과하려고 할 때 "Too many open files" 오류가 발생한다.
2. 리소스 누수 : 프로그램이 파일 디스크립터를 열고 닫지 않거나, 제대로 관리하지 않고 많은 파일을 열어둘 경우 리소스 누수가 발생할 수 있다. 이로 인해 파일 디스크립터가 과도하게 소비되어 오류가 발생할 수 있다.
3. 동시 접속 및 I/O : 네트워크 서비스나 다중 스레드 프로그램에서 여러 클라이언트나 스레드가 동시에 파일을 열거나 읽고 쓸 때 발생할 수 있다. 이로 인해 동시에 열려 있는 파일 디스크립터 수가 증가하고 오류가 발생할 수 있다.
쉽게 말하면 프로세스가 OS에 요청할 수 있는 리소스의 갯수/양(NOFILE이라 불리는 최대 Open 가능한 파일 갯수)에 Limit가 있고, 프로세스가 그 제한을 넘었기 때문이다. 이는 Limit을 늘려 주면 된다. 각 프로세스의 Limit는 그 프로세스가 실행되는 계정의 Limit을 바탕으로 만들어지므로 프로세스의 Limit을 올려준다고 해서 문제가 해결되지 않는다.
오류가 발생하는 상황
상황1) 개인
컴퓨터에서 작업하고 있는데 다음과 같은 상황이 발생한다:
웹 브라우징: 여러 개의 웹 페이지를 열어두고 탐색 중입니다.
텍스트 편집기: 문서를 편집 중이며 몇 가지 파일을 열어두고 있습니다.
이메일 클라이언트: 이메일을 확인하고 몇 개의 이메일을 열어두고 있습니다.
컴퓨터 게임: 게임을 플레이하면서 맵, 텍스트 파일, 소리 파일 등을 여러 개의 파일로 열어두고 있습니다.
예를 들어, 여러 개의 웹 브라우저 탭을 열어두고, 텍스트 편집기로 여러 파일을 열고, 이메일 클라이언트로 이메일을 확인하면 각각의 프로그램이 파일 디스크립터를 소비한다. 이때, 파일 디스크립터 제한을 초과하면 운영 체제에서 "Too many open files" 오류를 발생시킨다.
상황 2) 웹 서버
상황: 웹 서버는 여러 개의 가상 호스트를 호스팅하고 있으며 각 호스트에는 수많은 웹 페이지 및 애플리케이션이 있다. 많은 사용자가 동시에 웹 사이트에 접근하고 있다.
문제: 각 웹 서버 프로세스는 클라이언트 요청을 처리하기 위해 파일 디스크립터를 사용한다. 동시에 많은 클라이언트 요청이 발생하면 각 프로세스가 사용하는 파일 디스크립터 수가 급증하게 된다. 이로 인해 파일 디스크립터 제한을 초과하면 "Too many open files" 오류가 발생할 수 있다.
상황 3) 데이터베이스 서버
상황: 데이터베이스 서버는 여러 개의 데이터베이스를 호스팅하고 있으며, 다양한 클라이언트 애플리케이션은 데이터베이스에 연결하여 데이터를 읽고 쓰고 있다.
문제: 많은 클라이언트 애플리케이션이 동시에 데이터베이스에 연결하면 각 연결은 파일 디스크립터를 사용한다. 데이터베이스 서버가 처리할 수 있는 파일 디스크립터 수를 초과하면 "Too many open files" 오류가 발생할 수 있으며, 새로운 클라이언트 연결을 수용하지 못하게 된다.
상황 4) 파일 서버
상황: 파일 서버는 여러 클라이언트가 파일을 읽고 쓸 수 있는 서버이다. 다수의 클라이언트가 동시에 파일을 열어두고 있다.
문제: 여러 클라이언트가 동시에 다양한 파일을 열어두면 파일 디스크립터의 수가 급증할 수 있다. 서버에서 관리하지 못할 정도로 파일 디스크립터를 열어두는 경우 "Too many open files" 오류가 발생할 수 있다.
해결방법
[user@localhost ~]$ ulimit -a
core file size (blocks, -c) 0
data seg size (kbytes, -d) unlimited
scheduling priority (-e) 0
file size (blocks, -f) unlimited
pending signals (-i) 7257
max locked memory (kbytes, -l) 64
max memory size (kbytes, -m) unlimited
open files (-n) 1024
pipe size (512 bytes, -p) 8
POSIX message queues (bytes, -q) 819200
real-time priority (-r) 0
stack size (kbytes, -s) 8192
cpu time (seconds, -t) unlimited
max user processes (-u) 4096
virtual memory (kbytes, -v) unlimited
file locks (-x) unlimited
'Linux > CentOS' 카테고리의 다른 글
| [CentOS7]NTP 서버 구축 및 동기화 (0) | 2023.09.25 |
|---|---|
| [CentOS 7] Chronyc source / Chrony tracking (0) | 2023.09.24 |
| [CentOS 7]netstate 명령어 (0) | 2023.09.24 |
| [CentOS 7]yum 및 ping 실행이 안될때 (NAT, NAT네트워크 설정) (0) | 2023.09.24 |
| [CentOS] free -g이란? (메모리 사용량 확인방법) (0) | 2023.09.24 |