리눅스 서버 - postgresql, 리눅스와 mysql의 max_open_file 사이즈 변경하기, too many open files
이 름 : 바다아이
|
조회수 : 13063
짧은 주소 : https://www.bada-ie.com/su/?571591781221
'too many open files ' 에러는 두가지 형태입니다.
첫째는 파일 작업을 열고 닫아주지 않아서 비정상적으로 열린 파일이 많을 때이고...
두번째는 동시접속자가 너무 폭주하여 생길 수 있는 문제입니다.
해결 방법은 db 와 서버의 최대 열 수 있는 파일 수를 늘려주는 것과 동시 접속자 부분 늘리기....
그리고 잘못된 프로그램 부분을 찾아서 연 파일을 정상적으로 닫아주시는 것입니다.
리눅스 계열은 급한대로 그냥 속편히 최대 파일 개수 늘려 주시면 되고요... 그리고 천천히 버그 잡으면 됩니다.
윈도우 계열은 잘못된 프로그램 부분 수정 필 입니다. -.-;
윈도우는 16384 개인가 세션에 제한이 걸려 있는데 수정이 되냐는 잘 모르겠네요..
윈도우에서 작업할 일이 별로 없는지라 죄송... 서버는 유닉스, 리눅스가 전부라 생각하는 1인이라..
postgresql 은 postgresql.conf 파일 열어서 max_connections = 최대접속개수
수정하시고 다시 시작... 물론 동시접속이 많다면 튜닝 필수 입니다만 일단 여기서는 최대접속 수만.....
그리고 리눅스 최대값 변경하시면 되겠습니다.
따로 postgresql 에서 크게 설정할 것은 없습니다.
환경: 리눅스 CentOS
새 서버를 받아 max open file 관련하여 설정을 하여 기록을 남긴다.
mysql에서는 보통 max open file 기본 값으로 1024이 설정되어 있는데
이 값이 낮아 mysql 작업 속도를 느리게 하는 원인이 되기도 하니 적절하게 값을 조정해보도록 하자.
1.mysql의 max open file 설정 확인
일단 mysql 의 현재 max open file설정부터 확인해보자.
ps afx | grep mysql 로 해당 프로세스의 id를 알아내고 프로세스의 설정값을 확인해본다.
mysql> show global variables like 'open%';
+------------------+-------+
| Variable_name | Value |
+------------------+-------+
| open_files_limit | 1024 |
+------------------+-------+
1 row in set (0.00 sec)
mysql max_connections 변경은 여기 게시판에서 '동시접속' 으로 검색하시면 자료 있습니다.
현재 기본 값은 너무 작으니 값을 증가해야 겠다.
그리고 mysql 의 max open file값은 시스템이나 사용자에게 기존에 할당된 값 이상으로 변경할 수 없으니
mysql max open file 값을 변경하기 이전에 관련 설정들을 확인 및 변경해보자.
2. OS의 max open file 설정 확인 및 변경
일단 서버의 기본 max open file 설정부터 확인해보자.
file-max 값은 리눅스에서 한 번에 운용할 수 있는 파일 수를 의미하며,
보통 4MB 메모리당 256개의 파일을 운용할 수 있다고 한다.
대략 1G -> 65536개, 2G -> 131072 개 이다.
shell> cat /proc/sys/fs/file-max
382386
이미 충분한 값이 설정되어 있는 것 같다.
만약 위에 나온 값을 변경하고 싶으면 터미널에서 아래와 같이 입력하면 된다.
그러나 재부팅시 이 값은 유지가 되지 않으니 유의하자.
shell> echo 382386 > /proc/sys/fs/file-max
재부팅시에도 이 값을 계속 유지하려면
/etc/sysctl.conf 파일에서 아래와 같이 file-max값 설정을 추가한다.
# increase max open file
fs.file-max = 382386
그리고 sysctl -p 를 입력하여 설정값이 즉각 변경하도록 한다.
이 값은 서버가 재시작을 해도 계속 유지된다.
shell> sysctl -p
net.ipv4.ip_forward = 0
net.ipv4.conf.default.rp_filter = 1
net.ipv4.conf.default.accept_source_route = 0
kernel.sysrq = 0
kernel.core_uses_pid = 1
net.ipv4.tcp_syncookies = 1
error: "net.bridge.bridge-nf-call-ip6tables" is an unknown key
error: "net.bridge.bridge-nf-call-iptables" is an unknown key
error: "net.bridge.bridge-nf-call-arptables" is an unknown key
kernel.msgmnb = 65536
kernel.msgmax = 65536
kernel.shmmax = 68719476736
kernel.shmall = 4294967296
fs.file-max = 382386
3. 사용자별 max open file 설정 확인 및 변경
사용자별 프로세스(task)의 max open file 설정을 확인하려면 터미널에서 ulimit -a를 입력한다.
shell> 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) 30122
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) 10240
cpu time (seconds, -t) unlimited
max user processes (-u) 30122
virtual memory (kbytes, -v) unlimited
file locks (-x) unlimited
open file 값이 기본값인 1024으로 설정되어 있어 64000으로 변경하려고 한다.
ulimit의 값을 변경하는 방법은 두가지가 있다.
터미널에서 아래와 같이 ulimit -n 옵션으로 변경할 수 있다.
현재 로그인되어 있는 사용자에 한해 변경이 되며 로그아웃시에는 설정한 값이 유지가 되지 않으니 유의한다.
shell> ulimit -n64000
다시 ulimit -a를 입력하여 해당 값이 제대로 변경된 것을 확인하였다.
shell> 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) 30122
max locked memory (kbytes, -l) 64
max memory size (kbytes, -m) unlimited
open files (-n) 64000
pipe size (512 bytes, -p) 8
POSIX message queues (bytes, -q) 819200
real-time priority (-r) 0
stack size (kbytes, -s) 10240
cpu time (seconds, -t) unlimited
max user processes (-u) 30122
virtual memory (kbytes, -v) unlimited
file locks (-x) unlimited
ulimit -n의 변경값은 일시적이기 때문에
이 값을 계속 유지하고 싶으면 /etc/security/limits.conf 파일의 내용을 수정해야 한다.
nofile은 해당 사용자(그룹)이 오픈할 수 있는 최대 파일 개수를 의미한다.
/etc/security/limits.conf 값은 새로운 session 부터 영향을 끼치기 때문에
파일 설정을 변경하고 재로그인을하거나 새로운 세션으로 다시 접속하면
해당 설정이 변경된 것을 확인할 수 있다.
# 전체 user에게 같은 설정을 하려면 * 을 사용한다
* hard nofile 64000
* soft nofile 64000
# 특정 user (예: mysql)에기만 설정을 하려면
mysql hard nofile 64000
mysql soft nofile 64000
4. mysql max open file 설정 변경
자 드디어 mysql max open file 설정을 변경할 차례가 왔다.
/etc/my.cnf 파일에 아래와 같이 open-file-limit 옵션을 수정하자.
[mysqld_safe]
open-files-limit=64000
그리고 mysqld 서비스를 재시작한다.
shell> service mysqld restart
mysqld 를 정지 중: [ OK ]
mysqld (을)를 시작 중: [ OK ]
마지막으로 수정된 값을 확인하고 설정을 마무리한다.
mysql> show global variables like 'open%';
+------------------+-------+
| Variable_name | Value |
+------------------+-------+
| open_files_limit | 64000 |
+------------------+-------+
1 row in set (0.00 sec)
Copyright ⓒ 2001.12. bada-ie.com. All rights reserved.
이 사이트는 리눅스에서 firefox 기준으로 작성되었습니다. 기타 브라우저에서는 다르게 보일 수 있습니다.
[ Ubuntu + GoLang + PostgreSQL + Mariadb ]
서버위치 : 오라클 클라우드 춘천 실행시간 : 0.20504 초 to webmaster... gogo sea. gogo sea.