Ê×Ò³
ѧϰ
»î¶¯
רÇø
¹¤¾ß
TVP
·¢²¼
¾«Ñ¡ÄÚÈÝ/¼¼ÊõÉçȺ/ÓŻݲúÆ·,¾¡ÔÚС³ÌÐò
Á¢¼´Ç°Íù

GoÓïÑÔ³öÏÖºó£¬Java»¹ÊǺÃÑ¡ÔñÂð£¿

Ëæ×Å´óÁ¿ÐÂÉúµÄÒì²½¿ò¼ÜºÍÖ§³ÖЭ³ÌµÄÓïÑÔ(ÈçGo)µÄ³öÏÖ£¬Ôںܶೡ¾°Ï²Ù×÷ϵͳµÄÏ̵߳÷¶È³ÉΪÁËÐÔÄܵÄÆ¿¾±£¬JavaÒ²Òò´Ë±»ÖÊÒÉÊÇ·ñ²»ÔÙÊÊÓ¦×îеÄÔƳ¡¾°ÁË¡£4ÄêÇ°£¬°¢ÀïJVMÍŶӿªÊ¼×ÔÑÐWisp2£¬½«GoÓïÑÔµÄЭ³ÌÄÜÁ¦´øÈëµ½JavaÊÀ½ç¡£¼ÈÏíÊÜJavaµÄ·á¸»Éú̬£¬ÓÖ»ñµÃÒì²½³ÌÐòµÄÐÔÄÜ£¬Wisp2ÈÃJavaƽ̨Àú¾ÃÃÖС£

Javaƽ̨һֱÒÔÉú̬µÄ·±ÈÙÖø³Æ£¬´óÁ¿µÄÀà¿â¡¢¿ò¼Ü°ïÖú¿ª·¢ÕßÃÇ¿ìËٴӦÓ᣶øÆäÖд󲿷ÖJava¿ò¼ÜÀà¿â¶¼ÊÇ»ùÓÚÏ̳߳ØÒÔ¼°×èÈû»úÖÆÀ´·þÎñ²¢·¢µÄ£¬Ö÷ÒªÔ­Òò°üÀ¨£º

1. JavaÓïÑÔÔÚºËÐÄÀà¿âÖÐÌṩÁËÇ¿´óµÄ²¢·¢ÄÜÁ¦£¬¶àÏß³ÌÓ¦ÓÿÉÒÔ»ñµÃ²»Ë×µÄÐÔÄÜ£»

2. Java EEµÄһЩ±ê×¼¶¼ÊÇÏ̼߳¶×èÈûµÄ(±ÈÈçJDBC)£»

3. »ùÓÚ×èÈûģʽ¿ÉÒÔ¿ìËٵؿª·¢Ó¦Óá£

µ«Èç½ñ£¬´óÁ¿ÐÂÉúµÄÒì²½¿ò¼ÜºÍÖ§³ÖЭ³ÌµÄÓïÑÔ(ÈçGo)µÄ³öÏÖ£¬Ôںܶೡ¾°Ï²Ù×÷ϵͳµÄÏ̵߳÷¶È³ÉΪÁËÐÔÄܵÄÆ¿¾±¡£JavaÒ²Òò´Ë±»ÖÊÒÉÊÇ·ñ²»ÔÙÊÊÓ¦×îеÄÔƳ¡¾°ÁË¡£

4ÄêÇ°£¬°¢À↑ʼ×ÔÑÐWisp2¡£ËüÖ÷ÒªÊÇÓÃÔÚIOÃܼ¯µÄ·þÎñÆ÷³¡¾°£¬´ó²¿·Ö¹«Ë¾µÄÔÚÏß·þÎñ¶¼ÊÇÕâÑùµÄ³¡¾° ?(ÀëÏßÓ¦Óö¼ÊÇÆ«ÏòÓÚ¼ÆË㣬Ôò²»ÊÊÓÃ)¡£ËüÔÚ¹¦ÄÜÊôÐÔÉ϶ԱêGoroutineµÄJavaЭ³Ì£¬ÔÚ²úÆ·ÐÎ̬¡¢ÐÔÄÜ¡¢Îȶ¨ÐÔÉ϶¼´ïµ½ÁËÒ»¸ö±È½ÏÀíÏëµÄÇé¿ö¡£µ½ÏÖÔÚ£¬ÒѾ­ÓÐÉÏ°Ù¸öÓ¦Óã¬ÊýÍò¸öÈÝÆ÷ÉÏÏßÁËWisp1/2¡£WispЭ³ÌÍêÈ«¼æÈݶàÏß³Ì×èÈûµÄ´úÂëд·¨£¬½öÐèÔö¼ÓJVM²ÎÊýÀ´¿ªÆôЭ³Ì£¬°¢Àï°Í°ÍµÄºËÐĵçÉÌÓ¦ÓÃÒѾ­ÔÚЭ³ÌÄ£ÐÍÉϾ­¹ýÁ½¸ö˫ʮһµÄ¿¼Ñ飬¼ÈÏíÊܵ½ÁËJavaµÄ·á¸»Éú̬£¬ÓÖ»ñµÃÁËÒì²½³ÌÐòµÄÐÔÄÜ¡£

Wisp2Ö÷´òµÄÊÇÐÔÄܺͶÔÏÖÓдúÂëµÄ¼æÈÝÐÔ£¬¼ò¶øÑÔÖ®£¬ÏÖÓеĻùÓÚ¶àÏ̵߳ÄIOÃܼ¯µÄJavaÓ¦ÓÃÖ»ÐèÒª¼ÓÉÏWisp2µÄJVM²ÎÊý¾Í¿ÉÒÔ»ñµÃÒì²½µÄÐÔÄÜÌáÉý¡£

×÷ΪÀý×Ó£¬ÒÔÏÂÊÇÏûÏ¢Öмä¼þ´úÀí(¼ò³Æmq)ºÍdrdsÖ»Ìí¼Ó²ÎÊý²»¸Ä´úÂëµÄѹ²â±È½Ï£º

¿ÉÒÔ¿´µ½ÉÏÏÂÎÄÇл»ÒÔ¼°sys CPUÏÔÖø½µµÍ£¬RT¼õÉÙ¡¢QPS·Ö±ðÌáÉý11.45%£¬18.13%¡£

Quick Start

ÓÉÓÚWisp2ÍêÈ«¼æÈÝÏÖÓеÄJava´úÂ룬Òò´ËʹÓÃÆðÀ´Ê®·Ö¼òµ¥£¬Óжà¼òµ¥£¿

Èç¹ûÄãµÄÓ¦ÓÃÊÇ¡°±ê×¼¡±µÄÔÚÏßÓ¦ÓÃ(ʹÓÃ/home/admin/$APP_NAME/setenv.shÅäÖòÎÊý)£¬ÄÇôÔÚadminÓû§ÏÂÊäÈëÈçÏÂÃüÁî¾Í¿ÉÒÔ¿ªÆôWisp2ÁË£º

curl https://gosling.alibaba-inc.com/sh/enable-wisp2.sh | sh

·ñÔòÐèÒªÊÖ¶¯Éý¼¶JDKºÍJava²ÎÊý£º

ajdk 8.7.12_fp2 rpm

sudo yum install ajdk -b current # Ò²¿ÉÒÔͨ¹ýyum°²×°×îÐÂjdk java -XX:+UseWisp2 .... # ʹÓÃWisp²ÎÊýÆô¶¯JavaÓ¦ÓÃ

È»ºó¾Í¿ÉÒÔͨ¹ýjstackÑé֤Э³Ìȷʵ±»¿ªÆôÁË¡£

CarrierÏß³ÌÊǵ÷¶ÈЭ³ÌµÄỊ̈߳¬Ï·½µÄ- Coroutine [...]±íʾһ¸öЭ³Ì£¬active±íʾЭ³Ì±»µ÷¶ÈµÄ´ÎÊý£¬steal±íʾ±»work stealingµÄ´ÎÊý£¬preempt±íʾʱ¼äƬÇÀÕ¼´ÎÊý¡£

ÏÂͼÊÇDRDSÔÚecsÉÏѹ²âʱµÄtop -H£¬¿ÉÒÔ¿´³öÀ´Ó¦ÓõÄÊý°Ù¸öÏ̱߳»8¸öCarrierÏß³ÌÍйܣ¬¾ùÔȵØÅÜÔÚCPUºËÊý¸öÏß³ÌÉÏÃ档Ϸ½Ò»Ð©ÃûΪjavaµÄÏß³ÌÊÇgcÏ̡߳£

¹ý¶àÏ̵߳ĿªÏú

ÎóÇø1: ½øÄÚºËÒý·¢ÉÏÏÂÎÄÇл»

ÎÒÃÇ¿´Ò»¶Î²âÊÔ³ÌÐò£º

´úÂëÓïÑÔ£ºjavascript
¸´ÖÆ
pipe(a);??while?(1)?{????write(a[1],?a,?1);????read(a[0],?a,?1);????n?+=?2;??}??

Ö´ÐÐÕâ¶Î³ÌÐòʱÉÏÏÂÎÄÇл»·Ç³£µÍ£¬Êµ¼ÊÉÏÉÏÃæµÄIOϵͳµ÷Óö¼ÊDz»»á×èÈûµÄ£¬Òò´ËÄں˲»ÐèÒª¹ÒÆðỊ̈߳¬Ò²²»ÐèÒªÇл»ÉÏÏÂÎÄ£¬Êµ¼Ê·¢ÉúµÄÊÇÓû§/ÄÚºË̬µÄģʽÇл»¡£

ÉÏÃæµÄ³ÌÐòÔÚÉñÁú·þÎñÆ÷²âµÃÿ¸öpipe²Ù×÷ºÄʱԼ334ns£¬ËٶȺܿ졣

ÎóÇø2: ÉÏÏÂÎÄÇл»µÄ¿ªÏúºÜ´ó

±¾ÖÊÉÏÀ´ËµÎÞÂÛÊÇÓû§Ì¬»¹ÊÇÄÚºË̬µÄÉÏÏÂÎÄÇ뻶¼ÊǺÜÇáÁ¿µÄ£¬ÉõÖÁÓÐһЩӲ¼þÖ¸ÁîÀ´Ö§³Ö£¬±ÈÈçpusha¿ÉÒÔ°ïÖúÎÒÃDZ£´æͨÓüĴæÆ÷¡£Í¬Ò»¸ö½ø³ÌµÄÏ̹߳²ÏíÒ³±í£¬Òò´ËÉÏÏÂÎÄÇл»µÄ¿ªÏúÒ»°ãÖ»ÓУº

  • ±£´æ¸÷ÖּĴæÆ÷
  • Çл»sp(callÖ¸Áî»á×Ô¶¯½«pcѹջ)

¿ÉÒÔÔÚÊýÊ®ÌõÖ¸ÁîÄÚÍê³É¡£

¿ªÏú

¼ÈÈ»½üÄÚºËÒÔ¼°ÉÏÏÂÎÄÇ뻶¼²»Âý£¬ÄÇô¶àÏ̵߳ĿªÏú¾¿¾¹ÔÚÄÄ£¿

ÎÒÃDz»·Á¿´Ò»¸ö×èÈûµÄϵͳµ÷ÓÃfutexµÄÈȵã·Ö²¼£º

¿ÉÒÔ¿´µ½ÉÏÃæµÄÈȵãÖÐÓдóÁ¿Éæ¼°µ÷¶ÈµÄ¿ªÏú¡£ÎÒÃÇÀ´¿´¹ý³Ì£º

  1. µ÷ÓÃϵͳµ÷ÓÃ(¿ÉÄÜÐèÒª×èÈû)£»
  2. ϵͳµ÷ÓÃȷʵÐèÒª×èÈû£¬kernelÐèÒª¾ö¶¨ÏÂÒ»¸ö±»Ö´ÐеÄÏß³Ì(µ÷¶È)£»
  3. Ö´ÐÐÉÏÏÂÇл»¡£

Òò´Ë£¬ÉÏÃæ2¸öÎóÇøÓë¶àÏ̵߳ĿªÏú¶¼ÓÐÒ»¶¨Òò¹û¹Øϵ£¬µ«ÊÇÕæÕýµÄ¿ªÏúÀ´Ô´ÓÚÏß³Ì×èÈû»½Ðѵ÷¶È¡£

×ÛÉÏ£¬Ï£Íûͨ¹ýÏß³ÌÄ£ÐÍÀ´ÌáÉýweb serverÐÔÄܵÄÔ­ÔòÊÇ£º

  1. »îÔ¾Ïß³ÌÊýÔ¼µÈÓÚCPU¸öÊý
  2. ÿ¸öÏ̲߳»Ì«ÐèÒª×èÈû

ÎÄÕºóÐø½«½ô½ôΧÈÆÕâÁ½¸öÖ÷Ìâ¡£

ΪÁËÂú×ãÉÏÊöÁ½¸öÌõ¼þ£¬Ê¹ÓÃeventloop+Òì²½callbackµÄ·½Ê½ÊÇÒ»¸ö¼«¼ÑµÄÑ¡Ôñ¡£

Òì²½ÓëЭ³ÌµÄ¹Øϵ

ΪÁ˱£³Ö¼ò½à£¬ÎÒÃÇÒÔÒ»¸öÒì²½·þÎñÆ÷ÉϵÄNettyд²Ù×÷ΪÀý×Ó(д²Ù×÷Ò²´æÔÚ×èÈûµÄ¿ÉÄÜ)£º

´úÂëÓïÑÔ£ºjavascript
¸´ÖÆ
private?void?writeQuery(Channel?ch)?{???ch.write(Unpooled.wrappedBuffer("query".getBytes())).sync();???logger.info("write?finish");?}?

ÕâÀïµÄsync()»á×èÈûÏ̡߳£²»Âú×ãÆÚÍû¡£ÓÉÓÚnetty±¾ÉíÊÇÒ»¸öÒì²½¿ò¼Ü£¬ÎÒÃÇÒýÈë»Øµ÷£º

´úÂëÓïÑÔ£ºjavascript
¸´ÖÆ
private?void?writeQuery(Channel?ch)?{???ch.write(Unpooled.wrappedBuffer("query".getBytes()))?????.addListener(f?->?{???????logger.info("write?finish");?????});?}?

×¢ÒâÕâÀïÒì²½µÄwriteµ÷Óúó£¬writeQuery»á·µ»Ø¡£Òò´Ë¼ÙÈçÂß¼­ÉÏÒªÇóÔÚwriteºóÖ´ÐеĴúÂ룬±ØÐë³öÏÖÔڻص÷ÀwriteÊǺ¯ÊýµÄ×îºóÒ»ÐС£ÕâÀïÊÇ×î¼òµ¥µÄÇéÐΣ¬Èç¹ûº¯ÊýÓÐÆäËûµ÷ÓÃÕߣ¬ÄÇô¾ÍÐèÒªÓÃCPS±ä»»¡£

ÐèÒª²»¶ÏµÄÌáÈ¡³ÌÐòµÄ"Ï°벿·Ö"£¬¼´continuation£¬Ëƺõ¶ÔÎÒÃÇÔì³ÉһЩÐÄÖǸºµ£ÁË¡£ÕâÀïÎÒÃÇÒýÈëkotlinЭ³Ì°ïÖúÎÒÃǼò»¯³ÌÐò£º

´úÂëÓïÑÔ£ºjavascript
¸´ÖÆ
suspend?fun?Channel.aWrite(msg:?Any):?Int?=?????suspendCoroutine?{?cont?->?????????write(msg).addListener?{?cont.resume(0)?}?????}??suspend?fun?writeQuery(ch:?Channel)?{?????ch.aWrite(Unpooled.wrappedBuffer("query".toByteArray()))?????logger.info("write?finish")?}?

ÕâÀïÒýÈëÁËÒ»¸öħ·¨suspendCoroutine£¬ÎÒÃÇ¿ÉÒÔ»ñµÃµ±Ç°ContinuationµÄÒýÓ㬲¢Ö´ÐÐÒ»¶Î´úÂ룬×îºó¹ÒÆðµ±Ç°Ð­³Ì¡£Continuation´ú±íÁ˵±Ç°¼ÆËãµÄÑÓÐø£¬Í¨¹ýContinuation.resume()ÎÒÃÇ¿ÉÒÔ»Ö¸´Ö´ÐÐÉÏÏÂÎÄ¡£Òò´ËÖ»ÐèÔÚд²Ù×÷Íê³Éʱ»Øµ÷cont.resume(0)£¬ÎÒÃÇÓֻص½ÁËsuspendCoroutine´¦µÄÖ´ÐÐ״̬(°üÀ¨caller writeQuery)£¬³ÌÐò¼ÌÐøÖ´ÐУ¬´úÂë·µ»Ø£¬Ö´ÐÐlog¡£´ÓwriteQuery¿´ÎÒÃÇÓÃͬ²½µÄд·¨Íê³ÉÁËÒì²½²Ù×÷¡£µ±Ð­³Ì±»suspendCoroutineÇл»×ߺó£¬Ï߳̿ÉÒÔ¼ÌÐøµ÷¶ÈÆäËû¿ÉÒÔÖ´ÐеÄЭ³ÌÀ´Ö´ÐУ¬Òò´Ë²»»áÕæÕý×èÈû£¬ÎÒÃÇÒò´Ë»ñµÃÁËÐÔÄÜÌáÉý¡£

´ÓÕâÀï¿´£¬Ö»ÐèÒªÎÒÃÇÓÐÒ»¸ö»úÖÆÀ´±£´æ/»Ö¸´Ö´ÐÐÉÏÏÂÎÄ£¬²¢ÇÒÔÚ×èÈû¿âº¯ÊýÀï²ÉÓ÷Ç×èÈû+»Øµ÷µÄ·½Ê½Èóö/»Ö¸´Ð­³Ì£¬¾Í¿ÉÒÔʹµÃÒÔͬ²½ÐÎʽ±àдµÄ³ÌÐò´ïµ½ºÍÒ첽ͬÑùµÄЧ¹ûÁË¡£

ÀíÂÛÉÏÖ»ÒªÓÐÒ»¸ö¿â°ü×°ÁËËùÓÐJDK×èÈû·½·¨£¬ÎÒÃǾͿÉÒÔ³©¿ìµØ±àдÒì²½³ÌÐòÁË¡£¸ÄдµÄ×èÈû¿âº¯Êý±¾ÉíÐèÒª×ã¹»µØͨÓÃÁ÷ÐУ¬²ÅÄܱ»´ó²¿·Ö³ÌÐòʹÓÃÆðÀ´¡£¾ÝÎÒËùÖª£¬vert.xµÄkotlinÖ§³ÖÒѾ­×öÁËÕâÑùµÄ·â×°¡£

ËäÈ»vert.xºÜÁ÷ÐУ¬µ«ÊÇÎÞ·¨¼æ¹ËÒÅÁô´úÂëÒÔ¼°´úÂëÖеÄËø×èÈûµÈÂß¼­¡£Òò´Ë²»ÄÜËãÊÇ×îͨÓõÄÑ¡Ôñ¡£Êµ¼ÊÉÏJava³ÌÐòÓÐÒ»¸öÈƲ»¹ýµÄ¿â¡ª¡ªJDK¡£Wisp¾ÍÊÇÔÚJDKÀïËùÓеÄ×èÈûµ÷Óóö½øÐÐÁË·Ç×èÈû+ʼþ»Ö¸´Ð­³ÌµÄ·½Ê½Ö§³ÖÁËЭ³Ìµ÷¶È£¬ÔÚΪÓû§´øÀ´×î´ó±ãÀûµÄͬʱ£¬¼æ¹ËÁËÏÖÓдúÂëµÄ¼æÈÝÐÔ¡£

ÉÏÊö·½Ê½Ö§³ÖÁË£¬Ã¿¸öÏ̲߳»Ì«ÐèÒª×èÈû£¬WispÔÚThread.start()´¦£¬½«Ïß³Ìת³É³ÉÁËЭ³Ì£¬À´´ïµ½ÁËÁíһĿµÄ:?»îÔ¾Ïß³ÌÊýÔ¼µÈÓÚCPU¸öÊý¡£Òò´ËÖ»ÐèҪʹÓÃWispЭ³Ì£¬ËùÓÐÏÖÓеÄJava¶àÏ̴߳úÂ붼¿ÉÒÔ»ñµÃÒì²½µÄÐÔÄÜ¡£

ÊÖ¹¤Òì²½/WispÐÔÄܱȽÏ

¶ÔÓÚ»ùÓÚ´«Í³µÄ±à³ÌÄ£Ð͵ÄÓ¦Ó㬿¼Âǵ½Âß¼­ÇåÎúÐÔ¡¢Òì³£´¦ÀíµÄ±ãÀûÐÔ¡¢ÏÖÓпâµÄ¼æÈÝÐÔ£¬¸ÄÔì³ÉÒì²½³É±¾¾Þ´ó¡£Ê¹ÓÃWispÏà½ÏÓÚÒì²½±à³ÌÓÅÊÆÃ÷ÏÔ¡£

ÏÂÃæÎÒÃÇÔÚÖ»¿¼ÂÇÐÔÄܵÄÐÂÓ¦ÓõÄÇ°ÌáÏ·ÖÎö¼¼ÊõµÄÑ¡Ôñ¡£

»ùÓÚÏÖÓÐ×é¼þдÐÂÓ¦ÓÃ

Èç¹ûÒªÐÂдһ¸öÓ¦ÓÃÎÒÃÇͨ³£»áÒÀÀµJDBC¡¢Dubbo¡¢JedisÕâÑùµÄ³£ÓÃЭÒé/×é¼þ£¬¼ÙÈç¿âµÄÄÚ²¿Ê¹ÓÃÁË×èÈûÐÎʽ£¬²¢ÇÒûÓб©Â¶»Øµ÷½Ó¿Ú£¬ÄÇôÎÒÃǾÍû·¨»ùÓÚÕâЩ¿âÀ´Ð´Òì²½Ó¦ÓÃÁË(³ý·Ç°ü×°Ï̳߳أ¬µ«ÊDZ¾Ä©µ¹ÖÃÁË)¡£ÏÂÃæ¼ÙÉèÎÒÃÇÒÀÀµµÄËùÓпⶼÓлص÷Ö§³Ö£¬±ÈÈçdubbo¡£

1£©¼ÙÉèÎÒÃÇʹÓÃNetty½ÓÊÜÇëÇó£¬ÎÒÃdzÆ֮ΪÈë¿ÚeventLoop£¬ÊÕµ½ÇëÇó¿ÉÒÔÔÚNettyµÄhandlerÀï´¦Àí£¬Ò²¿ÉÒÔΪÁËioµÄʵʱÐÔʹÓÃÒµÎñÏ̳߳ء£

2£©¼ÙÉèÇëÇó´¦ÀíÆÚ¼äÐèÒªµ÷ÓÃdubbo£¬ÒòΪdubbo²»ÊÇÎÒÃÇдµÄ£¬Òò´ËÄÚ²¿ÓÐ×Ô¼ºµÄNetty Eventloop£¬ÓÚÊÇÎÒÃÇÏòdubboÄÚ²¿µÄNetty eventLoop´¦ÀíIO£¬µÈ´ýºó¶ËÏìÓ¦ºó»Øµ÷¡£

3£©dubbo eventLoopÊÕµ½ÏìÓ¦ºóÔÚeventloop»òÕßcallbackÏ̳߳ص÷ÓÃcallback¡£

4£©ºóÐøÂß¼­¿ÉÒÔÔÚcallbackÏ̳߳ػòÕßÔ­ÒµÎñÏ̳߳ؼÌÐø´¦Àí¡£

5£©ÎªÁËÍê³É¶Ô¿Í»§¶ËµÄÏìÓ¦×îÖÕ×ÜÊÇÒªÓÉÈë¿ÚµÄeventloopÀ´Ð´»ØÏìÓ¦¡£

ÎÒÃÇ¿ÉÒÔ¿´µ½ÓÉÓÚÕâÖÖ·â×°µ¼ÖµÄeventLoopµÄ¸îÁÑ£¬¼´±ãÍêȫʹÓûص÷µÄÐÎʽ£¬ÎÒÃÇ´¦ÀíÇëÇóʱ¶à¶àÉÙÉÙÒªÔÚ¶à¸öeventLoop/Ï̳߳ØÖ®¼ä´«µÝ£¬¶øÿ¸öÏß³ÌÓÖ¶¼Ã»·¨Åܵ½Ò»¸ö½ÏÂúµÄ³Ì¶È£¬µ¼ÖÂƵ·±µØ½øÈëosµ÷¶È¡£ÓëÉÏÊöµÄÿ¸öÏ̲߳»Ì«ÐèÒª×èÈûÔ­ÔòÏàÎ¥±³¡£Òò´ËËäÈ»¼õÉÙÁËÏß³ÌÊý£¬½ÚÔ¼ÁËÄڴ棬µ«ÊÇÎÒÃǵõ½µÄÐÔÄÜÊÕÒæ±äµÃºÜÓÐÏÞ¡£

ÍêÈ«´ÓÁ㿪ʼ¿ª·¢

¶ÔÓÚÒ»¸ö¹¦ÄÜÓÐÏÞµÄÐÂÓ¦ÓÃ(±ÈÈçnginxÖ»Ö§³ÖhttpºÍmailЭÒé)À´ËµÎÒÃÇ¿ÉÒÔ²»ÒÀÀµÏÖÓеÄ×é¼þÀ´ÖØÐÂдӦÓᣱÈÈçÎÒÃÇ¿ÉÒÔ»ùÓÚNettyдһ¸öÊý¾Ý¿â´úÀí·þÎñÆ÷£¬Óë¿Í»§¶ËµÄÁ¬½ÓÒÔ¼°ÓëÕæÕýºó¶ËÊý¾Ý¿âµÄÁ¬½Ó¹²Ïíͬһ¸öeventloop¡£

ÕâÑù¾«È·¿ØÖÆÏß³ÌÄ£Ð͵ÄÓ¦ÓÃͨ³£¿ÉÒÔ»ñµÃºÜºÃµÄÐÔÄÜ£¬Í¨³£ÐÔÄÜÊÇ¿ÉÒÔ¸ßÓÚͨ¹ý·ÇÒì²½³ÌÐòתЭ³ÌµÄ£¬Ô­ÒòÈçÏ£º

  • Ï߳̿ØÖƸü¼Ó¾«È·£º¾Ù¸öÀý×Ó£¬±ÈÈçÎÒÃÇ¿ÉÒÔ¿ØÖÆ´úÀíµÄ¿Í»§¶ËºÍºó¶ËÁ¬½Ó¶¼°ó¶¨ÔÚͬһ¸önettyỊ̈߳¬ËùÓеIJÙ×÷¶¼¿ÉÒÔthreadLocal»¯
  • ûÓÐЭ³ÌµÄruntimeºÍµ÷¶È¿ªÏú(1%×óÓÒ)

µ«ÊÇʹÓÃЭ³ÌÒÀ¾ÉÓÐÒ»¸öÓÅÊÆ£º¶ÔÓÚjdkÖÐÎÞ´¦²»ÔÚµÄsynchronized¿é£¬wisp¿ÉÒÔÕýÈ·µØÇл»µ÷¶È¡£

ÊÊÓ¦µÄWorkload

»ùÓÚÉÏÊöµÄ±³¾°£¬ÎÒÃÇÒѾ­ÖªµÀWisp»òÕßÆäËû¸÷ÖÖЭ³ÌÊÇÊÊÓÃÓÚIOÃܼ¯Java³ÌÐòÉè¼ÆµÄ¡£·ñÔòÏß³ÌûÓÐÈκÎÇл»£¬Ö»ÐèÒª¾¡ÇéµØÔÚCPUÉÏÅÜ£¬OSÒ²²»ÐèÒª¹ý¶àµÄ¸ÉÔ¤£¬ÕâÊDZȽÏÆ«ÏòÓÚÀëÏß»òÕß¿Æѧ¼ÆËãµÄ³¡¾°¡£

ÔÚÏßÓ¦ÓÃͨ³£ÐèÒª·ÃÎÊRPC¡¢DB¡¢cache¡¢ÏûÏ¢£¬²¢ÇÒÊÇ×èÈûµÄ£¬Ê®·ÖÊʺÏʹÓÃWispÀ´ÌáÉýÐÔÄÜ¡£

×îÔçµÄWisp1Ò²ÊǶÔÕâЩ³¡¾°½øÐÐÁËÉî¶È¶¨ÖÆ£¬±ÈÈçhsf½ÓÊܵÄÇëÇó´¦ÀíÊÇ»á×Ô¶¯ÓÃЭ³ÌÈ¡´úÏ̳߳أ¬½«IOÏß³ÌÊýÁ¿ÉèÖóÉ1¸öºóʹÓÃepoll_wait(1ms)À´´úÌæselector.wakeup()£¬µÈµÈ¡£Òò´ËÎÒÃǾ­³£Êܵ½µÄÒ»¸öÌôÕ½ÊÇWispÊÇ·ñÖ»Êʺϰ¢ÀïÄÚ²¿µÄworkload£¿

  • ¶ÔÓÚWisp1ÊÇÕâÑùµÄ£¬½ÓÈëµÄÓ¦ÓõIJÎÊýÒÔ¼°WispµÄʵÏÖ×öÁËÉî¶ÈµÄÊÊÅä¡£
  • ¶ÔÓÚWisp2£¬»á½«ËùÓÐÏß³Ìת»»³ÉЭ³Ì£¬ÒѾ­ÎÞÐèÈκÎÊÊÅäÁË¡£

ΪÁËÖ¤Ã÷ÕâÒ»µã£¬ÎÒÃÇʹÓÃÁËwebÁìÓò×îȨÍþµÄtechempower benchmak¼¯À´ÑéÖ¤£¬ÎÒÃÇÑ¡ÔñÁËcom.sun.net.httpserver¡¢ServletµÈ³£¼ûµÄ×èÈûÐ͵IJâÊÔ(ÐÔÄܲ»ÊÇ×îºÃ£¬µ«ÊÇ×îÌù½üÆÕͨÓû§£¬Í¬Ê±¾ß±¸Ò»¶¨µÄÌáÉý¿Õ¼ä)À´ÑéÖ¤Wisp2ÔÚ³£¼û¿ªÔ´×é¼þϵÄÐÔÄÜ£¬¿ÉÒÔ¿´µ½ÔÚ¸ßѹÁ¦ÏÂqps/RT»áÓÐ10%~20%µÄÓÅ»¯¡£

Project Loom

Project Loom×÷ΪOpenJDKÉϵıê׼Э³ÌʵÏÖºÜÖµµÃ¹Ø×¢£¬×÷Ϊjava¿ª·¢ÕßÎÒÃÇÊÇ·ñÓ¦¸ÃÓµ±§LoomÄØ£¿

ÎÒÃÇÊ×ÏȶÔWispºÍLoomÕâÀï½øÐÐһЩ±È½Ï£º

1£©LoomʹÓÃÐòÁл¯µÄ·½Ê½±£´æÉÏÏÂÎÄ£¬¸üÊ¡Äڴ棬µ«ÊÇÇл»Ð§Âʵ͡£

2£©Wisp²ÉÓöÀÁ¢Õ»µÄ·½Ê½£¬ÕâµãºÍgoÀàËÆ¡£Ð­³ÌÇл»Ö»ÐèÇл»¼Ä´æÆ÷£¬Ð§Âʸߵ«ÊǺÄÄÚ´æ¡£

3£©Loom²»Ö§³ÖObectMonitor£¬WispÖ§³Ö¡£

  • synchronized/Object.wait()½«Õ¼ÓÃỊ̈߳¬ÎÞ·¨³ä·ÖÀûÓÃCPU¡£
  • »¹¿ÉÄܲúÉúËÀËø£¬ÒÔWispµÄ¾­ÑéÀ´ËµÊÇÒ»¶¨»á²úÉúËÀËø(WispÒ²ÊǺóÀ´Â½ÐøÖ§³ÖObectMonitorµÄ)¡£

4£©WispÖ§³ÖÔÚÕ»ÉÏÓÐnativeº¯ÊýʱÇл»(·´ÉäµÈµÈ)£¬Loom²»Ö§³Ö¡£

  • ¶ÔdubboÕâÑùµÄ¿ò¼Ü²»ÓѺã¬Õ»µ×ϼ¸ºõ¶¼´øÓз´Éä¡£

×ܸù¾ÝÎÒÃǵÄÅжϣ¬LoomÖÁÉÙ»¹Òª2Äêʱ¼ä²ÅÄܵ½´ïÒ»¸öÎȶ¨²¢ÇÒ¹¦ÄÜÍêÉƵÄ״̬¡£WispµÄÐÔÄÜÓÅÐ㣬¹¦ÄÜÒªÍêÕûºÜ¶à£¬²úÆ·±¾ÉíÒ²Òª³ÉÊìºÜ¶à¡£Loom×÷ΪOracleÏîÄ¿ºÜÓлú»á½øÈëJava±ê×¼£¬ÎÒÃÇÒ²ÔÚ»ý¼«µØ²ÎÓëÉçÇø£¬Ï£ÍûÄܽ«WispµÄһЩ¹¦ÄÜʵÏÖ¹±Ï×½øÉçÇø¡£

ͬʱWispÄ¿Ç°ÍêÈ«¼æÈÝLoomµÄFiber API£¬¼ÙÈçÎÒÃǵÄÓû§»ùÓÚFiber APIÀ´±à³Ì£¬ÎÒÃÇ¿ÉÒÔ±£Ö¤´úÂëµÄÐÐΪÔÚLoomºÍWispÉϱíÏÖÍêÈ«Ò»Ö¡£

FAQ

Э³ÌÒ²Óе÷¶È£¬ÎªÊ²Ã´¿ªÏúС£¿

ÎÒÃÇһֱǿµ÷ÁËЭ³ÌÊÊÓÃÓÚIOÃܼ¯µÄ³¡¾°£¬Õâ¾ÍÒâζÁËͨ³£ÈÎÎñÖ´ÐÐһС¶Îʱ¼ä¾Í»á×èÈûµÈ´ýIO£¬Ëæºó½øÐе÷¶È¡£ÕâÖÖÇé¿öÏÂֻҪϵͳµÄCPUûÓÐÍêÈ«´òÂú£¬Ê¹Óüòµ¥µÄÏȽøÏȳöµ÷¶È²ßÂÔ»ù±¾¶¼Äܱ£Ö¤Ò»¸ö±È½Ï¹«Æ½µÄµ÷¶È¡£Í¬Ê±£¬ÎÒÃÇʹÓÃÁËÍêÈ«ÎÞËøµÄµ÷¶ÈʵÏÖ£¬Ê¹µÃµ÷¶È¿ªÏúÏà¶ÔÄں˴ó´ó¼õÉÙ¡£

Wisp2Ϊʲô²»Ê¹ÓÃForkJoinPoolÀ´µ÷¶ÈЭ³Ì£¿

ForkJoinPool±¾ÉíÊ®·ÖÓÅÐ㣬µ«ÊDz»Ì«ÊʺÏWisp2µÄ³¡¾°¡£

ΪÁ˱ãÓÚÀí½â£¬ÎÒÃÇ¿ÉÒÔ½«Ò»´ÎЭ³Ì»½ÐÑ¿´µ½×öÒ»¸öExecutor.execute()²Ù×÷£¬ForkJoinPoolËäȻ֧³ÖÈÎÎñÇÔÈ¡£¬µ«ÊÇexecute()²Ù×÷ÊÇËæ»ú»òÕß±¾Ï̶߳ÓÁвÙ×÷(È¡¾öÓÚÊÇ·ñÒ첽ģʽ)µÄ£¬Õ⽫µ¼ÖÂЭ³ÌÔÚÄĸöÏ̱߳»»½ÐѵÄÐÐΪҲºÜËæ»ú¡£

ÔÚWispµ×²ã£¬Ò»´ÎstealµÄ´ú¼ÛÊÇÓеã´óµÄ£¬Òò´ËÎÒÃÇÐèÒªÒ»¸öaffinity£¬ÈÃЭ³Ì¾¡Á¿±£³Ö°ó¶¨Ôڹ̶¨Ị̈߳¬Ö»ÓÐÏß³ÌæµÄÇé¿öϲŷ¢Éúworkstealing¡£ÎÒÃÇʵÏÖÁË×Ô¼ºµÄworkStealingPoolÀ´Ö§³ÖÕâ¸öÌØÐÔ¡£´Óµ÷¶È¿ªÏú/Ñӳٵȸ÷ÏîÖ¸±êÀ´¿´£¬»ù±¾ÄܺÍForkJoinPool´òƽ¡£

»¹ÓÐÒ»¸ö·½ÃæÊÇΪÁËÖ§³ÖÀàËÆgoµÄMºÍP»úÖÆ£¬ÎÒÃÇÐèÒª½«±»Ð­³Ì×èÈûµÄÏß³ÌÌß³öµ÷¶ÈÆ÷£¬ÕâЩ¹¦Äܶ¼²»ÊÊÒ˸ÄÔÚForkJoinPoolÀï¡£

ÈçºÎ¿´´ýReactive±à³Ì£¿

Reactive±à³ÌÄ£ÐÍÒѾ­±»Òµ½ç¹ã·º½ÓÊÜ£¬ÊÇÒ»ÖÖÖØÒªµÄ¼¼Êõ·½Ïò£»Í¬Ê±Java´úÂëÀïµÄ×èÈûÒ²ºÜÄÑÍêÈ«±ÜÃâ¡£ÎÒÃÇÈÏΪЭ³Ì¿ÉÒÔ×÷ΪһÖֵײãworker»úÖÆÀ´Ö§³ÖReactive±à³Ì£¬¼´±£ÁôÁËReactive±à³ÌÄ£ÐÍ£¬Ò²²»ÓÃÌ«µ£ÐÄÓû§´úÂëµÄ×èÈûµ¼ÖÂÁËÕû¸öϵͳ×èÈû¡£

ÕâÀïÊÇRon Pressler×î½üµÄÒ»´ÎÑݽ²£¬×÷ΪQuasarºÍLoomµÄ×÷Õߣ¬ËûµÄ¹ÛµãÏÊÃ÷µØÖ¸³öÁ˻ص÷Ä£ÐÍ»á¸øÄ¿Ç°µÄ±à³Ì´øÀ´ºÜ¶àÌôÕ½ ¡£

Wisp¾­ÀúÁË4ÄêµÄÑз¢£¬ÎÒ½«Æä·ÖΪ¼¸¸ö½×¶Î£º

1£©Wisp1£¬²»Ö§³ÖobjectMonitor¡¢²¢ÐÐÀà¼ÓÔØ£¬¿ÉÒÔÅÜһЩ¼òµ¥Ó¦Óã»

2£©Wisp1£¬Ö§³ÖÁËobjectMonitor£¬ÉÏÏßµçÉ̺ËÐÄ£¬²»Ö§³ÖworkStealing£¬µ¼ÖÂÖ»Äܽ«Ò»Ð©¶ÌÈÎÎñתΪЭ³Ì(·ñÔòworkload²»¾ùÔÈ)£¬nettyÏß³ÌÒÀ¾ÉÊÇỊ̈߳¬ÐèҪһЩ¸´ÔÓÇÒtrickµÄÅäÖã»

3£©Wisp2£¬Ö§³ÖÁËworkStealing£¬Òò´Ë¿ÉÒÔ½«ËùÓÐÏß³Ìת³ÉЭ³Ì£¬ÉÏÊönettyÎÊÌâÒ²²»ÔÙ´æÔÚÁË¡£

Ä¿Ç°Ö÷ÒªµÄÏÞÖÆÊÇʲô£¿

Ä¿Ç°Ö÷ÒªµÄÏÞÖÆÊDz»ÄÜÓÐ×èÈûµÄJNIµ÷Óã¬wispÊÇͨ¹ýÔÚJDKÖвåÈëhookÀ´ÊµÏÖ×èÈûÇ°µ÷¶ÈµÄ£¬Èç¹ûÊÇÓû§×Ô¶¨ÒåµÄJNIÔòûÓлú»áhook¡£

×î³£¼ûµÄ³¡¾°¾ÍÊÇʹÓÃÁËNettyµÄEpollEventLoop£º

1£©ÂìÒϵÄbolt×é¼þĬÈÏ¿ªÆôÁËÕâ¸öÌص㣬¿ÉÒÔͨ¹ý-Dbolt.netty.epoll.switch=false À´¹Ø±Õ£¬¶ÔÐÔÄܵÄÓ°Ïì²»´ó¡£

2£©Ò²¿ÉÒÔʹÓÃ-Dio.netty.noUnsafe=true , ÆäËûunsafe¹¦ÄÜ¿ÉÄÜ»áÊÜÓ°Ïì¡£

3£©(ÍƼö)?¶ÔÓÚnetty 4.1.25ÒÔÉÏ£¬Ö§³ÖÁËͨ¹ý-Dio.netty.transport.noNative=true?À´½ö¹Ø±Õjni epoll£¬²Î¼û358249e5

  • ·¢±íÓÚ:
  • Ô­ÎÄÁ´½Ó£ºhttp://news.51cto.com/art/201910/605243.htm
  • ÈçÓÐÇÖȨ£¬ÇëÁªÏµ cloudcommunity@tencent.com ɾ³ý¡£

ɨÂë

Ìí¼ÓÕ¾³¤ ½ø½»Á÷Ⱥ

ÁìȡרÊô 10ÔªÎÞÃż÷ȯ

˽Ïí×îР¼¼Êõ¸É»õ

ɨÂë¼ÓÈ뿪·¢ÕßÉçȺ
Áìȯ
http://www.vxiaotou.com