서비스 중인 서버에서 문제가 발생했다.

DB에서 뱉는 에러를 확인해보니, Too many open files 라는 메시지가 발생했다.

관련 설정 값(open files)을 확인해보았다.

[root@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) 3882
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) 3882
virtual memory          (kbytes, -v) unlimited
file locks                      (-x) unlimited

 

1024인 값을 4096으로 올려보자.

일시적인 방법과 영구적인 방법이 있다.

 

먼저 일시적인 방법으로 값을 바꾸기 위해선 다음과 같이 명령어를 입력한다.

# ulimit -n 4096

 

말 그대로 일시적인 방법이기 때문에,

서버가 재시작을 하더라도 적용되길 원한다면 다음과 같이 영구적인 방법을 추가로 해준다.

# vi /etc/security/limits.conf
...
* hard nofile 4096
* soft nofile 4096
root hard nofile 4096
root soft nofile 4096
# End of file

* 문자는 모든 유저에게 할당하겠다는 표시이다.

root* 안에 속하지 않기 때문에 따로 추가해주었다.

 

설정 값이 바뀌었는지 확인한다.

[root@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) 3882
max locked memory       (kbytes, -l) 64
max memory size         (kbytes, -m) unlimited
open files                      (-n) 4096
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) 3882
virtual memory          (kbytes, -v) unlimited
file locks                      (-x) unlimited

 

이렇게 먼저 OS에서 제한을 4096으로 풀어주고 난 다음에, DB 설정을 바꿔준다.

# vi /etc/my.cnf
...
open_file_limit=4096

[mysqld_safe]
...

 

DB 서비스 재시작을 한다.

# systemctl restart mariadb

 

DB에서 open_files_limit 설정 값이 바뀌었는지 확인한다.

MariaDB [(none)]> show variables like 'open_files_limit';
+------------------+-------+
| Variable_name    | Value |
+------------------+-------+
| open_files_limit | 4096  |
+------------------+-------+

 

만약, DB의 open_files_limit 값이 변경되지 않는다면?

👉 참고 사이트

CentOS 7.x 버전에서 나타날 수 있는 문제라고 한다.

나의 경우, 가상화로 만든 테스트 서버에는 위 설정 후 재부팅을 하니까 DB도 문제없이 4096으로 변경되었다.

하지만 기존에 서비스 중인 서버에는 재부팅을 할 수 없어서 그런지(?), DB 값이 1024에서 변경되지 않았다.

 

만약, DB 값이 변경되지 않는다면 다음 작업을 진행한다.

mariadb.service 파일을 수정한다.

# vi /etc/systemd/system/multi-user.target.wants/mariadb.service
...
[Service]
Type=simple
User=mysql
Group=mysql
LimitNOFILE=10000
...

 

systemd를 reload 후 DB 서비스를 재시작한다.

# systemctl daemon-reload
# systemctl restart mariadb

그리고 설정 값을 보면 제대로 값이 바뀐 것을 확인할 수 있다.