±à¼ÍƼö: |
±¾ÎĽ«½ö¼òµ¥½éÉÜ netpoll µÄÉè¼Æ£»Ëæºó£¬ÎÒÃǻ᳢ÊÔÊáÀíÒ»ÏÂÎÒÃÇ»ùÓÚ netpoll Ëù×öµÄһЩʵ¼ù£»×îºó£¬ÎÒÃǽ«·ÖÏíÒ»¸öÎÒÃÇÓöµ½µÄÎÊÌ⣬ÒÔ¼°ÎÒÃǽâ¾öµÄ˼·¡£
À´×ÔÓÚ΢ÐŹ«Öںţº
»ù´¡¼Ü¹¹ÍŶÓ
,ÓÉ»ðÁú¹ûÈí¼þAlice±à¼¡¢ÍƼö¡£ |
|
ǰÑÔ
×Ö½ÚÌø¶¯¿ò¼Ü×éÖ÷Òª¸ºÔð¹«Ë¾ÄÚ RPC ¿ò¼ÜµÄ¿ª·¢Óëά»¤¡£RPC ¿ò¼Ü×÷ΪÑз¢ÌåϵÖÐÖØÒªµÄÒ»»·£¬³ÐÔØÁ˼¸ºõËùÓеķþÎñÁ÷Á¿¡£Ëæ×Ź«Ë¾ÄÚ Go ÓïÑÔʹÓÃÔ½À´Ô½¹ã£¬ÒµÎñ¶Ô¿ò¼ÜµÄÒªÇóÔ½À´Ô½¸ß£¬¶ø Go ÔÉú net ÍøÂç¿âÈ´ÎÞ·¨Ìṩ×ã¹»µÄÐÔÄܺͿØÖÆÁ¦£¬ÈçÎÞ·¨¸ÐÖªÁ¬½Ó״̬¡¢Á¬½ÓÊýÁ¿¶àµ¼ÖÂÀûÓÃÂʵ͡¢ÎÞ·¨¿ØÖÆÐ³ÌÊýÁ¿µÈ¡£ÎªÁËÄܹ»»ñÈ¡¶ÔÓÚÍøÂç²ãµÄÍêÈ«¿ØÖÆÈ¨£¬Í¬Ê±ÏÈÓÚÒµÎñ×öһЩ̽Ë÷²¢×îÖÕ¸³ÄÜÒµÎñ£¬¿ò¼Ü×éÍÆ³öÁËȫеĻùÓÚ epoll µÄ×ÔÑÐÍøÂç¿â ¡ª¡ª netpoll£¬²¢»ùÓÚÆäÖ®ÉÏ¿ª·¢ÁË×Ö½ÚÄÚÐÂÒ»´ú Golang ¿ò¼Ü KiteX¡£
ÐÂÐÍÍøÂç¿âÉè¼Æ
Reactor - ʼþ¼àÌýºÍµ÷¶ÈºËÐÄ
netpoll ºËÐÄÊÇ Reactor ʼþ¼àÌýµ÷¶ÈÆ÷£¬Ö÷Òª¹¦ÄÜΪʹÓà epoll ¼àÌýÁ¬½ÓµÄÎļþÃèÊö·û£¨fd£©£¬Í¨¹ý»Øµ÷»úÖÆ´¥·¢Á¬½ÓÉ쵀 ¶Á¡¢Ð´¡¢¹Ø±Õ ÈýÖÖʼþ¡£

Server - Ö÷´Ó Reactor ʵÏÖ
netpoll ½« Reactor ÒÔ 1:N µÄÐÎʽ×éºÏ³ÉÖ÷´Óģʽ¡£
- MainReactor Ö÷Òª¹ÜÀí Listener£¬¸ºÔð¼àÌý¶Ë¿Ú£¬½¨Á¢ÐÂÁ¬½Ó£»
- SubReactor ¸ºÔð¹ÜÀí Connection£¬¼àÌý·ÖÅäµ½µÄËùÓÐÁ¬½Ó£¬²¢½«ËùÓд¥·¢µÄʼþÌá½»µ½Ð³Ì³ØÀï½øÐд¦Àí¡£
- netpoll ÔÚ I/O Task ÖÐÒýÈëÁËÖ÷¶¯µÄÄÚ´æ¹ÜÀí£¬ÏòÉϲãÌṩ NoCopy µÄµ÷Óýӿڣ¬ÓÉ´ËÖ§³Ö NoCopy RPC¡£
- ʹÓÃг̳ؼ¯Öд¦Àí I/O Task£¬¼õÉÙ goroutine ÊýÁ¿ºÍµ÷¶È¿ªÏú¡£

Client - ¹²Ïí Reactor ÄÜÁ¦
client ¶ËºÍ server ¶Ë¹²Ïí SubReactor£¬netpoll ͬÑùʵÏÖÁË dialer£¬Ìṩ´´½¨Á¬½ÓµÄÄÜÁ¦¡£client ¶ËʹÓÃÉÏºÍ net.Conn ÏàËÆ£¬netpoll ÌṩÁË write -> wait read callback µÄµ×²ãÖ§³Ö¡£

Nocopy Buffer
ΪʲôÐèÒª Nocopy Buffer ?
ÔÚÉÏÊöÌá¼°µÄ Reactor ºÍ I/O Task Éè¼ÆÖУ¬epoll µÄ´¥·¢·½Ê½»áÓ°Ïì I/O ºÍ buffer µÄÉè¼Æ£¬´óÌåÀ´Ëµ·ÖΪÁ½ÖÖ·½Ê½£º
- ²ÉÓÃˮƽ´¥·¢(LT)£¬ÔòÐèҪͬ²½µÄÔÚʼþ´¥·¢ºóÖ÷¶¯Íê³É I/O£¬²¢ÏòÉϲã´úÂëÖ±½ÓÌṩ buffer¡£
- ²ÉÓñßÑØ´¥·¢(ET)£¬¿ÉÑ¡ÔñÖ»¹ÜÀíʼþ֪ͨ(Èç go net Éè¼Æ)£¬ÓÉÉϲã´úÂëÍê³É I/O ²¢¹ÜÀí buffer¡£
Á½ÖÖ·½Ê½¸÷ÓÐÓÅȱ£¬netpoll ²ÉÓÃǰÕß²ßÂÔ£¬Ë®Æ½´¥·¢Ê±Ð§ÐÔ¸üºÃ£¬ÈÝ´íÂʸߣ¬Ö÷¶¯ I/O ¿ÉÒÔ¼¯ÖÐÄÚ´æÊ¹Óú͹ÜÀí£¬Ìṩ nocopy ²Ù×÷²¢¼õÉÙ GC¡£ÊÂʵÉÏһЩÈÈÃÅ¿ªÔ´ÍøÂç¿âÒ²ÊDzÉÓ÷½Ê½Ò»µÄÉè¼Æ£¬Èç easygo¡¢evio¡¢gnet µÈ¡£
µ«Ê¹Óà LT Ò²´øÀ´ÁíÒ»¸öÎÊÌ⣬¼´µ×²ãÖ÷¶¯ I/O ºÍÉϲã´úÂë²¢·¢²Ù×÷ buffer£¬ÒýÈë¶îÍâµÄ²¢·¢¿ªÏú¡£±ÈÈ磺I/O ¶ÁÊý¾Ýд buffer ºÍÉϲã´úÂë¶Á buffer ´æÔÚ²¢·¢¶Áд£¬·´Ö®ÒàÈ»¡£ÎªÁ˱£Ö¤Êý¾ÝÕýÈ·ÐÔ£¬Í¬Ê±²»ÒýÈëËø¾ºÕù£¬ÏÖÓеĿªÔ´ÍøÂç¿âͨ³£²ÉÈ¡ ͬ²½´¦Àí buffer(easygo, evio) »òÕß½« buffer ÔÙ copy Ò»·ÝÌṩ¸øÉϲã´úÂë(gnet) µÈ·½Ê½£¬¾ù²»ÊʺÏÒµÎñ´¦Àí»ò´æÔÚ copy ¿ªÏú¡£
ÁíÒ»·½Ã棬³£¼ûµÄ bytes¡¢bufio¡¢ringbuffer µÈ buffer ¿â£¬¾ù´æÔÚ growth ÐèÒª copy ÔÊý×éÊý¾Ý£¬ÒÔ¼°Ö»ÄÜÀ©ÈÝÎÞ·¨ËõÈÝ£¬Õ¼ÓôóÁ¿ÄÚ´æµÈÎÊÌâ¡£Òò´ËÎÒÃÇÏ£ÍûÒýÈëÒ»ÖÖÐ嵀 Buffer ÐÎʽ£¬Ò»¾Ù½â¾öÉÏÊöÁ½·½ÃæµÄÎÊÌâ¡£
Nocopy Buffer Éè¼ÆºÍÓÅÊÆ
Nocopy Buffer »ùÓÚÁ´±íÊý×éʵÏÖ£¬ÈçÏÂͼËùʾ£¬ÎÒÃǽ« []byte Êý×é³éÏóΪ block£¬²¢ÒÔÁ´±íÆ´½ÓµÄÐÎʽ½« block ×éºÏΪ Nocopy Buffer£¬Í¬Ê±ÒýÈëÁËÒýÓüÆÊý¡¢nocopy API ºÍ¶ÔÏ󳨡£

Nocopy Buffer Ïà±È³£¼ûµÄ bytes¡¢bufio¡¢ringbuffer µÈÓÐÒÔÏÂÓÅÊÆ£º
- ¶Áд²¢ÐÐÎÞËø£¬Ö§³Ö nocopy µØÁ÷ʽ¶Áд
- ¶Áд·Ö±ð²Ù×÷ͷβָÕ룬Ï໥²»¸ÉÈÅ¡£
- ¸ßЧÀ©ËõÈÝ
- À©Èݽ׶Σ¬Ö±½ÓÔÚβָÕëºóÌí¼ÓÐ嵀 block ¼´¿É£¬ÎÞÐè copy ÔÊý×é¡£
- ËõÈݽ׶Σ¬Í·Ö¸Õë»áÖ±½ÓÊÍ·ÅʹÓÃÍê±ÏµÄ block ½Úµã£¬Íê³ÉËõÈÝ¡£Ã¿¸ö block ¶¼ÓжÀÁ¢µÄÒýÓüÆÊý£¬µ±ÊÍ·ÅµÄ block ²»ÔÙÓÐÒýÓÃʱ£¬Ö÷¶¯»ØÊÕ block ½Úµã¡£
- Áé»îÇÐÆ¬ºÍÆ´½Ó buffer (Á´±íÌØÐÔ)
- Ö§³ÖÈÎÒâ¶ÁÈ¡·Ö¶Î(nocopy)£¬Éϲã´úÂë¿ÉÒÔ nocopy µØ²¢Ðд¦ÀíÊý¾ÝÁ÷·Ö¶Î£¬ÎÞÐè¹ØÐÄÉúÃüÖÜÆÚ£¬Í¨¹ýÒýÓüÆÊý GC¡£
- Ö§³ÖÈÎÒâÆ´½Ó(nocopy)£¬Ð´ buffer Ö§³Öͨ¹ý block Æ´½Óµ½Î²Ö¸ÕëºóµÄÐÎʽ£¬ÎÞÐè copy£¬±£Ö¤Êý¾Ýֻдһ´Î¡£
- Nocopy Buffer ³Ø»¯£¬¼õÉÙ GC
- ½«Ã¿¸ö []byte Êý×éÊÓΪ block ½Úµã£¬¹¹½¨¶ÔÏó³ØÎ¬»¤¿ÕÏÐ block£¬Óɴ˸´Óà block£¬¼õÉÙÄÚ´æÕ¼ÓÃºÍ GC¡£
»ùÓڸà Nocopy Buffer£¬ÎÒÃÇʵÏÖÁË Nocopy Thrift£¬Ê¹µÃ±à½âÂë¹ý³ÌÄÚ´æÁã·ÖÅäÁ㿽±´¡£
Á¬½Ó¶à·¸´ÓÃ
RPC µ÷ÓÃͨ³£²ÉÓöÌÁ¬½Ó»òÕß³¤Á¬½Ó³ØµÄÐÎʽ£¬Ò»´Îµ÷Óðó¶¨Ò»¸öÁ¬½Ó£¬ÄÇôµ±ÉÏÏÂÓιæÄ£ºÜ´óµÄÇé¿öÏ£¬ÍøÂçÖдæÔÚµÄÁ¬½ÓÊýÒÔ MxN µÄËÙ¶ÈÀ©ÕÅ£¬´øÀ´¾Þ´óµÄµ÷¶ÈѹÁ¦ºÍ¼ÆË㿪Ïú£¬¸ø·þÎñÖÎÀíÔì³ÉÀ§ÄÑ¡£Òò´Ë£¬ÎÒÃÇÏ£ÍûÒýÈëÒ»ÖÖ "ÔÚµ¥Ò»³¤Á¬½ÓÉϲ¢Ðд¦Àíµ÷ÓÃ" µÄÐÎʽ£¬À´¼õÉÙÍøÂçÖеÄÁ¬½ÓÊý£¬ÕâÖÖ·½°¸¼´³ÆÎª "Á¬½Ó¶à·¸´ÓÃ"¡£
µ±Ç°Òµ½çÒ²´æÔÚһЩ¿ªÔ´µÄÁ¬½Ó¶à·¸´Ó÷½°¸£¬³¸ÖâÓÚ´úÂë²ãÃæµÄÊø¸¿£¬ÕâЩ·½°¸¾ùÐèÒª copy buffer À´ÊµÏÖÊý¾Ý·Ö°üºÍºÏ²¢£¬µ¼ÖÂʵ¼ÊÐÔÄܲ¢²»ÀíÏë¡£¶øÉÏÊö Nocopy Buffer »ùÓÚÆäÁé»îÇÐÆ¬ºÍÆ´½ÓµÄÌØÐÔ£¬ºÜºÃµÄÖ§³ÖÁË nocopy µÄÊý¾Ý·Ö°üºÍºÏ²¢£¬Ê¹µÃʵÏÖ¸ßÐÔÄÜÁ¬½Ó¶à·¸´Ó÷½°¸³ÉΪ¿ÉÄÜ¡£
»ùÓÚ netpoll µÄÁ¬½Ó¶à·¸´ÓÃÉè¼ÆÈçÏÂͼËùʾ£¬ÎÒÃǽ« Nocopy Buffer(¼°Æä·ÖƬ) ³éÏóΪÐéÄâÁ¬½Ó£¬Ê¹µÃÉϲã´úÂë±£³Öͬ net.Conn ÏàͬµÄµ÷ÓÃÌåÑé¡£Óë´Ëͬʱ£¬Ôڵײã´úÂëÉÏͨ¹ýÐÒé·Ö°ü½«ÕæÊµÁ¬½ÓÉϵÄÊý¾ÝÁé»îµÄ·ÖÅäµ½ÐéÄâÁ¬½ÓÉÏ£»»òͨ¹ýÐÒé±àÂëºÏ²¢·¢ËÍÐéÄâÁ¬½ÓÊý¾Ý¡£

Á¬½Ó¶à·¸´Ó÷½°¸°üº¬ÒÔϺËÐÄÒªËØ£º
ÐéÄâÁ¬½Ó
- ʵÖÊÉÏÊÇ Nocopy Buffer£¬Ä¿µÄÊÇÌæ»»ÕæÕýµÄÁ¬½Ó£¬¹æ±ÜÄÚ´æ copy¡£
- ÉϲãµÄÒµÎñÂß¼/±à½âÂë ¾ùÔÚÐéÄâÁ¬½ÓÉÏÍê³É£¬ÉϲãÂß¼¿ÉÒÔÒì²½¶ÀÁ¢²¢ÐÐÖ´ÐС£
Shared map
- ÒýÈë·ÖÆ¬ËøÀ´¼õÉÙËøÁ¦¶È¡£
- ÔÚµ÷ÓöËʹÓà sequence id À´±ê¼ÇÇëÇ󣬲¢Ê¹ÓÃ·ÖÆ¬Ëø´æ´¢ id ¶ÔÓ¦µÄ»Øµ÷¡£
- ÔÚ½ÓÊÕÏìÓ¦Êý¾Ýºó£¬¸ù¾Ý sequence id À´ÕÒµ½¶ÔÓ¦»Øµ÷²¢Ö´ÐС£
ÐÒé·Ö°üºÍ±àÂë
- ÈçºÎʶ±ðÍêÕûµÄÇëÇóÏìÓ¦Êý¾Ý°üÊÇÁ¬½Ó¶à·¸´Ó÷½°¸¿ÉÐеĹؼü£¬Òò´ËÐèÒªÒýÈëÐÒé¡£
- ÕâÀï²ÉÓà thrift header protocol ÐÒ飬ͨ¹ýÏûϢͷÅжÏÊý¾Ý°üÍêÕûÐÔ£¬Í¨¹ý sequence id ±ê¼ÇÇëÇóºÍÏìÓ¦µÄ¶ÔÓ¦¹ØÏµ¡£
ZeroCopy
ÕâÀïËù˵µÄ ZeroCopy£¬Ö¸µÄÊÇ Linux ËùÌṩµÄ ZeroCopy µÄÄÜÁ¦¡£ÉÏÒ»ÕÂÖÐÎÒÃÇ˵ÁËÒµÎñ²ãµÄÁ㿽±´£¬¶øÖÚËùÖÜÖª£¬µ±ÎÒÃǵ÷Óà sendmsg ϵͳµ÷Ó÷¢°üµÄʱºò£¬Êµ¼ÊÉÏÈÔÈ»ÊÇ»á²úÉúÒ»´ÎÊý¾ÝµÄ¿½±´µÄ£¬²¢ÇÒÔÚ´ó°ü³¡¾°ÏÂÕâ¸ö¿½±´µÄÏûºÄ·Ç³£Ã÷ÏÔ¡£ÒÔ 100M ΪÀý£¬perf ¿ÉÒÔ¿´µ½ÈçϽá¹û£º

Õ⻹½ö½öÊÇÆÕͨ tcp ·¢°üµÄÕ¼Óã¬ÔÚÎÒÃǵij¡¾°Ï£¬´ó²¿·Ö·þÎñ¶¼»á½ÓÈë Service Mesh£¬ËùÒÔÔÚÒ»´Î·¢°üÖУ¬Ò»¹²»áÓÐ 3 ´Î¿½±´£ºÒµÎñ½ø³Ìµ½Äںˡ¢Äں˵½ sidecar¡¢sidecar ÔÙµ½Äںˡ£ÕâʹµÃÓдó°üÐèÇóµÄÒµÎñ£¬¿½±´Ëùµ¼Ö嵀 cpu Õ¼ÓûáÌØ±ðÃ÷ÏÔ£¬ÈçÏÂͼ£º

ΪÁ˽â¾öÕâ¸öÎÊÌ⣬ÎÒÃÇÑ¡ÔñÁËʹÓà Linux ÌṩµÄ ZeroCopy API£¨ÔÚ 4.14 ÒÔºóÖ§³Ö send£»5.4 ÒÔºóÖ§³Ö receive£©¡£µ«ÊÇÕâÒýÈëÁËÒ»¸ö¶îÍâµÄ¹¤³ÌÎÊÌ⣺ZeroCopy send API ºÍÔÏȵ÷Ó÷½Ê½²»¼æÈÝ£¬ÎÞ·¨ºÜºÃµØ¹²´æ¡£ÕâÀï¼òµ¥½éÉÜһϠZeroCopy send µÄ¹¤×÷·½Ê½£ºÒµÎñ½ø³Ìµ÷Óà sendmsg Ö®ºó£¬sendmsg »á¼Ç¼Ï iovec µÄµØÖ·²¢Á¢¼´·µ»Ø£¬ÕâʱºòÒµÎñ½ø³Ì²»ÄÜÊÍ·ÅÕâ¶ÎÄڴ棬ÐèҪͨ¹ý epoll µÈ´ýÄں˻ص÷Ò»¸öÐźűíÃ÷ij¶Î iovec ÒѾ·¢Ëͳɹ¦Ö®ºó²ÅÄÜÊÍ·Å¡£ÓÉÓÚÎÒÃDz¢²»Ï£Íû¸ü¸ÄÒµÎñ·½µÄʹÓ÷½·¨£¬ÐèÒª¶ÔÉϲãÌṩͬ²½ÊÕ·¢µÄ½Ó¿Ú£¬ËùÒÔºÜÄÑ»ùÓÚÏÖÓÐµÄ API ͬʱÌṩ ZeroCopy ºÍ·Ç ZeroCopy µÄ³éÏó£»¶øÓÉÓÚ ZeroCopy ÔÚС°ü³¡¾°ÏÂÊÇÓÐÐÔÄÜËðºÄµÄ£¬ËùÒÔÒ²²»Äܽ«Õâ¸ö×÷ΪĬÈϵÄÑ¡Ïî¡£
ÓÚÊÇ£¬×Ö½ÚÌø¶¯¿ò¼Ü×éºÍ×Ö½ÚÌø¶¯ÄÚºË×éºÏ×÷£¬ÓÉÄÚºË×éÌṩÁËͬ²½µÄ½Ó¿Ú£ºµ±µ÷Óà sendmsg µÄʱºò£¬Äں˻á¼àÌý²¢À¹½ØÄÚºËÔÏȸøÒµÎñµÄ»Øµ÷£¬²¢ÇÒÔڻص÷Íê³Éºó²Å»áÈà sendmsg ·µ»Ø¡£ÕâʹµÃÎÒÃÇÎÞÐè¸ü¸ÄÔÓÐÄ£ÐÍ£¬¿ÉÒԺܷ½±ãµØ½ÓÈë ZeroCopy send¡£Í¬Ê±£¬×Ö½ÚÌø¶¯ÄÚºË×黹ʵÏÖÁË»ùÓÚ unix domain socket µÄ ZeroCopy£¬¿ÉÒÔʹµÃÒµÎñ½ø³ÌÓë Mesh sidecar Ö®¼äµÄͨÐÅÒ²´ïµ½Á㿽±´¡£
ÔÚʹÓÃÁË ZeroCopy send ºó£¬perf ¿ÉÒÔ¿´µ½Äں˲»ÔÙÓÐ copy µÄÕ¼Óãº

´Ó cpu Õ¼ÓÃÊýÖµÉÏ¿´£¬´ó°ü³¡¾°Ï ZeroCopy Äܹ»±È·Ç ZeroCopy ½Úʡһ°ëµÄ cpu¡£
Go µ÷¶Èµ¼ÖµÄÑÓ³ÙÎÊÌâ·ÖÏí
ÔÚÎÒÃÇʵ¼ù¹ý³ÌÖУ¬·¢ÏÖÎÒÃÇÐÂдµÄ netpoll ËäÈ»ÔÚ avg ÑÓ³ÙÉϱíÏÖʤÓÚ Go ÔÉúµÄ net ¿â£¬µ«ÊÇÔÚ p99 ºÍ max ÑÓ³ÙÉÏÒªÆÕ±éÂÔ¸ßÓÚ Go ÔÉúµÄ net ¿â£¬²¢ÇÒ¼â´ÌÒ²»á¸ü¼ÓÃ÷ÏÔ£¬ÈçÏÂͼ£¨Go 1.13£¬À¶É«Îª netpoll + ¶à·¸´Óã¬ÂÌɫΪ netpoll + ³¤Á¬½Ó£¬»ÆÉ«Îª net ¿â + ³¤Á¬½Ó£©£º

ÎÒÃdz¢ÊÔÁ˺ܶàÖְ취ȥÓÅ»¯£¬µ«ÊÇÊÕЧÉõ΢¡£×îÖÕ£¬ÎÒÃǶ¨Î»³öÕâ¸öÑÓ³Ù²¢·ÇÊÇÓÉÓÚ netpoll ±¾ÉíµÄ¿ªÏúµ¼Öµģ¬¶øÊÇÓÉÓÚ go µÄµ÷¶Èµ¼Öµģ¬±ÈÈç˵£º
- ÓÉÓÚÔÚ netpoll ÖУ¬SubReactor ±¾ÉíÒ²ÊÇÒ»¸ö goroutine£¬Êܵ÷¶ÈÓ°Ï죬²»Äܱ£Ö¤ EpollWait »Øµ÷Ö®ºóÂíÉÏÖ´ÐУ¬ËùÒÔÕâÒ»¿é»áÓÐÑÓ³Ù£»
- ͬʱ£¬ÓÉÓÚÓÃÀ´´¦Àí I/O ʼþµÄ SubReactor ºÍÓÃÀ´´¦ÀíÁ¬½Ó¼àÌýµÄ MainReactor ±¾ÉíÒ²ÊÇ goroutine£¬ËùÒÔʵ¼ÊÉϺÜÄѱ£Ö¤ÔÚ¶àºËÇé¿ö֮ϣ¬ÕâЩ Reactor Äܲ¢ÐÐÖ´ÐУ»ÉõÖÁÔÚ×¶ËÇé¿ö֮ϣ¬¿ÉÄÜÕâЩ Reactor »á¹ÒÔÚͬһ¸ö P Ï£¬×îÖÕ±ä³ÉÁË´®ÐÐÖ´ÐУ¬ÎÞ·¨³ä·ÖÀûÓöàºËÓÅÊÆ£»
- ÓÉÓÚ EpollWait »Øµ÷Ö®ºó£¬SubReactor ÄÚÊÇ´®Ðд¦Àí I/O ʼþµÄ£¬µ¼ÖÂÅÅÔÚ×îºóµÄʼþ¿ÉÄÜ»áÓг¤Î²ÎÊÌ⣻
- ÔÚÁ¬½Ó¶à·¸´Óó¡¾°Ï£¬ÓÉÓÚÿ¸öÁ¬½Ó°ó¶¨ÁËÒ»¸ö SubReactor£¬¹ÊÑÓ³ÙÍêȫȡ¾öÓÚÕâ¸ö SubReactor µÄµ÷¶È£¬µ¼Ö¼â´Ì»á¸ü¼ÓÃ÷ÏÔ¡£
ÓÉÓÚ Go ÔÚ runtime ÖжÔÓÚ net ¿âÓÐ×öÌØÊâÓÅ»¯£¬ËùÒÔ net ¿â²»»áÓÐÒÔÉÏÇé¿ö£»Í¬Ê± net ¿âÊÇ goroutine-per-connection µÄÄ£ÐÍ£¬ËùÒÔÄÜÈ·±£ÇëÇóÄܲ¢ÐÐÖ´Ðжø²»»áÏ໥ӰÏì¡£
¶ÔÓÚÒÔÉÏÕâ¸öÎÊÌ⣬ÎÒÃÇĿǰ½â¾öµÄ˼·ÓÐÁ½¸ö£º
- ÐÞ¸Ä Go runtime Ô´Â룬ÔÚ Go runtime ÖÐ×¢²áÒ»¸ö»Øµ÷£¬Ã¿´Îµ÷¶Èʱµ÷Óà EpollWait£¬°Ñ»ñÈ¡µ½µÄ fd ´«µÝ¸ø»Øµ÷Ö´ÐУ»
- Óë×Ö½ÚÌø¶¯ÄÚºË×éºÏ×÷£¬Ö§³ÖͬʱÅúÁ¿¶Á/д¶à¸öÁ¬½Ó£¬½â¾ö´®ÐÐÎÊÌâ¡£ÁíÍ⣬¾¹ýÎÒÃǵIJâÊÔ£¬Go 1.14 Äܹ»Ê¹µÃÑÓ³ÙÂÔÓнµµÍͬʱ¸ü¼ÓƽÎÈ£¬µ«ÊÇËùÄÜ´ïµ½µÄ¼«ÏÞ QPS ¸üµÍ¡£Ï£ÍûÎÒÃǵÄ˼·Äܹ»¸øÒµ½çͬÑùÓöµ½´ËÎÊÌâµÄͬѧÌṩһЩ²Î¿¼¡£
ºó¼Ç
Ï£ÍûÒÔÉϵķÖÏíÄܹ»¶ÔÉçÇøÓÐËù°ïÖú¡£Í¬Ê±£¬ÎÒÃÇÒ²ÔÚ¼ÓËÙ½¨Éè netpoll ÒÔ¼°»ùÓÚ netpoll µÄпò¼Ü KiteX¡£»¶Ó¸÷λ¸ÐÐËȤµÄͬѧ¼ÓÈëÎÒÃÇ£¬¹²Í¬½¨Éè Go ÓïÑÔÉú̬£¡
|