안녕하세요. 얼마전에 TCP/IP 프로토콜에 정의되어있는 Delayed Ack 펑션에 대한 문의가 있어서 아래와 같이 정리해보았습니다.

 

관련 KB https://kb.vmware.com/s/article/1002598

 

Delayed Ack 의 역할

Delayed Ack 는 표준 TCP/IP 프로토콜에 정의되어있는 기능으로써, 간단하게 설명드리면
TCP 통신간 발생하는 Ack 의 수를 줄여서 TCP/IP 프로토콜의 오버헤드를 줄이는데 목적이 있는 기능입니다.

일반적으로는 TCP 헤더에는 Sequence Number 가 있고 그 외에 Ack number 라는 필드가 존재합니다.

 

간단한 예를 들면
호스트 A 가 Sequence number 10 에 1000 byte 크기의 데이터를 보내면, 받는쪽(호스트 B)에서는 Sequence number + 데이터크기(1000 byte) 를 붙여서 Sequence number 를 1010 로 설정 후 Ack 를 1011 로 설정하여 보냅니다.
그런데 이 ack 에는 데이터가 포함되어있을수도 있고, 단순한 1 bit 만 포함되어있을수도 있습니다. 그렇지만 1 bit 만 포함되어 있더라도, TCP/IP 헤더 자체는 40 bytes 크기이기 때문에 1bit 를 전달하기 위해서 40 bytes + 1bit를 전달해야 하는 경우가 생깁니다.

 

이러한 오버헤드를 줄이게 위해서 나온 기능이 Delayed Ack 입니다. 1개 받고 1개의 Ack 를 보내는게 아니라, 특정기간동안 수신된 세그먼트들에 대해서 모아두었다가 Ack 를 한번에 보내는 기능입니다.

 

Delayed Ack 에 대한 VMware 권고

 

ESXi 에서는 Delayed Ack 가 디폴트로 enable 되어 있어서 사용하도록 되어있습니다. ESXi 뿐만 아니라 대부분의 OS 가 Delay Ack 를 쓰는것이 권고일것입니다.. 다만 VMware 는 스토리지 벤더의 권고에 따라 enable/disable 를 하도록 하고 있습니다.

 

Note: Please contact your storage vendor to confirm if disabling Delayed ACK is a workaround that they recommend for their storage array.

 

KB 명시된 바와 같이 특정 스토리지에서는 Delay Ack 를 사용하지 않는 것이 나을수도 있습니다. 스토리지 벤더에서 not recommended 라면 쓰지 않는 방향으로 하시는게 좋겠습니다.

 

delay ack를 disable했을때의 리스크? 혹은 enable했을때와의 차이점

정확한 설명은 아닐 수 있는데요, delayed ack 는 일종의 도박이라고 보시면 됩니다. 위에서 언급한 “특정시간(os 별로 다른)” 내에 세그먼트가 많이 들어오면 그만큼 이점이 많고, 만약 세그먼트가 들어오거나 하지 않으면 “특정시간” 만큼을 그냥 날리는 셈입니다. 확률상 전자가 많다고 합니다.

 

위의 특정시간은 ESXi 의 경우에는 100ms ~ 500ms 사이라고 합니다.  정확하게 얼마로 설정되어있는지는 공개되어있지 않아서 찾질 못했습니다.

 

그외

 

그외로 ESXi 6.x 이상버전부터는 Target 별로 Delayed Ack 를 enable/disable 할것을 권장하고 있으며, 제가 테스트해본바로는 일단 붙이기 전에는 Target 의 Delayed Ack 설정 변경이 어렵습니다. 만약 정 붙이기전에 disable 이 필요하다면 Target 이 아니라 Initiator (보통은 ESXi Software iSCSI Initiator) 쪽에서 disable 할수 있겠으나 권장은 하지 않습니다.

 

Initiator 에서 끄는 법 (Global Configuration) 

 

Target 별로 끄는 방법

 

 

그럼 참고 하세요.

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다