Ëæ×Å´óÁ¿ÐÂÉúµÄÒì²½¿ò¼ÜºÍÖ§³Öг̵ÄÓïÑÔ(Èç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: ½øÄÚºËÒý·¢ÉÏÏÂÎÄÇл»
ÎÒÃÇ¿´Ò»¶Î²âÊÔ³ÌÐò£º
pipe(a);??while?(1)?{????write(a[1],?a,?1);????read(a[0],?a,?1);????n?+=?2;??}??
Ö´ÐÐÕâ¶Î³ÌÐòʱÉÏÏÂÎÄÇл»·Ç³£µÍ£¬Êµ¼ÊÉÏÉÏÃæµÄIOϵͳµ÷Óö¼ÊDz»»á×èÈûµÄ£¬Òò´ËÄں˲»ÐèÒª¹ÒÆðỊ̈߳¬Ò²²»ÐèÒªÇл»ÉÏÏÂÎÄ£¬Êµ¼Ê·¢ÉúµÄÊÇÓû§/ÄÚºË̬µÄģʽÇл»¡£
ÉÏÃæµÄ³ÌÐòÔÚÉñÁú·þÎñÆ÷²âµÃÿ¸öpipe²Ù×÷ºÄʱԼ334ns£¬ËٶȺܿ졣
ÎóÇø2: ÉÏÏÂÎÄÇл»µÄ¿ªÏúºÜ´ó
±¾ÖÊÉÏÀ´ËµÎÞÂÛÊÇÓû§Ì¬»¹ÊÇÄÚºË̬µÄÉÏÏÂÎÄÇ뻶¼ÊǺÜÇáÁ¿µÄ£¬ÉõÖÁÓÐһЩӲ¼þÖ¸ÁîÀ´Ö§³Ö£¬±ÈÈçpusha¿ÉÒÔ°ïÖúÎÒÃDZ£´æͨÓüĴæÆ÷¡£Í¬Ò»¸ö½ø³ÌµÄÏ̹߳²ÏíÒ³±í£¬Òò´ËÉÏÏÂÎÄÇл»µÄ¿ªÏúÒ»°ãÖ»ÓУº
¿ÉÒÔÔÚÊýÊ®ÌõÖ¸ÁîÄÚÍê³É¡£
¿ªÏú
¼ÈÈ»½üÄÚºËÒÔ¼°ÉÏÏÂÎÄÇ뻶¼²»Âý£¬ÄÇô¶àÏ̵߳ĿªÏú¾¿¾¹ÔÚÄÄ£¿
ÎÒÃDz»·Á¿´Ò»¸ö×èÈûµÄϵͳµ÷ÓÃfutexµÄÈȵã·Ö²¼£º
¿ÉÒÔ¿´µ½ÉÏÃæµÄÈȵãÖÐÓдóÁ¿Éæ¼°µ÷¶ÈµÄ¿ªÏú¡£ÎÒÃÇÀ´¿´¹ý³Ì£º
Òò´Ë£¬ÉÏÃæ2¸öÎóÇøÓë¶àÏ̵߳ĿªÏú¶¼ÓÐÒ»¶¨Òò¹û¹Øϵ£¬µ«ÊÇÕæÕýµÄ¿ªÏúÀ´Ô´ÓÚÏß³Ì×èÈû»½Ðѵ÷¶È¡£
×ÛÉÏ£¬Ï£Íûͨ¹ýÏß³ÌÄ£ÐÍÀ´ÌáÉýweb serverÐÔÄܵÄÔÔòÊÇ£º
ÎÄÕºóÐø½«½ô½ôΧÈÆÕâÁ½¸öÖ÷Ìâ¡£
ΪÁËÂú×ãÉÏÊöÁ½¸öÌõ¼þ£¬Ê¹ÓÃeventloop+Òì²½callbackµÄ·½Ê½ÊÇÒ»¸ö¼«¼ÑµÄÑ¡Ôñ¡£
Òì²½Óëг̵ĹØϵ
ΪÁ˱£³Ö¼ò½à£¬ÎÒÃÇÒÔÒ»¸öÒì²½·þÎñÆ÷ÉϵÄNettyд²Ù×÷ΪÀý×Ó(д²Ù×÷Ò²´æÔÚ×èÈûµÄ¿ÉÄÜ)£º
private?void?writeQuery(Channel?ch)?{???ch.write(Unpooled.wrappedBuffer("query".getBytes())).sync();???logger.info("write?finish");?}?
ÕâÀïµÄsync()»á×èÈûÏ̡߳£²»Âú×ãÆÚÍû¡£ÓÉÓÚnetty±¾ÉíÊÇÒ»¸öÒì²½¿ò¼Ü£¬ÎÒÃÇÒýÈë»Øµ÷£º
private?void?writeQuery(Channel?ch)?{???ch.write(Unpooled.wrappedBuffer("query".getBytes()))?????.addListener(f?->?{???????logger.info("write?finish");?????});?}?
×¢ÒâÕâÀïÒì²½µÄwriteµ÷Óúó£¬writeQuery»á·µ»Ø¡£Òò´Ë¼ÙÈçÂß¼ÉÏÒªÇóÔÚwriteºóÖ´ÐеĴúÂ룬±ØÐë³öÏÖÔڻص÷ÀwriteÊǺ¯ÊýµÄ×îºóÒ»ÐС£ÕâÀïÊÇ×î¼òµ¥µÄÇéÐΣ¬Èç¹ûº¯ÊýÓÐÆäËûµ÷ÓÃÕߣ¬ÄÇô¾ÍÐèÒªÓÃCPS±ä»»¡£
ÐèÒª²»¶ÏµÄÌáÈ¡³ÌÐòµÄ"Ï°벿·Ö"£¬¼´continuation£¬Ëƺõ¶ÔÎÒÃÇÔì³ÉһЩÐÄÖǸºµ£ÁË¡£ÕâÀïÎÒÃÇÒýÈëkotlinг̰ïÖúÎÒÃǼò»¯³ÌÐò£º
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¡£
ÕâÑù¾«È·¿ØÖÆÏß³ÌÄ£Ð͵ÄÓ¦ÓÃͨ³£¿ÉÒÔ»ñµÃºÜºÃµÄÐÔÄÜ£¬Í¨³£ÐÔÄÜÊÇ¿ÉÒÔ¸ßÓÚͨ¹ý·ÇÒì²½³ÌÐòתг̵ģ¬ÔÒòÈçÏ£º
µ«ÊÇʹÓÃгÌÒÀ¾ÉÓÐÒ»¸öÓÅÊÆ£º¶ÔÓÚ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£¿
ΪÁËÖ¤Ã÷ÕâÒ»µã£¬ÎÒÃÇʹÓÃÁË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Ö§³Ö¡£
4£©WispÖ§³ÖÔÚÕ»ÉÏÓÐnativeº¯ÊýʱÇл»(·´ÉäµÈµÈ)£¬Loom²»Ö§³Ö¡£
×ܸù¾ÝÎÒÃǵÄÅжϣ¬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
ÁìȡרÊô 10ÔªÎÞÃż÷ȯ
˽Ïí×îР¼¼Êõ¸É»õ