잠시만 기다려 주세요

HOME   |  여기는?   |  바다물때표   |  여러가지 팁 (887)  |  추천 및 재미 (152)  |  자료실 (20)  |  끄적거림 (517)  |  시나리오 (760)  |  드라마 대본 (248)  |  

2020년 09월 19일
갇힌 굴레는 스스로 벗어나야 한다. 누가 대신 뭐를 해 주진 않는다. 그 무엇도 본인 의지 없이는 계속 제자리 일 것이다. - 바다아이
 




    리눅스 서버

리눅스 서버 - postgresql, 리눅스와 mysql의 max_open_file 사이즈 변경하기, too many open files
이 름 : 바다아이   |   조회수 : 3727         짧은 주소 : 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를 알아내고 프로세스의 설정값을 확인해본다.

1024(soft), 4096(hard) 값이 설정되어 있다.  



shell> ps afx | grep mysql

48320 pts/3    S+     0:00                      \_ grep mysql

21919 pts/0    S      0:00 /bin/sh /usr/bin/mysqld_safe --datadir=/var/lib/mysql --socket=/var/lib/mysql/mysql.sock --pid-file=/var/run/mysqld/mysqld.pid --basedir=/usr --user=mysql

22021 pts/0    Sl     0:03  \_ /usr/libexec/mysqld --basedir=/usr --datadir=/var/lib/mysql --user=mysql --log-error=/var/log/mysqld.log --pid-file=/var/run/mysqld/mysqld.pid --socket=/var/lib/mysql/mysql.sock


shell> cat /proc/22021/limits

Limit                     Soft Limit           Hard Limit           Units

Max cpu time              unlimited            unlimited            seconds

Max file size             unlimited            unlimited            bytes

Max data size             unlimited            unlimited            bytes

Max stack size            10485760             unlimited            bytes

Max core file size        0                    unlimited            bytes

Max resident set          unlimited            unlimited            bytes

Max processes             30122                30122                processes

Max open files            1024                 4096                 files

Max locked memory         65536                65536                bytes

Max address space         unlimited            unlimited            bytes

Max file locks            unlimited            unlimited            locks

Max pending signals       30122                30122                signals

Max msgqueue size         819200               819200               bytes

Max nice priority         0                    0

Max realtime priority     0                    0

Max realtime timeout      unlimited            unlimited            us

[root@quick141-176 ~]#


mysql>  show variables like 'max_connections';

+-----------------+-------+

| Variable_name   | Value |

+-----------------+-------+

| max_connections | 151   |

+-----------------+-------+

1 row in set (0.00 sec)




또는 mysql 에서 직접 open_files_limit 변수값을 확인할 수도 있다.



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)






참고사이트:

http://duntuk.com/how-raise-ulimit-open-files-and-mysql-openfileslimit

http://blog.endpoint.com/2013/12/increasing-mysql-55-maxconnections-on.html

https://dev.mysql.com/doc/refman/5.0/en/linux-postinstallation.html

http://jikime.tistory.com/44



출처: http://kugancity.tistory.com/entry/mysql-maxopenfile-사이즈-증가하기


 
| |


      1 page / 5 page
번 호 카테고리 제 목 이름 조회수
136 리눅스 서버 ... ntp .. ... 바다아이 168
135 리눅스 서버 archlinux netstat , netstat ... 바다아이 231
134 리눅스 서버 ps , ps option 바다아이 237
133 리눅스 서버 , swap , ... swap . 바다아이 224
132 리눅스 서버 crontab , .... 바다아이 216
131 리눅스 서버 ssh , ssh 바다아이 478
130 리눅스 서버 SSH SSH , ssh-keygen rsa 바다아이 451
129 리눅스 서버 , date : () , () , 바다아이 760
128 리눅스 서버 aws lightsail, ssh .. .pem 바다아이 816
127 리눅스 서버 , ubuntu generic kernel 바다아이 1241
126 리눅스 서버 .. apt ... 바다아이 1194
125 리눅스 서버 ... ubuntu kernel compile 바다아이 1422
124 리눅스 서버 nginx http2 , . 바다아이 1275
123 리눅스 서버 psql libreadline.so.7: cannot open shared object file: No such file or directory 바다아이 1703
122 리눅스 서버 ssh .bashrc , bash .. .bash_profile 바다아이 1614
121 리눅스 서버 , , 바다아이 1619
120 리눅스 서버 rc.local ... , 바다아이 1677
119 리눅스 서버 ? - IPv4 Subnetting, (Subnet Mask) 바다아이 1749
118 리눅스 서버 TCP UDP ? 바다아이 1713
117 리눅스 서버 FTP passive(), active() 바다아이 1633
116 리눅스 서버 ftp passive .... filezilla ftp ... 바다아이 2236
115 리눅스 서버 ssh sftp ... sftp ... 바다아이 1815
114 리눅스 서버 rpm 바다아이 1872
113 리눅스 서버 /tmp ... /tmp ... tmpfs 바다아이 2397
112 리눅스 서버 archlinux ... mirror, 바다아이 1796
111 리눅스 서버 centos7 pgadmin4 .... ... pgadmin4 server mode, postgresql admin .. 바다아이 1866
110 리눅스 서버 centos 7, freebsd postfix dovecot , 바다아이 1989
109 리눅스 서버 Centos 7 Postgresql 10, 11 바다아이 1817
108 리눅스 서버 [Network] SSL / TLS 바다아이 2117
107 리눅스 서버 TLS , ssl 바다아이 2569
| |








Copyright ⓒ 2001.12. bada-ie.com. All rights reserved.
이 사이트는 리눅스에서 firefox 기준으로 작성되었습니다. 기타 브라우저에서는 다르게 보일 수 있습니다.
[ FreeBSD + GoLang + PostgreSQL ]
서버위치 : 구글 클라우드 플랫폼  실행시간 : 0.46165
to webmaster... gogo sea. gogo sea.