±¾ÎÄÔÚPGµç¾ºÐÅÏ¢ÔÆÂÍ·þÎñPGµç¾º¹ÙÍø²Ù×÷ϵͳKeyarchOS»·¾³Ï£¬¿ªÕ¹ÁËTCP´óÊý¾Ý°üͨÐÅ´«Êä¼¼ÊõµÄÓ¦ÓÃʵ¼ù£¬ÔÚÌáÉýÍÌÍÂÁ¿¡¢½µµÍʱÑÓ·½Ãæ×÷ÓýøÐÐÁËÑéÖ¤¡£
Ëæ×ÅÔÆPGµç¾º¹ÙÍø¡¢´óÊý¾Ý¡¢È˹¤ÖÇÄܵȼ¼ÊõµÄ¿ìËÙ·¢Õ¹£¬Êý¾Ý³ÊÏÖ³ö±¬·¢Ê½Ôö³¤Ç÷ÊÆ£¬Í¬Ê±Çý¶¯×ÅËãÁ¦³ÖÐøÌáÉý£¬È»¶ø£¬´«Í³DRAM²¢Î´ÊµÏÖͬ²½À©Õ¹ÒÔÂú×ãÓ¦ÓÃÐèÇó£¬Ó¦ÓöÔÄÚ´æÈÝÁ¿ºÍ´ø¿í²»¶ÏÌá¸ßµÄÐèÇó£¬Íƶ¯×ÅÄÚ´æÀ©Õ¹¼¼Êõ²»¶Ï·¢Õ¹£¬Ôڴ˱³¾°Ï£¬CXL³ÉΪ½â¾öÄÚ´æÀ©Õ¹Æ¿¾±µÄ×îÓÐǰ¾°µÄ¼¼Êõ£»ÓëDRAMÄÚ´æÏà±È£¬À©Õ¹ÄÚ´æÃæÁÙ¸ßÑÓ³Ù¡¢µÍ´ø¿íµÄ¼¼ÊõÌôÕ½£¬ÎªÁ˽â¾öÕâЩÌôÕ½£¬·Ö²ãÄÚ´æ¼¼ÊõÓ¦Ô˶øÉú¡£
1 ±³¾°
ÍøÂçÐÔÄÜÆ¿¾±£ºÎªºÎCPU±ÈNIC¸ü¹Ø¼ü£¿
ÔÚÍøÂçÐÔÄÜÈÏÖªÖдæÔÚÒ»ÖÖÖ±¹ÛÇãÏò£ºÈÏÎªÍø¿¨ÊǾö¶¨ÐÔÄܵĺËÐÄÒòËØ¡£µ«ÔÚʵ¼ÊÓÅ»¯³¡¾°ÖУ¬CPUÍùÍù²ÅÊÇÕæÕýµÄÆ¿¾±£¬ÕâÒ»µãÔÚ¡°Ð¡°ü³¡¾°¡±ÏÂÌåÏÖµÃÓÈΪÃ÷ÏÔ£ºÍø¿¨µÄ´ø¿í£¨Èç100G¡¢400G£©ÊÇÓ²¼þ¹ÌÓÐÄÜÁ¦£¬µ«Êý¾Ý´«Êäʱ£¬Ã¿¸öÊý¾Ý°ü¶¼ÐèÒªCPU´¦ÀíÐÒéÕ»Âß¼£¨ÈçTCP/IPÍ·²¿½âÎö¡¢Ð£ÑéºÍPGµç¾º¹ÙÍø¡¢Â·Óɾö²ß¡¢Á¬½Ó״̬ά»¤µÈ£©¡£
С°ü³¡¾°ÖУ¬Òª´ïµ½Íø¿¨µÄ×î´ó´ø¿í£¬ÐèÒª´¦ÀíµÄÊý¾Ý°üÊýÁ¿»á¼¤Ôö£¬Èç100G´ø¿íÏ£¬64×Ö½ÚС°üµÄÿÃë´¦ÀíÁ¿Ô¼Îª1.9ÒÚ¸ö£¬´ËʱCPUµÄ´¦Àí×ÊÔ´»áÒò¸ßƵÖжϺÍÐÒéÕ»´¦Àí¿ªÏúѸËٺľ¡£¬µ¼ÖÂCPUÏÈÓÚÍø¿¨´ïµ½Æ¿¾±£¬Íø¿¨´ø¿íÎÞ·¨Öظ´ÀûÓá£
ÏÖÓÐOffload¼¼Êõ£º¼õÉÙCPU¸ºµ£µÄ»ù´¡
Ϊ¼õÇáCPU´¦ÀíѹÁ¦£¬ÏÖÓÐÄں˺ÍÍø¿¨ÒÑͨ¹ý¡°Ð¶ÔØ£¨Offload£©¡±¼¼Êõ¼õÉÙCPUµÄ°ü´¦ÀíÁ¿£¬µäÐ͵İüÀ¨ TSO¡¢GSO¡¢GRO£º
´«Í³°ü´óСµÄÏÞÖÆ£º64K
ÏÖÓÐoffload¼¼Êõͨ¹ý½«´ó°üÐ¶ÔØµ½Ó²¼þ»òÑÓ³ÙÖ´Ðеķ½Ê½ÓÐЧ¼õÇáÁËCPU´¦ÀíѹÁ¦£¬µ«Ö§³ÖµÄ´ó°ü³¤¶È´æÔÚÏÞÖÆ¡£ÄÚºËÐÒéÕ»´¦ÀíµÄÊý¾Ý°ü×î´óÖ§³Ö64K£¬IPÐÒéÍ·²¿µÄ¡°Total Length¡±×Ö¶ÎΪ16룬Æä×î´óֵΪ2^16-1=65535 ×Ö½Ú£¨Ô¼ 64KB£©£¬ÊÇIPÊý¾Ý°üµÄÀíÂÛ×î´ó³¤¶ÈÏÞÖÆ¡£
BIG TCPµÄ±¾ÖÊÊÇͨ¹ý¡°Ôö´óÄں˴¦ÀíµÄÊý¾Ý°ü´óС£¨³¬¹ý64K£©¡±À´¼õÉÙ CPUµÄ°ü´¦Àí×ÜÁ¿£¬´Ó¶øÊͷŸßËÙÍøÂ磨100GÒÔÉÏ£©µÄÐÔÄÜDZÁ¦¡£ÆäºËÐÄÂß¼Ó롰С°ü³¡¾° CPU Æ¿¾±¡±Ö±½Ó¶ÔÓ¦ ¡ª¡ªÍ¨¹ý¼õÉÙCPUµÄ ¡°Öظ´ÀͶ¯¡±£¨Ã¿¸ö°üµÄ¹Ì¶¨´¦Àí¿ªÏú£©£¬ÈÃCPUºÍÍø¿¨µÄÄÜÁ¦¸üÆ¥Å䣬×îÖÕÌáÉýÍøÂçÍÌÍÂÁ¿²¢½µµÍÑÓ³Ù¡£
2 BIG TCPʵÏÖÔÀí
IPv6
ÔÚIPv6°üÍ·ÖУ¬´æÔÚ³¤¶ÈΪ32λµÄhop-by-hop×ֶοÉÒÔ´æ´¢Ò»Ð©ÌØ¶¨ÐÅÏ¢¡£ÖðÌøÑ¡ÏîÍ·£¨Hop-by-Hop Options Header£©ÊÇIPv6ÐÒéÖеÄÒ»ÖÖÀ©Õ¹Í·²¿£¬ËüÔÊÐíÔÚÊý¾Ý°ü´«Êä¹ý³ÌÖÐÿ¸öÔ¾µã£¨Â·ÓÉPGµç¾º¹ÙÍø»ò½Úµã£©¶¼Äܹ»¶ÁÈ¡²¢´¦Àí¸ÃÍ·²¿ÖеÄÐÅÏ¢¡£
Äں˽«ÔÏÈ´æ´¢Êý¾Ý°ü³¤¶ÈµÄ×Ö¶ÎÉèÖÃΪ0£¬ÔÚhop-by-hop×Ö¶ÎÖÐ´æ´¢ÕæÊµµÄ°ü³¤¶È£¬Ê¹µÃ°üµÄ×î´ó´óС¿ÉÒÔ´ïµ½4GB¡£È»¶ø£¬ÎªÁ˰²È«Æð¼û£¬×î´ó´óСÏÞÖÆÉèÖÃΪ512K£¬Òò´Ë´¦ÀíµÄ°üÊýÁ¿¿É½µµÍÖÁÔÀ´µÄ°Ë·ÖÖ®Ò»¡£ipv6»ù±¾±¨ÎÄÍ·ÐÞ¸ÄÈçͼ1Ëùʾ¡£ÐèҪעÒâµÄÊÇ£¬Ä¿Ç°Ö»ÓÐTCPÕ»¿ÉÄÜ»áÉú³É³¬´ó±¨ÎÄ£¬Òò´ËÕâ¸öÀ©Õ¹Í·²¿½öÔÚÐÒéÕ»ÄÚʹÓ㬲»»áͨ¹ýÎïÀíÁ´Â··¢ËÍ¡£

ͼ1£ºBIG TCPʵÏÖÔÀí: IPv6»ù±¾±¨ÎÄÍ·
BIG TCP HBHÍØÕ¹Í··â×°´¦Àí£º
intip6_xmit(conststructsock *sk,structsk_buff *skb,structflowi6 *fl6,
__u32 mark,structipv6_txoptions *opt,inttclass, u32 priority)
{
...
if(unlikely(seg_len > IPV6_MAXPLEN)) {
hop_jumbo = skb_push(skb, hoplen);
/*nexthdr£ºÖ¸ÏòÏÂÒ»¸öÍØÕ¹Í·*/
hop_jumbo->nexthdr = proto;
/*hdrlen£ºÍ·²¿³¤¶È£¨¶ÔÓÚÖðÌøÑ¡ÏîÍ·²¿£¬Í¨³£Îª0£©*/
hop_jumbo->hdrlen =0;
/*tlv_type£ºTLVÀàÐÍ£¬ÉèÖÃΪIPV6_TLV_JUMBO*/
/*±íʾÕâÊÇÒ»¸ö³¬´ó±¨ÎÄ*/
hop_jumbo->tlv_type = IPV6_TLV_JUMBO;
/*tlv_len£ºTLV³¤¶È£¬ÉèÖÃΪ4×Ö½Ú*/
hop_jumbo->tlv_len =4;
/*jumbo_payload_len£º³¬´ó±¨ÎĵÄʵ¼Ê¸ºÔس¤¶È*/
hop_jumbo->jumbo_payload_len = htonl(seg_len + hoplen);
proto = IPPROTO_HOPOPTS;
seg_len =0;IP6CB(skb)->flags |= IP6SKB_FAKEJUMBO;
}
...
}
IPv4
ÓÉÓÚIPv4ÖÐûÓÐÏñIPv6ÄÇÑùµÄ¿ÉÑ¡ÍØÕ¹Í·£¬Òò´ËÎÞ·¨ÔÚIPÍ·Öб£´æÕæÊµµÄ³¤¶ÈÐÅÏ¢¡£Òò´Ë²ÉÓÃÁËÁíÒ»ÖÖ·½·¨£¬Ö±½Ó´ÓÄں˵Äskb->lenPGµç¾º¹ÙÍøÊý¾Ý°üµÄÕæÊµ³¤¶È£¬²¢½«IPÍ·²¿µÄtot_len×Ö¶ÎÉèÖÃΪ0¡£
3 »ùÓÚBIG TCPµÄTCP´«Êä
´«Í³TCP ÊÜÏÞÓÚ IP Í·ÖÐ 16 볤¶È×ֶΣ¬µ¥¸öÊý¾Ý°ü×î´óΪ 64KB¡£BIG TCP ÀíÂÛÉÏ¿ÉʹÊý¾Ý°ü³¤¶È´ïµ½ 4GB£¬Ä¿Ç°Í¨³£ÉèÖÃΪ 512KB£¬Ïà±È֮ǰÀ©´óÁËÊý±¶¡£
¶ÔÓÚIPv6
1)·¢ËÍ£ºµ±Êý¾Ý°ü³¤¶È³¬¹ý65535×Ö½Úʱ£¬½« ipv6 °üÍ·µÄ³¤¶È×Ö¶ÎÉèÖÃΪ 0£¬Ìí¼ÓHBHÀ©Õ¹Í·£¬´ÓÍØÕ¹Í·ÖжÁÈ¡ÓÐЧÊý¾Ý³¤¶È¡£ÈôÍø¿¨Ö§³ÖTSO£¬½«´óÊý¾Ý°üÐ¶ÔØµ½Íø¿¨Ö´ÐзֶΣ¬·Ö¶ÎÇ°ÒÆ³ýÍØÕ¹Í·¡£ÈôÍø¿¨²»Ö§³ÖTSO£¬ÔÚ¿ªÆôGSOÇé¿öÏ£¬´óÊý¾Ý°üÑÓ³Ùµ½³öÍøÂçÐÒéÕ»ºóÖ´ÐзֶΣ¬·Ö¶ÎǰͬÑùÐèÒªÒÆ³ýÍØÕ¹Í·¡£
2)½ÓÊÕ£ºGROºÏ²¢Êý¾Ý°ü£¬µ±ºÏ²¢ºóµÄÊý¾Ý°ü´óС³¬¹ý65535×Ö½Úʱ£¬Ìí¼ÓHBHÍØÕ¹Í·£¬²¢½«IPV6Í·²¿µÄ³¤¶È×Ö¶ÎÉèÖÃΪ0¡£
¶ÔÓÚIPv4
1)·¢ËÍ£ºµ±Êý¾Ý°ü³¤¶È³¬¹ý65535×Ö½Úʱ£¬½«IPÍ·²¿µÄtot_len×Ö¶ÎÉèÖÃΪ0£¬±íʾÕâÊÇÒ»¸ö³¬´ó±¨ÎÄ¡£ÈôÍø¿¨Ö§³ÖTSO£¬½«´óÊý¾Ý°üÐ¶ÔØµ½Íø¿¨Ö´ÐзֶΡ£ÈôÍø¿¨²»Ö§³ÖTSO£¬ÔÚ¿ªÆôGSOÇé¿öÏ£¬´óÊý¾Ý°üÑÓ³Ùµ½³öÍøÂçÐÒéÕ»ºóÖ´ÐзֶΡ£
2)½ÓÊÕ£ºµ±ºÏ²¢ºóµÄÊý¾Ý°ü´óС³¬¹ý65535×Ö½Úʱ£¬½«IPÍ·²¿µÄtot_len×Ö¶ÎÉèÖÃΪ0£¬Ê¹ÓÃskb->len×÷ΪÊý¾Ý°üµÄ³¤¶È,È·±£³¬´ó±¨ÎÄÄܹ»ÔÚ½ÓÊÕ·¾¶ÉÏÕýÈ·´¦Àí¡£
¾ßÌåÁ÷³ÌÈçÏÂͼËùʾ£º

ͼ2£ºBIG TCP¹¦Äܼܹ¹Í¼
4 »ùÓÚÔÆÂÍKeyarchOSµÄBIG TCP¼¼Êõʵ¼ù
»ùÓÚÔÆÂÍKeyarchOS µÄBIG TCP ¼¼Êõʵ¼ù£¬ÊÇÔÚ²Ù×÷ϵͳ²ãÃæÕë¶Ô¸ßËÙÍøÂçÐÔÄÜÓÅ»¯µÄÉî¶È̽Ë÷£¬ÆäºËÐÄÔÚÓÚͨ¹ýÊÊÅäÖ÷Á÷Íø¿¨Çý¶¯£¬³ä·ÖÊÍ·ÅBIG TCPÔÚ´óÊý¾Ý°ü´¦ÀíÉϵÄÓÅÊÆ£¬×îÖÕʵÏÖÍøÂçÐÔÄܵÄÔ¾Éý¡£ÎÒÃǵÄÖ÷Òª¹¤×÷°üÀ¨Äں˵͍֯ÒÔ¼°Íø¿¨Çý¶¯µÄÊÊÅä¡£
ÔÚÄں˶¨ÖÆ»·½Ú£¬ÎÒÃÇ»ùÓÚKeyarchOS kernel-4.19Äںˣ¬»ØºÏÉÏÓÎkernel-6.3 BIG TCPµÄpatch¡£
ÔÚÇý¶¯ÊÊÅä»·½Ú£¬Õë¶ÔÍø¿¨½øÐÐÁ˶¨ÖÆ»¯Ð޸ģ¬º¸ÇÁ½¸ö¹Ø¼ü·½Ïò£º
¡öÒ»·½Ã棬ÐÞ¸ÄBIG TCP²ÎÊýÊ¹Íø¿¨ÉúЧ¡£Í¨¹ýÐÞ¸ÄÇý¶¯£¬ÔÊÐíÓû§Ì¬Ö±½ÓÐÞ¸ÄBIG TCPÏà¹ØµÄ²ÎÊýÀ´ÉèÖÃÍøÂçÊý¾Ý°üµÄ´óСÏÞÖÆ£¬°üÀ¨gso_max_size¡¢gro_max_sizeÒÔ¼°Õë¶ÔIPv4³¡¾°µÄgso_ipv4_max_size¡¢gro_ipv4_max_size¡£
¡öÁíÒ»·½Ã棬ÔÚÍø¿¨·Ö¶ÎÖ´ÐÐÇ°ÒÆ³ýHBHÍ·¡£ÔÚÍø¿¨Ö´ÐзֶβÙ×÷ǰ£¬Çý¶¯ÐèÒÆ³ýIPv6ÐÒ鱨ÎÄÖеÄHBH£¨Hop-by-Hop Options Header£¬ÖðÌøÑ¡ÏîÍ·£©µÄ²Ù×÷£¬HBHչͷ½öÏÞÓÚÄÚºËÍøÂçջʹÓ㬲»»áÔÚÎïÀíÁ´Â·ÉÏ·¢ËÍ¡£
ÔÚÍê³ÉÄں˶ÔBIG TCPµÄ¹¦ÄÜÖ§³Ö¼°ÉÏÊöÇý¶¯ÊÊÅäºó£¬ÍŶӻùÓÚÔÆÂÍKeyarchOS²Ù×÷ϵͳ£¨¾ßÌå°æ±¾ÎªKeyarchOS5.8£©¿ªÕ¹ÁËϵͳÐԵŦÄÜÑéÖ¤ÓëÐÔÄܲâÊÔ£¬ÒÔÑéÖ¤BIG TCPÐÔÄÜ¡£
¡öÓ²¼þÉÏ£¬²ÉÓÃÁ½¿éͬÐͺŵÄÍø¿¨(Íø¿¨_M_MCX516A-GCAT_50G_Ë«¹â¿Ú_PCIE )ͨ¹ýÖ±Á¬·½Ê½¹¹½¨²âÊÔÁ´Â·£¬ÅųýÁËÖмäÍøÂçÉ豸£¨Èç½»»»»ú£©¶ÔÊý¾Ý´«ÊäµÄ¸ÉÈÅ£¬È·±£²âÊÔ½á¹ûÄÜÕæÊµ·´Ó³BIG TCPÔڶ˵½¶ËͨÐÅÖеÄÐÔÄܱíÏÖ¡£
¡öϵͳ·½Ã棬ĬÈÏ¿ªÆôGSO/GRO¹¦ÄÜ£¬GSO/GRO°ü´óСÏÞÖÆ125K£¬ÆäÖÐ64KÏÞÖÆ´ú±í²»¿ªÆôBIG TCP;³¬¹ý64K´ú±í¿ªÆôBIG TCPºó£¬ÍøÂçͨ·ÖÐÄܽÓÊÕµÄ×î´ó°ü´óС¡£¾ßÌåÖ¸ÁîÈçÏ£º
Ipv4:iplinksetdevxxxgso_ipv4_max_size128000gro_ipv4_max_size128000 Ipv6:iplinksetdevxxxgso_max_size128000gro_max_size128000
¡öÈí¼þ¹¤¾ß·½Ã棬ʹÓÃÒµ½ç³£ÓõÄnetperf×÷ÎªÍøÂçÐÔÄÜ»ù×¼²âÊÔ¹¤¾ß£¬¿É¾«×¼²âÁ¿ÍÌÍÂÁ¿¡¢ÑӳٵȹؼüÖ¸±ê¡£²âÊÔ·½Ê½ÎªTCP_RR£ºÔÚͬһ¸ötcpÁ¬½ÓÖУ¬²âÊÔ¶ÔÏó½øÐжà´ÎrequestºÍrespose½»Òס£Ñ»·Ö´ÐÐ10´Înetperf²âÊÔ£¬Ã¿´ÎÇëÇóºÍÏìÓ¦´óСÉèÖÃΪ-r80000,8000×Ö½Ú£¬²É¼¯µÄÐÔÄÜÖ¸±ê°üÀ¨ÑÓʱ(lat,us)ºÍÍÌÍÂÁ¿(thp,Mbits/sec)Êý¾Ý£¬¾ßÌåÖ¸ÁîÈçÏ£º
foriin{1..10};donetperf-tTCP_RR-H1.1.1.2---r80000,80000-OMIN_LATENCY,P90_LATENCY,P99_LATENCY,MEAN_LATENCY,THROUGHPUT|tail-1;doneIPv6£º¿ªÆôBIG TCPƽ¾ùÍÌÍÂÁ¿ÌáÉý17.33%£¬ÑÓʱ½µµÍ19.7%

IPv4£º¿ªÆôBIG TCPƽ¾ùÍÌÍÂÁ¿ÌáÉý27.0%£¬ÑÓʱ½µµÍ17.64%

»ùÓÚÔÆÂÍKeyarchOSµÄ¼¼Êõʵ¼ù½á¹û˵Ã÷»ùÓÚBIG TCP¼¼ÊõÔÚÍø¿¨´ø¿í¸ßµÄ³¡¾°Ï¿ÉÏÔÖøÌáÉýÍÌÍÂÁ¿£¬½µµÍÑÓʱ¡£
²úÆ·ÏÂÔØ
²úÆ·¼¤»î
ÊÛǰ×Éѯ
ÊÛºó·þÎñ
»Øµ½¶¥²¿
ÊÛǰ×Éѯ
ÊÛºó·þÎñ