서비스 중인 서버에서 문제가 발생했다.
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
그리고 설정 값을 보면 제대로 값이 바뀐 것을 확인할 수 있다.