目的

主要测试dotnetty在大包体,或者粘包情况下的表现

测试

准备数据

代码部分:

var requestData = new RequestData();
requestData.Type = 0x0010;
for (int i = 0; i < 256; i++)
{
	requestData.VarTable.Add(i.ToString());
}

var bytes = SerializationHelper.Serialize(requestData);
Console.WriteLine(ByteBufferUtil.HexDump(bytes));
Console.WriteLine(bytes.Length);

执行程序后内容长度为1172,算上包头和ticket部分,最终为1180长度,其中包头值为1176=0x498

00000498000000010810120130120131120132120133120134120135120136120137120138120139120231301202313112023132120231331202313412023135120231361202313712023138120231391202323012023231120232321202323312023234120232351202323612023237120232381202323912023330120233311202333212023333120233341202333512023336120233371202333812023339120234301202343112023432120234331202343412023435120234361202343712023438120234391202353012023531120235321202353312023534120235351202353612023537120235381202353912023630120236311202363212023633120236341202363512023636120236371202363812023639120237301202373112023732120237331202373412023735120237361202373712023738120237391202383012023831120238321202383312023834120238351202383612023837120238381202383912023930120239311202393212023933120239341202393512023936120239371202393812023939120331303012033130311203313032120331303312033130341203313035120331303612033130371203313038120331303912033131301203313131120331313212033131331203313134120331313512033131361203313137120331313812033131391203313230120331323112033132321203313233120331323412033132351203313236120331323712033132381203313239120331333012033133311203313332120331333312033133341203313335120331333612033133371203313338120331333912033134301203313431120331343212033134331203313434120331343512033134361203313437120331343812033134391203313530120331353112033135321203313533120331353412033135351203313536120331353712033135381203313539120331363012033136311203313632120331363312033136341203313635120331363612033136371203313638120331363912033137301203313731120331373212033137331203313734120331373512033137361203313737120331373812033137391203313830120331383112033138321203313833120331383412033138351203313836120331383712033138381203313839120331393012033139311203313932120331393312033139341203313935120331393612033139371203313938120331393912033230301203323031120332303212033230331203323034120332303512033230361203323037120332303812033230391203323130120332313112033231321203323133120332313412033231351203323136120332313712033231381203323139120332323012033232311203323232120332323312033232341203323235120332323612033232371203323238120332323912033233301203323331120332333212033233331203323334120332333512033233361203323337120332333812033233391203323430120332343112033234321203323433120332343412033234351203323436120332343712033234381203323439120332353012033235311203323532120332353312033235341203323535
执行测试 - 大包

获取到第一个包1024

获取到第二个包体后,可以看到buffer自动扩充到了2k,其中前1180为传输内容,符合预期

执行结果

由于默认的1k得不到满足,所以每条消息到来都需要重新申请2k的内存,从而更快的消耗内存导致gc

执行测试 - 粘包

制作一个大概1335长度(1180+155)的包体进行发送, 扩充后内存情况如下

读取完第一个包体后,可以看到ridx=1180

开始第二个包体前半部分读取,ridx=0,读取剩下的155长度数据

由于tcp可以保持包的顺序,所以只要等待下一个包体到来就可以完成第二个包体的读取了。