본문 바로가기
WEB&WAS/Apache

WEB) Web Server Kernel Parameter에 대한 이야기

by LILO 2021. 4. 24.
반응형

Introduction

 

Web Server와 Web Application Server는 네트워크를 통해 서비스를 제공합니다.

 

네트워크를 통해 데이터를 전달하기 때문에 네트워크 장비에서의 설정도 중요하지만 OS에서 기본으로 제공되는 TCP와 관련된 커널 변수(Parameter)를 수정할 필요가 있습니다.

 

이 글에서는 TCP에 대한 네트워크 관련 내용을 주로 다룰 것입니다. 해당 파라미터를 튜닝을 할 때 왜 사용해야되는지 알고 써야되기 때문입니다.

아무래도 통신과 관련된 직접적인 변수이기 때문에 알고 쓰는 것이 좋습니다.

 

 

TCP 관련 Kernel Parmeter 수정(Tuning) 왜 하나요?

 

누군가가 저에게 이런 질문을 한다면 저는 이러한 말을 합니다.

동접자가 많으면 간혹 가다 서비스가 끊기는 경우가 있는데 이러한 현상을 방지하기 위해서 해당 작업을 해요.

 

그게 왜 TCP 관련을 수정해야되는지 물어보면 저는 TCP가 데이터를 신뢰성있게 전달할 때 사용하는 친구인데 이 친구가 제 역할을 하기위해 파라미터 값을 수정하는 것이라고 대답할 것 같습니다.

 

 

TCP란?

 

TCP는 서버와 클라이언트 간에 데이터를 신뢰성있게 전달하려고 만들어진 프로토콜입니다.

즉, TCP는 내가 상대방에게 정확하게 정보를 전달해야 될 떄 쓰는 통신이기 때문에 웹이나 이메일에 사용됩니다.

 

TCP 통신의 경우 Client와 Server 간 확인 절차를 거치는데 우리는 보통 이러한 것을 연결지향 프로토콜이라고 합니다. 

TCP에서 하는 이러한 Client와 Server 간 확인 절차를 3 Way Handshake라고 부릅니다.

 

 

 

TCP 3 Way Handshake

 

 

 

위의 그림은 Client(접속하는 사람)와 Server가 TCP 통신하는 과정입니다.

 

먼저 그림에 나온 State와 3 Way Handshake 과정에 대한 용어들에 대해서 알아 보겠습니다.

 

○ State

- CLOSED: 닫힌 상태
- LISTEN: 포트가 열린 상태로 연결 요청 대기중
- SYN-SENT: SYN 요청을 한 상태
- SYN-RECEIVED: SYN 요청을 받고 클라이언트의 응답을 기다리는 중
- ESTABLISHED: 확인된 상태 즉, 연결을 확인된 상태



○ 3 Way Handshake 패킷

- SYN (Client → Server): 클라이언트가 서버에게 접속 요청함
- SYN+ACK (Server → Client): 서버가 접속 요청을 확인해서 클라이언트에게 응답함
- ACK (Client → Server): 클라이언트가 서버에게 정상적으로 전달받았다고 알림

 

이제 통신 과정에 대해서 자세히 알아 보려고 합니다.

 

먼저 클라이언트와 서버 양쪽은 통신을 하기 전이니까 통신이 닫힌 상태입니다. (CLOSED)

 

클라이언트가 서버에게 접속 요청을 합니다. 접속 요청을 보낼 때 SYN 패킷을 날립니다. 그러면 클라이언트의 현재 상태는 SYN_SENT(SYN 패킷 전송함) 상태가 됩니다.

 

그러면 서버는 접속 요청(SYN 패킷)을 받았으니 SYN-RECEIVED 상태가 됩니다. 

서버는 받은 요청을 확인하고 클라이언트에게 응답합니다. 응답할 때 SYN(전송)+ACK(응답) 패킷을 전송합니다.

 

클라이언트는 서버에게 응답을 받았으니 이제 원하는 정보를 얻은 상태가 되어 연결을 확인합니다. (ESTABLISHED)

 

마지막으로 클라이언트가 서버에게 정보를 정상적으로 받았다고 ACK 패킷을 전송해줍니다. 

그러면 서버도 연결을 확인한 상태가 됩니다. (ESTABLISHED)

 

 

Receiver Window Size를 65KB 이상 사용하면 어떻게 될까요?

 

인터넷을 사용하다 보면 대역폭을 넓혀야 될 상황이 오는 경우가 종종 옵니다. 검색을 해보면 RTT를 올려라는 해답이 나오긴 합니다. 실질적으로 RTT를 올리는 것은 Peer 간 물리적 종속 거리 떄문에 구현하기 힘듭니다.

 

또 다른 방안으로는 Receiver Window Size를 늘려줘서 한번에 받을 수 있는 데이터의 양을 늘려주는 방안이 있습니다.

 

기존에 Window Size가 64KB까지만 지원을 해서 위에 파리미터 변수중 " net.ipv4.tcp_window_scaling"에 1을 줘서 64KB 이상 쓰겠다고 성능 향상에 관한 튜닝을 해줍니다.

반응형