Skip to content

qingtech/DCTCP-Linux

 
 

Repository files navigation

This is an implementation of Data Center TCP (DCTCP), an enhancement to the 
TCP congestion control algorithm for data centers. The patch applies to Linux 2.6.38.3. 

The implementation is based on the algorithm described in the paper 
"Data Center TCP (DCTCP)" (Alizadeh et al.), presented at SIGCOMM 2010. 
We refer to this paper for the details and evaluation of the algorithm. 
The paper is available online at 
http://www.stanford.edu/~alizade/Site/Publications_files/dctcp-final.pdf 

Authors:
Abdul Kabbani, Stanford University
Masato Yasuda, NEC Corp., Japan
Mohammad Alizadeh, Stanford University
------------------------------------------------------------------

[How to Apply Patch]

wget http://www.kernel.org/pub/linux/kernel/v2.6/linux-2.6.38.3.tar.bz2
tar jxvf linux-2.6.38.3.tar.bz2
cp dctcp-2.6.38.3-rev1.1.0.patch linux-2.6.38.3
cd linux-2.6.38.3
patch -p1 < dctcp-2.6.38.3-rev1.0.0.patch

After applying patch, please compile the kernel as usual.
No special kernel configuration is necessary for DCTCP.

[How to Enable DCTCP]

DCTCP (over Reno) is enabled by the following commands.

sysctl -w net.ipv4.tcp_congestion_control=reno
sysctl -w net.ipv4.tcp_dctcp_enable=1
sysctl -w net.ipv4.tcp_ecn=1

DCTCP is enabled when kernel parameter net.ipv4.tcp_dctcp_enable is 1
(default value is 0) and net.ipv4.tcp_ecn is 1. (default value is 2).

In testing DCTCP, the DCTCP kernel must be running both on the sender and 
the receiver. In addition, ECN functionality must be enabled at the switch. 
The default ECN marking threshold for DCTCP is 20 packets (30KB) at 1Gbps, 
and 65 packets (~100KB) at 10Gbps.

[Other DCTCP parameters]

We added the following two parameters.

- net.ipv4.tcp_delayed_ack

The default value is 1 (Delayed ACK is enabled). Delayed ACK can be disabled by 
setting this to 0.

- net.ipv4.tcp_dctcp_shift_g

This is the parameter, g, for updating dctcp_alpha. The default value 
is 4 (i.e. g = 1/2^4 = 1/16).

In every RTT, dctcp_alpha is updated as follows:

dctcp_alpha = (1-g) * dctcp_alpha + g * F.
(F is the fraction of marked data during the last RTT.)

[Changelog]

2011 Apl 29 - Rev1.0.0
2011 Sep  1 - Rev1.1.0

- Fixed a bug in initializing DCTCP internal parameters in the case of passive open
- Erased the unneccesary variable tp->prior_ack
- Changed the setting for enabling dctcp, for enabling dctcp, both 
  net.ipv4.tcp_dctcp_enable and net.ipv4.tcp_ecn are needed to be 1.