Linux에서 높은 동시 socket 최대 연결 수 제한, tcp 기본 1024개 연결 해결

최근에 중간부품인 Memcached를 연결할 때 항상 다음과 같은 오류가 발생합니다.
[18-11-9 12:10:59:156 CST] 0000014b SystemOut     O 2018-11-09 12:10:59 156 [ERROR][Heal-Session-Thread][com.google.code.yanf4j.core.impl.AbstractController] SessionMonitor connect error java.net.SocketException: 파일을 너무 많이 열었습니다.nio.ch.Net.socket0(Native Method)         at sun.nio.ch.Net.socket(Net.java:529)         at sun.nio.ch.Net.socket(Net.java:512)         at sun.nio.ch.SocketChannelImpl.(SocketChannelImpl.java:122)         at sun.nio.ch.SelectorProviderImpl.openSocketChannel(SelectorProviderImpl.java:73)         at java.nio.channels.SocketChannel.open(SocketChannel.java:154)         at net.rubyeye.xmemcached.impl.MemcachedConnector.connect(MemcachedConnector.java:508)         at net.rubyeye.xmemcached.impl.MemcachedConnector$SessionMonitor.run(MemcachedConnector.java:127)
나중에 서버 측에서 설정한 socket의 수량이 충분하지 않은 것을 발견했습니다. linux는 기본적으로 1024개의 연결 요청만 허용합니다.인터넷 관련 문서를 참고하였으니 이 값을 좀 크게 설정하면 된다.
, linux 시스템의 기본 ulimit는 1024명의 액세스 사용자가 가장 많이 열 수 있는 프로그램 수입니다.일반 포트 (즉, 하나의 프로세스) 의 최대 연결이 2 인 16차방 65536
이 명령을 통해 ulimit-n은 기본값이 1024인 것을 볼 수 있습니다
전역 파일 보기 핸들 수 제한 (시스템 지원 최대치)cat/proc/sys/fs/file-max 프로세스 파일 보기 핸들 수 제한 ulimit-n
  • 첫걸음, 수정/etc/security/limits.conf 파일, 아래 행 (* 시스템 사용자 이름 지정) 과 같이 파일에 추가하고, Linux 시스템이 사용자에게 파일 열기 수에 대한 소프트 제한과 하드 제한을 수정합니다

  • * soft nofile 65536
    * hard nofile 65536
  • 2단계, 수정/etc/pam.d/login 파일, 파일에 다음과 같이 추가:

  • session required/lib/security/pam_limits.so
    64bit 시스템이라면 다음과 같이 해야 합니다.
    session required/lib64/security/pam_limits.so
  • 3단계, 수정/etc/sysctl.ff 파일, 파일에 (파일의 원본 내용을 지우거나 원래의 기초 위에서 추가합니다. 저는 이렇게 합니다.) 아래와 같이 추가합니다. (네트워크 핵이 TCP 연결에 대한 제한을 수정합니다.) 그 중에서 fs.file-max=1000000은 전역 제한으로 전체 기계의 최대 핸들 수..
  • net.ipv4.ip_local_port_range = 1024 65535
    
    net.core.rmem_max=16777216
    
    net.core.wmem_max=16777216
    
    net.ipv4.tcp_rmem=4096 87380 16777216
    
    net.ipv4.tcp_wmem=4096 65536 16777216
    
    net.ipv4.tcp_fin_timeout = 10
    
    net.ipv4.tcp_tw_recycle = 1
    
    net.ipv4.tcp_timestamps = 0
    
    net.ipv4.tcp_window_scaling = 0
    
    net.ipv4.tcp_sack = 0
    
    net.core.netdev_max_backlog = 30000
    
    net.ipv4.tcp_no_metrics_save=1
    
    net.core.somaxconn = 262144
    
    net.ipv4.tcp_syncookies = 0
    
    net.ipv4.tcp_max_orphans = 262144
    
    net.ipv4.tcp_max_syn_backlog = 262144
    
    net.ipv4.tcp_synack_retries = 2
    
    net.ipv4.tcp_syn_retries = 2
    
    fs.file-max=1000000
  • 네 번째 단계는 다음과 같은 명령을 실행합니다(위 설정을 적용하십시오)
  • /sbin/sysctl -p /etc/sysctl.conf
    
    /sbin/sysctl -w net.ipv4.route.flush=1
  • 다섯 번째 단계는 다음과 같은 명령을 실행합니다(linux 시스템이 네트워크를 최적화하려면 시스템이 열 수 있는 파일 수를 높여야 큰 병발을 지원할 수 있습니다. 기본 1024는 매우 부족합니다)
  • echo ulimit -HSn 65536 >> /etc/rc.local
    
     echo ulimit -HSn 65536 >>/root/.bash_profile
    
     ulimit -HSn 65536
  • 6단계, 기계를 다시 켜기 (내가 실험할 때 다시 켜지 않아도 효력이 발생하기 때문에 이 단계는 면할 수 있을 것이다)..

  • 수정을 통해 tcp는 65536개의 연결에 도달할 수 있습니다. 전혀 문제가 없습니다.
    이 명령을 통해 ulimit-n을 볼 수 있습니다. 값이 65536으로 바뀌었습니다. 즉, 현재 최대 65536개의 tcpsocket 연결을 지원합니다.
    현재 서버 명령에 몇 개의 TCP가 연결되어 있는지 확인하십시오.
    netstat -antp |grep -i est |wc -l
    netstat에 대해서는 다음을 참조하십시오.
    Linux netstat 명령 상세 정보
     
     
     
     

    좋은 웹페이지 즐겨찾기