LinuxÒÔÆäÇ¿´óµÄÍøÂ繦Äܺ͸ßЧµÄ×ÊÔ´¹ÜÀí¶øÎÅÃû£¬¶øÊý¾Ý½ÓÊÕ»úÖÆÔòÊÇÕâÒ»ÇеĻù´¡
±¾ÎĽ«ÉîÈë̽ÌÖLinuxÖеÄÊý¾Ý½ÓÊÕ¹ý³Ì£¬´ÓÍøÂçÊý¾Ý°ü½ÓÊÕ¡¢Îļþ´«ÊäÃüÁϵͳµ×²ãµÄÊý¾Ý´¦Àí»úÖÆ£¬È«Ãæ½âÎö¡°received¡±ÔÚLinuxÖеÄʵÏÖºÍÓ¦ÓÃ
Ò»¡¢ÍøÂçͨÐÅÖеÄÊý¾Ý½ÓÊÕ ÔÚLinuxϵͳÖУ¬ÍøÂçͨÐÅÊÇÊý¾Ý½ÓÊÕµÄÖØÒª³¡¾°Ö®Ò»
µ±Ò»Ì¨¼ÆËã»úͨ¹ýÍøÂçÓëÆäËûÉ豸»ò·þÎñÆ÷½øÐÐÊý¾Ý½»»»Ê±£¬½ÓÊÕÊý¾Ý³ÉΪ±Ø²»¿ÉÉٵĻ·½Ú
LinuxÌṩÁ˷ḻµÄÍøÂç±à³Ì½Ó¿Ú£¬ÆäÖÐSocket±à³ÌÊÇʵÏÖÍøÂçͨÐŵĹؼü¼¼Êõ
Socket±à³ÌÔÊÐí³ÌÐòÔÚÍøÂçÉÏµÄÆäËûÉ豸»ò³ÌÐòÖ®¼ä½¨Á¢Á¬½Ó£¬ÊµÏÖÊý¾ÝµÄ·¢ËͺͽÓÊÕ
ÔÚLinuxÖУ¬½ÓÊÕÊý¾Ýͨ³£Éæ¼°ÒÔϼ¸¸ö²½Ö裺 1.½¨Á¢Á¬½Ó£º¿Í»§¶ËºÍ·þÎñÆ÷ͨ¹ýSocket½¨Á¢Á¬½Ó£¬Õâͨ³£Éæ¼°Èý´ÎÎÕÊÖ¹ý³Ì£¬È·±£Ë«·½Äܹ»¿É¿¿µØÍ¨ÐÅ
2.µÈ´ýÊý¾Ý£º·þÎñÆ÷ͨ³£»áÔÚij¸ö¶Ë¿ÚÉϼàÌýÀ´×Ô¿Í»§¶ËµÄÁ¬½ÓÇëÇó
Ò»µ©Á¬½Ó½¨Á¢£¬·þÎñÆ÷¾Í¿ÉÒԵȴý½ÓÊÕÊý¾Ý
3.½ÓÊÕÊý¾Ý£ºµ±Êý¾Ýµ½´ïʱ£¬·þÎñÆ÷ͨ¹ýSocket½ÓÊÕÊý¾Ý
ÔÚCÓïÑÔÖУ¬Õâͨ³£Í¨¹ý`recv`»ò`read`º¯ÊýÀ´ÊµÏÖ
4.´¦ÀíÊý¾Ý£º½ÓÊÕµ½Êý¾Ýºó£¬·þÎñÆ÷»á¸ù¾ÝÒµÎñÂß¼¶ÔÊý¾Ý½øÐд¦Àí
Õâ¿ÉÄܰüÀ¨½âÎöÊý¾Ý¡¢´æ´¢Êý¾Ý»òÏò¿Í»§¶Ë·¢ËÍÏìÓ¦
5.¹Ø±ÕÁ¬½Ó£ºÊý¾Ý´«ÊäÍê³Éºó£¬Ë«·½»á¹Ø±ÕSocketÁ¬½Ó£¬ÊÍ·Å×ÊÔ´
ÔÚLinuxÖУ¬Êý¾Ý½ÓÊÕµÄЧÂʺͿɿ¿ÐÔ¶ÔÓÚÍøÂçͨÐÅÖÁ¹ØÖØÒª
LinuxÄÚºËÌṩÁ˶àÖÖÓÅ»¯»úÖÆ£¬ÈçTCP/IPÐÒéÕ»µÄÓÅ»¯¡¢ÍøÂ绺³åÇøµÄ¹ÜÀíÒÔ¼°ÖжϺÍÈíÖжϵĴ¦Àí£¬ÒÔÈ·±£Êý¾ÝÄܹ»¿ìËÙ¡¢×¼È·µØ±»½ÓÊպʹ¦Àí
¶þ¡¢Îļþ´«ÊäÃüÁîÖеÄÊý¾Ý½ÓÊÕ ÔÚLinuxϵͳÖУ¬Îļþ´«ÊäÊÇÁíÒ»ÖÖ³£¼ûµÄÊý¾Ý½ÓÊÕ³¡¾°
LinuxÌṩÁ˶àÖÖÎļþ´«ÊäÃüÁÈç`rz`ºÍ`sz`£¬ÓÃÓÚÔÚ±¾µØ¼ÆËã»úºÍÔ¶³Ì·þÎñÆ÷Ö®¼ä´«ÊäÎļþ
- rzÃüÁrzÃüÁîÓÃÓÚ´ÓÔ¶³Ì·þÎñÆ÷½ÓÊÕÎļþ
µ±Óû§ÔÚÔ¶³Ì·þÎñÆ÷ÉÏÖ´ÐÐ`rz`ÃüÁîʱ£¬Ëü»áÌáʾÓû§Ñ¡Ôñ±¾µØ¼ÆËã»úÉϵÄÎļþ½øÐÐÉÏ´«
Ò»µ©Îļþ±»Ñ¡Öв¢ÉÏ´«£¬Ô¶³Ì·þÎñÆ÷¾Í»á½ÓÊÕµ½¸ÃÎļþ£¬²¢½«Æä´æ´¢ÔÚÖ¸¶¨µÄĿ¼ÖÐ
- szÃüÁÓërzÃüÁîÏà·´£¬szÃüÁîÓÃÓÚ½«Îļþ´ÓÔ¶³Ì·þÎñÆ÷·¢Ë͵½±¾µØ¼ÆËã»ú
Óû§¿ÉÒÔÔÚÔ¶³Ì·þÎñÆ÷ÉÏÖ´ÐÐ`sz`ÃüÁ²¢Ö¸¶¨Òª·¢Ë͵ÄÎļþ
È»ºó£¬`sz`ÃüÁî»á½«Îļþ·¢Ë͵½±¾µØ¼ÆËã»ú£¬Óû§¿ÉÒÔÔÚ±¾µØ¼ÆËã»úÉϽÓÊÕ²¢±£´æ¸ÃÎļþ
ÕâЩÎļþ´«ÊäÃüÁîÔÚLinuxϵͳÖзdz£ÊµÓã¬ÌرðÊÇÔÚÐèÒª½øÐÐÔ¶³Ì¹ÜÀíºÍά»¤Ê±
ͨ¹ý`rz`ºÍ`sz`ÃüÁÓû§¿ÉÒÔ·½±ãµØÔÚ±¾µØ¼ÆËã»úºÍÔ¶³Ì·þÎñÆ÷Ö®¼ä´«ÊäÎļþ£¬ÊµÏÖÊý¾ÝµÄ¿ìËÙ¹²ÏíºÍ±¸·Ý
Èý¡¢ÏµÍ³µ×²ãµÄÊý¾Ý´¦Àí»úÖÆ ÔÚLinuxϵͳÖУ¬Êý¾Ý½ÓÊÕ²»½ö½ö·¢ÉúÔÚÍøÂçͨÐźÍÎļþ´«Êä²ãÃæ£¬»¹Éæ¼°µ½ÏµÍ³µ×²ãµÄÊý¾Ý´¦Àí»úÖÆ
LinuxÄں˸ºÔð´¦ÀíÀ´×ÔÓ²¼þÉ豸µÄÊý¾Ý£¬²¢½«Æä´«µÝ¸øÉϲãÓ¦ÓóÌÐò½øÐд¦Àí
1.Öжϴ¦Àí£ºµ±Ó²¼þÉ豸½ÓÊÕµ½Êý¾Ýʱ£¬Ëü»áͨ¹ýÖжÏÐźÅ֪ͨCPU
CPU¸ù¾ÝÖжϱíµ÷ÓÃÏàÓ¦µÄÖжϴ¦Àíº¯Êý£¬¸Ãº¯Êý»áµ÷ÓÃÇý¶¯³ÌÐòÖеĺ¯ÊýÀ´´¦ÀíÊý¾Ý
2.DMA´«Ê䣺ÏÖ´úÓ²¼þÉ豸ͨ³£Ö§³ÖÖ±½ÓÄÚ´æ·ÃÎÊ£¨DMA£©£¬ÕâÒâζ×ÅÊý¾Ý¿ÉÒÔÖ±½Ó´ÓÓ²¼þÉ豸´«Êäµ½Äڴ棬¶øÎÞÐèCPUµÄ¸ÉÔ¤
Õâ´ó´óÌá¸ßÁËÊý¾Ý´«ÊäµÄЧÂÊ
3.ÈíÖжϴ¦Àí£ºÓÉÓÚÓ²Öжϴ¦Àí³ÌÐòÖ´ÐеĹý³ÌÖв»Äܱ»Öжϣ¬Èç¹ûËüÖ´ÐÐʱ¼ä¹ý³¤£¬»áµ¼ÖÂCPUÎÞ·¨ÏìÓ¦ÆäËûÓ²¼þµÄÖжÏ
Òò´Ë£¬LinuxÄÚºËÒýÈëÁËÈíÖжϻúÖÆ£¬½«Ó²Öжϴ¦Àíº¯ÊýÖкÄʱµÄ²¿·ÖÒÆµ½ÈíÖжϴ¦Àíº¯ÊýÖÐÖ´ÐÐ
ÕâÑù¿ÉÒÔ±ÜÃâCPU±»³¤Ê±¼äÕ¼Óã¬Ìá¸ßϵͳµÄÏìÓ¦ÄÜÁ¦
4.ÍøÂçÄ£¿é´¦Àí£ºÔÚLinuxÄÚºËÖУ¬ÍøÂçÄ£¿é¸ºÔð´¦ÀíÀ´×ÔÍøÂçÉ豸µÄÊý¾Ý°ü
Êý¾Ý°ü±»½ÓÊÕºó£¬ÄÚºËÖеÄÍøÂçÄ£¿é»á¶ÔÆä½øÐнâÎöºÍ´¦Àí£¬È»ºó¸ù¾ÝÄ¿µÄµØÖ·½«Æä´«µÝ¸øÏàÓ¦µÄÉϲãÓ¦ÓóÌÐò
5.ÐÒéÕ»´¦Àí£º¶ÔÓÚTCP/IPÐÒéÕ»À´Ëµ£¬Êý¾Ý°ü»á¾¹ý¶à¸ö²ã´ÎµÄ´¦Àí£¬°üÀ¨IP²ã¡¢´«Êä²ãºÍÓ¦Óòã
ÿ¸ö²ã´Î¶¼»á¶ÔÊý¾Ý°ü½øÐнâÎöºÍ´¦Àí£¬ÒÔÈ·±£Êý¾ÝÄܹ»ÕýÈ·µØ±»´«µÝºÍ½ÓÊÕ
ËÄ¡¢LinuxÖеÄÊý¾Ý½ÓÊÕÓÅ»¯ ΪÁËÌá¸ßÊý¾Ý½ÓÊÕµÄЧÂʺͿɿ¿ÐÔ£¬Linuxϵͳ²ÉÓÃÁ˶àÖÖÓÅ»¯»úÖÆ
ÕâЩÓÅ»¯»úÖÆ°üÀ¨£º 1.NAPI£¨New API£©¼¼Êõ£ºNAPI¼¼ÊõÊÇÒ»ÖÖÓÃÓÚÌá¸ßÍøÂçÉ豸½ÓÊÕÊý¾ÝЧÂʵļ¼Êõ
ËüÔÊÐíÇý¶¯³ÌÐòÔÚµ¥¸öÖжÏÖд¦Àí¶à¸öÊý¾Ý°ü£¬´Ó¶ø¼õÉÙÁËÖжϵĴÎÊýºÍCPUµÄÕ¼ÓÃÂÊ
2.RPS£¨Receive Packet Steering£©£ºRPSÊÇÒ»ÖÖÓÃÓÚ½«½ÓÊÕµ½µÄÊý¾Ý°ü·ÖÉ¢µ½¶à¸öCPUºËÐÄÉϽøÐд¦ÀíµÄ¼¼Êõ
Õâ¿ÉÒÔÌá¸ßÊý¾Ý´¦ÀíµÄ²¢ÐÐÐÔºÍЧÂÊ£¬ÌرðÊÇÔÚ¶àºË´¦ÀíÆ÷ÉÏ
3.GRO£¨Generic Receive Offload£©£ºGROÊÇÒ»ÖÖÓÃÓÚ½«¶à¸öСµÄÊý¾Ý°üºÏ²¢³ÉÒ»¸ö´óµÄÊý¾Ý°ü½øÐд¦ÀíµÄ¼¼Êõ
Õâ¿ÉÒÔ¼õÉÙÉϲãÐÒéÕ»µÄ´¦Àí¿ªÏú£¬Ìá¸ßÊý¾Ý´¦ÀíµÄЧÂÊ
4.TCP_TW_REUSEºÍTCP_FASTOPEN£ºÕâЩÓÅ»¯»úÖÆ¿ÉÒÔ¼ÓËÙTCPÁ¬½ÓµÄ½¨Á¢ºÍÊͷŹý³Ì£¬´Ó¶øÌá¸ßÊý¾Ý´«ÊäµÄЧÂÊ
Îå¡¢½áÂÛ ×ÛÉÏËùÊö£¬¡°received¡±ÔÚLinuxϵͳÖаçÑÝ×ÅÖÁ¹ØÖØÒªµÄ½ÇÉ«
ÎÞÂÛÊÇÍøÂçͨÐÅ¡¢Îļþ´«Ê仹ÊÇϵͳµ×²ãµÄÊý¾Ý´¦Àí»úÖÆ£¬¶¼Àë²»¿ªÊý¾Ý½ÓÊÕµÄÖ§³Ö
LinuxÌṩÁ˷ḻµÄÍøÂç±à³Ì½Ó¿ÚºÍÎļþ´«ÊäÃüÁÒÔ¼°¸ßЧµÄµ×²ãÊý¾Ý´¦Àí»úÖÆ£¬ÒÔÈ·±£Êý¾ÝÄܹ»¿ìËÙ¡¢×¼È·µØ±»½ÓÊպʹ¦Àí
ͨ¹ý²»¶ÏÓÅ»¯Êý¾Ý½ÓÊÕ»úÖÆ£¬LinuxϵͳµÃÒÔÔÚ¸÷¸öÁìÓò·¢»Ó³öÉ«µÄÐÔÄÜ£¬³ÉΪ¹ã´óÓû§ºÍ¿ª·¢ÕßµÄÊ×Ñ¡²Ù×÷ϵͳ