ÎÞÂÛÊÇÔÆ¼ÆËã¡¢´óÊý¾Ý·ÖÎö£¬»¹ÊÇʵʱͨÐÅ¡¢ÔÚÏßÓÎÏ·£¬¸ßЧµÄÍøÂç´¦ÀíÄÜÁ¦¶¼ÊDZ£Ö¤·þÎñÖÊÁ¿µÄ¹Ø¼üÒòËØ
ÔÚÕâÒ»±³¾°Ï£¬Linux²Ù×÷ϵͳµÄ½ÓÊÜ»º´æ£¨Receive Buffer£©»úÖÆÏÔµÃÓÈÎªÖØÒª
±¾ÎĽ«ÉîÈë̽ÌÖLinux½ÓÊÜ»º´æµÄ¹¤×÷ÔÀí¡¢ÅäÖÃÓÅ»¯¼°ÆäÔÚÍøÂçÐÔÄÜÓÅ»¯ÖеIJ»¿ÉÌæ´ú×÷ÓÃ
Ò»¡¢Linux½ÓÊÜ»º´æ»ù´¡ LinuxÄÚºËÔÚÍøÂçÊý¾Ý´¦ÀíÖвÉÓÃÁËһϵÁи´ÔӵĻúÖÆºÍËã·¨£¬ÒÔÈ·±£Êý¾Ý°üÄܹ»¸ßЧ¡¢ÓÐÐòµØ´«Êä
ÆäÖУ¬½ÓÊÜ»º´æÊÇÊý¾Ý°ü´ÓÍøÂç½Ó¿Ú¿¨£¨NIC£©´«Êäµ½Óû§¿Õ¼äÓ¦ÓóÌÐòÖ®¼äµÄÒ»¸öÖØÒª»º³åÇø
ËüÖ÷Òª¸ºÔðÔÝ´æ´ÓÍøÂç½ÓÊÕµ½µÄÊý¾Ý£¬µÈ´ýÉϲãÐÒéÕ»»òÓ¦ÓóÌÐò´¦Àí
Linux½ÓÊÜ»º´æµÄÉè¼Æ³ä·Ö¿¼ÂÇÁËÐÔÄÜÓë×ÊÔ´ÀûÓÃÂÊµÄÆ½ºâ
Ò»·½Ã棬½Ï´óµÄ»º´æ¿ÉÒÔ¼õÉÙÊý¾Ý°ü¶ªÊ§ºÍÖØ´«µÄ¸ÅÂÊ£¬Ìá¸ßÍøÂçÍÌÍÂÁ¿£»ÁíÒ»·½Ã棬¹ý´óµÄ»º´æÔò¿ÉÄܵ¼ÖÂÄÚ´æ×ÊÔ´µÄÀË·Ñ£¬ÉõÖÁÒý·¢ÄÚ´æ·ÖÅäʧ°Ü£¬½ø¶øÓ°ÏìϵͳÎȶ¨ÐÔ
Linux½ÓÊÜ»º´æÍ¨³£·ÖΪÁ½¸ö²ã´Î£º»·Ðλº³åÇø£¨Ring Buffer£©ºÍÌ×½Ó×Ö»º³åÇø£¨Socket Buffer£©
»·Ðλº³åÇøÎ»ÓÚÄں˿ռ䣬ֱ½ÓÓëNIC½»»¥£¬ÓÃÓÚ¿ìËÙÔÝ´æµ½´ïµÄÊý¾Ý°ü
¶øÌ×½Ó×Ö»º³åÇøÔòλÓÚÓû§¿Õ¼ä»òÄں˿ռäµÄÌØ¶¨ÇøÓò£¬ÓÃÓÚ´æ´¢ÒѰ´ÐÒéÕ»´¦ÀíÍê±Ï¡¢×¼±¸½»¸¶¸øÓ¦ÓóÌÐòµÄÊý¾Ý
¶þ¡¢½ÓÊÜ»º´æµÄ¹¤×÷ÔÀí Linux½ÓÊÜ»º´æµÄ¹¤×÷Á÷³Ì´óÖ¿ÉÒÔ·ÖΪÒÔϼ¸¸ö²½Ö裺 1.Êý¾Ý°ü½ÓÊÕ£ºµ±NIC½ÓÊÕµ½Ò»¸öÊý¾Ý°üʱ£¬ËüÊ×ÏȽ«Êý¾Ý°üдÈëµ½»·Ðλº³åÇøÖÐ
ÕâÒ»²½ÖèÊÇÓ²¼þ¼¶±ðµÄ²Ù×÷£¬Ëٶȷdz£¿ì
2.Öжϴ¦Àí£ºµ±»·Ðλº³åÇøÖеÄÊý¾ÝÁ¿´ïµ½Ò»¶¨ãÐֵʱ£¬NIC»á´¥·¢Ò»¸öÖжϣ¬Í¨ÖªCPUÓÐеÄÊý¾Ý°üµ½´ï
CPUËæºóµ÷¶ÈÖжϴ¦Àí³ÌÐòÀ´´¦ÀíÕâЩÊý¾Ý°ü
3.ÐÒéÕ»´¦Àí£ºÖжϴ¦Àí³ÌÐò´Ó»·Ðλº³åÇøÖжÁÈ¡Êý¾Ý°ü£¬²¢Í¨¹ýÍøÂçÐÒéÕ»½øÐÐÖð²ã´¦Àí
´¦Àí¹ý³ÌÖУ¬Êý¾Ý°ü¿ÉÄܱ»²ð·Ö¡¢ÖØ×顢УÑéµÈ
4.Êý¾Ý½»¸¶£º´¦ÀíÍê±Ïºó£¬Êý¾Ý°ü±»·ÅÈëÌ×½Ó×Ö»º³åÇøÖУ¬µÈ´ýÓ¦ÓóÌÐò¶ÁÈ¡
ÕâÀïÉæ¼°µ½´ÓÄں˿ռ䵽Óû§¿Õ¼äµÄÊý¾Ý¿½±´¹ý³Ì
5.»º´æ¹ÜÀí£ºLinuxÄں˻á¸ù¾Ýµ±Ç°µÄÍøÂç¸ºÔØºÍϵͳ×ÊÔ´Çé¿ö£¬¶¯Ì¬µ÷Õû½ÓÊÜ»º´æµÄ´óСºÍ·ÖÅä²ßÂÔ£¬ÒÔÓÅ»¯ÐÔÄÜ
Èý¡¢½ÓÊÜ»º´æµÄÅäÖÃÓëÓÅ»¯ LinuxÌṩÁ˶àÖÖ¹¤¾ßºÍ²ÎÊý£¬ÔÊÐíϵͳ¹ÜÀíÔ±¶Ô½ÓÊÜ»º´æ½øÐÐϸÖµÄÅäÖúÍÓÅ»¯
ÒÔÏÂÊÇһЩ¹Ø¼üµÄÅäÖõãºÍÓÅ»¯²ßÂÔ£º 1.µ÷Õû»·Ðλº³åÇø´óС£ºethtoolºÍifconfigµÈ¹¤¾ß¿ÉÒÔÓÃÀ´²é¿´ºÍÉèÖÃNICµÄ»·Ðλº³åÇø´óС
½Ï´óµÄ»·Ðλº³åÇø¿ÉÒÔ¼õÉÙÒò»º³åÇøÒç³öµ¼ÖµĶª°ü£¬µ«Ò²»áÔö¼ÓÑÓ³ÙºÍÄÚ´æÕ¼ÓÃ
Òò´Ë£¬Ó¦¸ù¾Ý¾ßÌåÓ¦Óó¡¾°ºÍÍøÂç¸ºÔØÇé¿ö½øÐе÷Õû
2.ÓÅ»¯Ì×½Ó×Ö»º³åÇø£ºÍ¨¹ýµ÷Õû`net.core.rmem_default`¡¢`net.core.rmem_max`ºÍ`net.core.rmem_min`µÈϵͳ²ÎÊý£¬¿ÉÒÔ¿ØÖÆÌ×½Ó×Ö»º³åÇøµÄĬÈÏ´óС¡¢×î´ó´óСºÍ×îС´óС
ÕâЩ²ÎÊýµÄÉèÖÃÖ±½ÓÓ°Ïìµ½Ó¦ÓóÌÐò½ÓÊÕÊý¾ÝµÄËٶȺÍЧÂÊ
3.ÆôÓÃNAPI£¨Native Polling Interface£©£ºNAPIÊÇÒ»ÖָĽøµÄÖжϴ¦Àí»úÖÆ£¬ËüÔÊÐíNICÔÚÊý¾Ýµ½´ïʱÒÔÂÖѯµÄ·½Ê½¶ø²»ÊÇÖжϵķ½Ê½Í¨ÖªCPU
Õâ¿ÉÒÔ¼õÉÙÖжϿªÏú£¬Ìá¸ßÊý¾Ý°ü´¦ÀíµÄÍÌÍÂÁ¿
¶ÔÓڸ߸ºÔØÍøÂç»·¾³£¬ÆôÓÃNAPI¿ÉÒÔÏÔÖøÌáÉýÐÔÄÜ
4.TCP_RCVBUFºÍTCP_SNDBUF£º¶ÔÓÚTCPÁ¬½Ó£¬¿ÉÒÔʹÓÃ`setsockopt`º¯ÊýÉèÖýÓÊÕ»º³åÇø£¨TCP_RCVBUF£©ºÍ·¢ËÍ»º³åÇø£¨TCP_SNDBUF£©µÄ´óС
ÕâЩÉèÖÿÉÒÔÕë¶ÔÌØ¶¨µÄÌ×½Ó×Ö½øÐÐÓÅ»¯£¬ÒÔÊÊÓ¦²»Í¬µÄÊý¾Ý´«ÊäÐèÇó
5.Á÷Á¿¿ØÖÆ£ºÍ¨¹ýµ÷ÕûTCPµÄ´°¿Ú´óС£¨`net.ipv4.tcp_window_scaling`£©¡¢×Ô¶¯µ÷Õû½ÓÊÕ»º³åÇø£¨`net.ipv4.tcp_rmem`£©ºÍ·¢ËÍ»º³åÇø£¨`net.ipv4.tcp_wmem`£©µÄ²ÎÊý£¬¿ÉÒÔʵÏÖ¸ü¾«Ï¸µÄÁ÷Á¿¿ØÖÆ£¬±ÜÃâÍøÂçÓµÈûºÍÊý¾Ý°ü¶ªÊ§
ËÄ¡¢½ÓÊÜ»º´æÓÅ»¯Êµ¼ù ÔÚʵ¼ÊÓ¦ÓÃÖУ¬½ÓÊÜ»º´æµÄÓÅ»¯ÍùÍùÐèÒª½áºÏ¾ßÌåµÄÒµÎñ³¡¾°ºÍÍøÂç»·¾³½øÐÐ
ÒÔÏÂÊÇÒ»¸ö¼òµ¥µÄÓÅ»¯Êµ¼ù°¸Àý£º ijÔÚÏßÊÓÆµÖ±²¥Æ½Ì¨Ôڸ߷åÆÚ¾³£³öÏÖÊÓÆµ¿¨¶ÙºÍÑÓ³ÙÏÖÏó
¾¹ý·ÖÎö£¬·¢ÏÖÊÇÓÉÓÚ·þÎñÆ÷½ÓÊÜ»º´æÅäÖò»µ±µ¼ÖµÄ
¾ßÌå±íÏÖΪ£º»·Ðλº³åÇø¹ýС£¬µ¼ÖÂÊý¾Ý°üƵ·±Òç³ö£»Ì×½Ó×Ö»º³åÇøÉèÖò»ºÏÀí£¬Ê¹µÃÓ¦ÓóÌÐòÔÚ´¦Àí¸ß²¢·¢ÇëÇóʱÐÔÄÜÊÜÏÞ
Õë¶ÔÕâЩÎÊÌ⣬²ÉÈ¡ÁËÒÔÏÂÓÅ»¯´ëÊ©£º - ʹÓÃ`ethtool`½«NICµÄ»·Ðλº³åÇø´óСÔö¼Óµ½ºÏÀí·¶Î§£¬ÒÔ¼õÉÙ¶ª°üÂÊ
- µ÷Õû`net.core.rmem_max`ºÍ`net.core.wmem_max`²ÎÊý£¬Ôö¼Óϵͳȫ¾ÖµÄÌ×½Ó×Ö»º³åÇø´óС
- ¶Ô¹Ø¼ü·þÎñµÄÓ¦ÓóÌÐò£¬Ê¹ÓÃ`setsockopt`º¯ÊýÉèÖøü´óµÄTCP½ÓÊպͷ¢ËÍ»º³åÇø
- ÆôÓÃNAPI»úÖÆ£¬¼õÉÙÖжϿªÏú£¬Ìá¸ßÊý¾Ý°ü´¦ÀíЧÂÊ
¾¹ýÉÏÊöÓÅ»¯£¬¸Ãƽ̨µÄÊÓÆµ¿¨¶ÙºÍÑÓ³ÙÏÖÏóµÃµ½ÁËÏÔÖø¸ÄÉÆ£¬Óû§ÂúÒâ¶È´ó·ùÌáÉý
Îå¡¢½áÂÛ Linux½ÓÊÜ»º´æ×÷ÎªÍøÂçÊý¾Ý´¦ÀíÖеĹؼü»·½Ú£¬ÆäÐÔÄÜÖ±½Ó¹ØÏµµ½Õû¸öϵͳµÄÍøÂçÍÌÍÂÁ¿ºÍÏìӦʱ¼ä
ͨ¹ýºÏÀíÅäÖúÍÓÅ»¯½ÓÊÜ»º´æ£¬¿ÉÒÔÏÔÖøÌáÉýÍøÂçÐÔÄÜ£¬Âú×ã¸÷Öָ߲¢·¢¡¢µÍÑÓ³ÙµÄÓ¦ÓÃÐèÇó
È»¶ø£¬ÓÅ»¯¹¤×÷²¢·ÇÒ»õí¶ø¾Í£¬ÐèÒª½áºÏ¾ßÌåµÄÓ¦Óó¡¾°ºÍÍøÂç»·¾³½øÐгÖÐøµ÷ÕûºÍÓÅ»¯
Ö»ÓÐÕâÑù£¬²ÅÄÜÈ·±£LinuxϵͳÔÚÍøÂçÐÔÄÜ·½ÃæµÄ׿Խ±íÏÖ