본문 바로가기
카테고리 없음

리눅스에 몇개의 connection을 생성할 수 있을까?(결론 안남)

by 손너잘 2021. 5. 1.

우테코의 이번 인프라 미션에서는, 서버에 몇개의 소켓을 연결할 수 있는지를 물어보는 문제가 있다.

이 문제를 풀며 새로 공부한 내용들을 한번 적어보도록 하겠다.

 

기본적으로 알아야 할 부분은, 리눅스는 대부분의 io, proc등을 파일로 관리한다는 점이다. 따라서 소켓을 몇개나 만들 수 있는지 확인하기 위해서는 몇개의 파일을 생성할 수 있는지를 확인하면 된다.

 

이와 관련된 글이 있다.

woowabros.github.io/experience/2018/04/17/linux-maxuserprocess-openfiles.html

 

Java, max user processes, open files - 우아한형제들 기술 블로그

안녕하세요? 우아한 형제들에서 결제/정산 시스템을 개발하고 있는 이동욱입니다.올해 사내 블로그 포스팅 주제로 Linux의 open files, max user processes 설정에 대해 정리하게 되었습니다.계기는 단순

woowabros.github.io

meetup.toast.com/posts/54

 

리눅스 서버의 TCP 네트워크 성능을 결정짓는 커널 파라미터 이야기 - 2편 : NHN Cloud Meetup

리눅스 서버의 TCP 네트워크 성능을 결정짓는 커널 파라미터 이야기 - 2편

meetup.toast.com

두 글에 따르면 프로세스에서 생성하는 소켓은 결국 리눅스의 open-files, max user processes, fs.file-max 설정에 영향을 받는것으로 보인다.

 

그중 이번 글에서 중심이 될 부분은 open-files이다. linux 공식 문서에 따르면 open-files는 "프로세스 당 생성할 수 있는 파일의 개수" 를 의미한다.

 

위 정의에서 참 많은 고민이 들었다.

일단 첫번째 의문은, 프로세스당이라는 것이 정말 사용자의 "프로세스" 단위인가, 아니면 사용자가 처음 실행하는 "쉘" 단위인가 부터가 의문이었다. 결론부터 말하자면 사용자의 "프로세스" 단위가 맞다.

이를 위해서 한가지 실험을 진행해 봤다.

먼저 가상머신 2개 A, B를 만들었다. 그리고 A 서버의 상태를 위와같이 만들었다. 바꾼거라고는 openfiles를 1024로 줄인 것(글을 작성하면서 256으로 하여 다시 실험하였다).

그리고 가상머신 A에 jojodul님이 실험에 사용했던 소스(github.com/jojoldu/linux-thread)를 clone하여 8080포트와 8081포트로 빌드하고 프로세스 2개를 동시에 띄웠다. 이 프로세스는 a, b라고 하겠다.

 

가상머신 A에서 프로세스 a, b는 가상머신 B에 띄워진 서버와 connection을 맺는다. 그리고 그 연결은 길게 유지된다. 

프로세스 a를 이용해 Too many open files 에러가 나올때 까지 connection을 만들고 프로세스 b에서 connection이 정상적으로 맺어지는지 확인함으로써 우리는 프로세스 단위라는 것의 정의를 명확히 확인할 수 있다.

 

 

시험결과는 위와 같다. 아래쪽(프로세스 a)에서 Too many open files가 발생함에도 위쪽(프로세스 b)는 정상적으로 connection을 맺는다.

 

그렇다면, 이 실험의 결과로 프로세스마다 open-files가 적용된다는 것을 확인했으니 과면 max-user process * open-files가 답일까?

 

-> 크루와의 토론 끝에 이게 맞다고 결론지었다. 리눅스는 결국 스레드도 프로세스로 취급하기 때문에.... 처음 글을 작성할 때 Too many open files의 발생 원인을 open files 뿐만 아니라 max user process까지 포함해서 생각해 잘못된 결론을 도출했다.

 

-> 하지만, connection은 하나의 스레드에서 하나만 할 수 있기 때문에(동일한 시점 기준으로) 아래와 같은 결론을 내도 되지 않을까 싶기도 하고...(connection 요청하고 요청이 끝날 때 까지 wait상태가 되기 때문에..., 비동기로 하려면 또 스레드를 생성해야 하고..)

 

손너잘의 주장

내 대답은 NO이다.  조졸두님 글에서도 나와있듯, 리눅스는 프로세스와 스레드를 따로 구분하지 않는다. 따라서 우리가 스레드 하나당 하나의 connection을 맺는다고 가정하고 N개의 connection을 가진다고 하면, 적어도 1 + N 개(프로세스 + 스레드) 의 프로세스가 생성되는것과 같다.
따라서 정확하진 않지만 (기본적으로 생성되는 fd와 이미 실행중인 프로세스, 스레드 등으로 인해) 대~~충 보면 아래를 만족하는 P와 T가 존재할 때  

open-files + max user process <= fs.file-max
T(count of connection) <= open-files
P(count of process) * (1 + T) <= max user process

를 만족하는 P,T에 대해 P * T 정도가 최대 connection 개수라는것을 알 수 있다. (절대 수식은 정확하지 않다. 그냥 대략적으로 파악하기 위해 새웠다).

 

 

 

문제 하나로 인해 야크 쉐이빙 제대로 했지만.. 그래도 나름 재미있었다...

댓글