Äú¿ÉÒÔ¾èÖú£¬Ö§³ÖÎÒÃǵĹ«ÒæÊÂÒµ¡£

1Ôª 10Ôª 50Ôª





ÈÏÖ¤Â룺  ÑéÖ¤Âë,¿´²»Çå³þ?Çëµã»÷Ë¢ÐÂÑéÖ¤Âë ±ØÌî



  ÇóÖª ÎÄÕ ÎÄ¿â Lib ÊÓÆµ iPerson ¿Î³Ì ÈÏÖ¤ ×Éѯ ¹¤¾ß ½²×ù Model Center   Code  
»áÔ±   
   
 
     
   
 ¶©ÔÄ
  ¾èÖú
nginx¼Ü¹¹Ä£ÐÍ·ÖÎö
 
×÷Õߣº JavaDoop
  2251  次浏览      31
2021-7-1
 
±à¼­ÍƼö:
±¾ÎÄÖ÷Òª½éÉÜNginx¼Ü¹¹£¬nginx½ø³ÌÄ£ÐÍ£¬¶ÔNginx½ø³ÌµÄ¿ØÖƵÄÁ½ÖÖ·½Ê½£¬nginxÈçºÎ´¦Àí¾ªÈº£¬Ï£Íû¶ÔÄúµÄѧϰÓÐËù°ïÖú¡£
±¾ÎÄÀ´À´×Ô¾ò½ð£¬ÓÉ»ðÁú¹ûÈí¼þAlice±à¼­ÍƼö¡£

Ò»¡¢Nginx¼Ü¹¹

NginxÓÉÄں˺ÍÄ£¿é×é³É£¬´Ó¹Ù·½Îĵµhttp://nginx.org/en/docs/ϵÄModules reference¿ÉÒÔ¿´µ½Ò»Ð©±È½ÏÖØÒªµÄÄ£¿é£¬Ò»°ã·ÖΪºËÐÄ¡¢»ù´¡Ä£¿éÒÔ¼°µÚÈý·½Ä£¿é¡£

µÚÈý·½Ä£¿éÒâζ×ÅÄãÒ²¿ÉÒÔ°´ÕÕnginx±ê׼ȥ¿ª·¢·ûºÏ×Ô¼ºÒµÎñµÄÄ£¿é²å¼þ¡£

ºËÐÄÖ÷ÒªÓÃÓÚÌṩWeb ServerµÄ»ù±¾¹¦ÄÜ£¬ÒÔ¼°WebºÍMail·´Ïò´úÀíµÄ¹¦ÄÜ£»»¹ÓÃÓÚÆôÓÃÍøÂçЭÒ飬´´½¨±ØÒªµÄÔËÐÐʱ»·¾³ÒÔ¼°È·±£²»Í¬µÄÄ£¿éÖ®¼äƽ»¬µØ½øÐн»»¥¡£

²»¹ý£¬´ó¶à¸úЭÒéÏà¹ØµÄ¹¦ÄܺÍijӦÓÃÌØÓеŦÄܶ¼ÊÇÓÉnginxµÄÄ£¿éʵÏֵġ£ÕâЩ¹¦ÄÜÄ£¿é´óÖ¿ÉÒÔ·ÖΪ£ºÊ¼þÄ£¿é¡¢½×¶ÎÐÔ´¦ÀíÆ÷¡¢Êä³ö¹ýÂËÆ÷¡¢±äÁ¿´¦ÀíÆ÷¡¢Ð­Òé¡¢upstreamºÍ¸ºÔؾùºâ¼¸¸öÀà±ð£¬ÕâЩ¹²Í¬×é³ÉÁËnginxµÄhttp¹¦ÄÜ¡£Ê¼þÄ£¿éÖ÷ÒªÓÃÓÚÌṩOS¶ÀÁ¢µÄ(²»Í¬²Ù×÷ϵͳµÄʼþ»úÖÆÓÐËù²»Í¬)ʼþ֪ͨ»úÖÆÈçkqueue»òepollµÈ¡£Ð­ÒéÄ£¿éÔò¸ºÔðʵÏÖnginxͨ¹ýhttp¡¢tls/ssl¡¢smtp¡¢pop3ÒÔ¼°imapÓë¶ÔÓ¦µÄ¿Í»§¶Ë½¨Á¢»á»°¡£ÔÚNginxÄÚ²¿£¬½ø³Ì¼äµÄͨÐÅÊÇͨ¹ýÄ£¿éµÄpipeline»òchainʵÏֵģ»»»¾ä»°Ëµ£¬Ã¿Ò»¸ö¹¦ÄÜ»ò²Ù×÷¶¼ÓÉÒ»¸öÄ£¿éÀ´ÊµÏÖ¡£ÀýÈ磬ѹËõ¡¢Í¨¹ýFastCGI»òuwsgiЭÒéÓëupstream·þÎñÆ÷ͨÐÅ£¬ÒÔ¼°Óëmemcached½¨Á¢»á»°µÈ¡£

¶þ¡¢nginx½ø³ÌÄ£ÐÍ

2.1 ¶à½ø³ÌÄ£ÐÍ

NginxÖ®ËùÒÔΪ¹ã´óÂëũϲ°®£¬³ýÁËÆä¸ßÐÔÄÜÍ⣬»¹ÓÐÆäÓÅÑŵÄϵͳ¼Ü¹¹¡£ÓëMemcachedµÄ¾­µä¶àÏß³ÌÄ£ÐÍÏà±È£¬NginxÊǾ­µäµÄ¶à½ø³ÌÄ£ÐÍ¡£NginxÆô¶¯ºóÒÔdaemonµÄ·½Ê½ÔÚºǫ́ÔËÐУ¬ºǫ́½ø³Ì°üº¬Ò»¸ömaster½ø³ÌºÍ¶à¸öworker½ø³Ì£¬¾ßÌåÈçÏÂͼ£º

2.2 ¶à½ø³ÌÄ£Ð͵ĺô¦

¶ÔÓÚÿ¸öworker½ø³ÌÀ´Ëµ£¬¶ÀÁ¢µÄ½ø³Ì£¬²»ÐèÒª¼ÓËø£¬ËùÒÔÊ¡µôÁËËø´øÀ´µÄ¿ªÏú£¬Í¬Ê±ÔÚ±à³ÌÒÔ¼°ÎÊÌâ²éÕÒʱ£¬Ò²»á·½±ãºÜ¶à¡£Æä´Î£¬²ÉÓöÀÁ¢µÄ½ø³Ì£¬¿ÉÒÔÈû¥ÏàÖ®¼ä²»»áÓ°Ï죬һ¸ö½ø³ÌÍ˳öºó£¬ÆäËü½ø³Ì»¹ÔÚ¹¤×÷£¬·þÎñ²»»áÖжϣ¬master½ø³ÌÔòºÜ¿ìÆô¶¯ÐµÄworker½ø³Ì£¬²¢ÇÒ¶ÀÁ¢µÄ½ø³Ì£¬¿ÉÒÔÈû¥ÏàÖ®¼ä²»»áÓ°Ï죬һ¸ö½ø³ÌÍ˳öºó£¬ÆäËü½ø³Ì»¹ÔÚ£¬ÒÔÉÏÒ²ÊÇNginx¸ßЧµÄÁíÒ»¸öÔ­ÒòÁË¡£

2.3 masterÓëworker¹¦ÄÜ

2.3.1 master½ø³ÌÖ÷ÒªÓÃÀ´¹ÜÀíworker½ø³Ì£¬¾ßÌå°üÀ¨ÈçÏÂ4¸öÖ÷Òª¹¦ÄÜ£º

½ÓÊÕÀ´×ÔÍâ½çµÄÐźš£

Ïò¸÷worker½ø³Ì·¢ËÍÐźš£

¼à¿Øwoker½ø³ÌµÄÔËÐÐ״̬¡£

µ±woker½ø³ÌÍ˳öºó£¨Òì³£Çé¿öÏ£©£¬»á×Ô¶¯ÖØÐÂÆô¶¯ÐµÄwoker½ø³Ì¡£

2.3.2 woker½ø³ÌÖ÷ÒªÓÃÀ´´¦Àí»ù±¾µÄÍøÂçʼþ£º

¶à¸öworker½ø³ÌÖ®¼äÊǶԵÈÇÒÏ໥¶ÀÁ¢µÄ£¬ËûÃÇͬµÈ¾ºÕùÀ´×Ô¿Í»§¶ËµÄÇëÇó¡£

Ò»¸öÇëÇó£¬Ö»¿ÉÄÜÔÚÒ»¸öworker½ø³ÌÖд¦Àí£¬Ò»¸öworker½ø³Ì£¬²»¿ÉÄÜ´¦ÀíÆäËü½ø³ÌµÄÇëÇó¡£

worker½ø³ÌµÄ¸öÊýÊÇ¿ÉÒÔÉèÖõģ¬Ò»°ãÎÒÃÇ»áÉèÖÃÓë»úÆ÷cpuºËÊýÒ»Ö¡£¸ü¶àµÄworkerÊý£¬Ö»»áµ¼Ö½ø³ÌÀ´¾ºÕùcpu×ÊÔ´ÁË£¬´Ó¶ø´øÀ´²»±ØÒªµÄÉÏÏÂÎÄÇл»¡£¶øÇÒ£¬nginxΪÁ˸üºÃµÄÀûÓöàºËÌØÐÔ£¬¾ßÓÐcpu°ó¶¨Ñ¡ÏÎÒÃÇ¿ÉÒÔ½«Ä³Ò»¸ö½ø³Ì°ó¶¨ÔÚijһ¸öºËÉÏ£¬ÕâÑù¾Í²»»áÒòΪ½ø³ÌµÄÇл»´øÀ´cacheµÄʧЧ¡£

Èý¡¢½ø³Ì¿ØÖÆ·½Ê½

¶ÔNginx½ø³ÌµÄ¿ØÖÆÖ÷ÒªÊÇͨ¹ýmaster½ø³ÌÀ´×öµ½µÄ£¬Ö÷ÒªÓÐÁ½ÖÖ·½Ê½£º

3.1 ÊÖ¶¯·¢ËÍÐźÅ

´Óͼ1¿ÉÒÔ¿´³ö£¬master½ÓÊÕÐźÅÒÔ¹ÜÀíÖÚwoker½ø³Ì£¬ÄÇô£¬¿ÉÒÔͨ¹ýkillÏòmaster½ø³Ì·¢ËÍÐźţ¬±ÈÈçkill -HUP pidÓÃÒÔ֪ͨNginx´ÓÈÝÖØÆô¡£Ëùν´ÓÈÝÖØÆô¾ÍÊDz»ÖжϷþÎñ£ºmaster½ø³ÌÔÚ½ÓÊÕµ½Ðźź󣬻áÏÈÖØÐ¼ÓÔØÅäÖã¬È»ºóÔÙÆô¶¯Ð½ø³Ì¿ªÊ¼½ÓÊÕÐÂÇëÇ󣬲¢ÏòËùÓÐÀϽø³Ì·¢ËÍÐźŸæÖª²»ÔÙ½ÓÊÕÐÂÇëÇó²¢ÔÚ´¦ÀíÍêËùÓÐδ´¦ÀíÍêµÄÇëÇóºó×Ô¶¯Í˳ö¡£

3.2 ×Ô¶¯·¢ËÍÐźÅ

¿ÉÒÔͨ¹ý´øÃüÁîÐвÎÊýÆô¶¯Ð½ø³ÌÀ´·¢ËÍÐźŸømaster½ø³Ì£¬±ÈÈç./nginx -s reloadÓÃÒÔÆô¶¯Ò»¸öеÄNginx½ø³Ì£¬¶øÐ½ø³ÌÔÚ½âÎöµ½reload²ÎÊýºó»áÏòmaster½ø³Ì·¢ËÍÐźţ¨Ð½ø³Ì»á°ïÎÒÃǰÑÊÖ¶¯·¢ËÍÐźÅÖе͝×÷×Ô¶¯Íê³É£©¡£µ±È»Ò²¿ÉÒÔÕâÑù./nginx -s stopÀ´Í£Ö¹Nginx¡£

ËÄ¡¢ÊØ»¤Ïß³Ì daemon

4.1 ÊØ»¤Ïß³Ì

nginxÔÚÆô¶¯ºó£¬ÔÚunixϵͳÖлáÒÔdaemonµÄ·½Ê½ÔÚºǫ́ÔËÐУ¬ºǫ́½ø³Ì°üº¬Ò»¸ömaster½ø³ÌºÍ¶à¸öworker½ø³Ì¡£µ±È»nginxÒ²ÊÇÖ§³Ö¶àÏ̵߳ķ½Ê½µÄ£¬Ö»ÊÇÎÒÃÇÖ÷Á÷µÄ·½Ê½»¹ÊÇ¶à½ø³ÌµÄ·½Ê½£¬Ò²ÊÇnginxµÄĬÈÏ·½Ê½¡£

Îå¡¢ÍøÂçʼþÄ£¿é

Nginx£¨¶à½ø³Ì£©²ÉÓÃÒì²½·Ç×èÈûµÄ·½Ê½À´´¦ÀíÍøÂçʼþ£¬ÀàËÆÓÚLibevent£¨µ¥½ø³Ìµ¥Ị̈߳©£¬¾ßÌå¹ý³ÌÈçÏÂͼ£º

master½ø³ÌÏȽ¨ºÃÐèÒªlistenµÄsocketºó£¬È»ºóÔÙfork³ö¶à¸öwoker½ø³Ì£¬ÕâÑùÿ¸öwork½ø³Ì¶¼¿ÉÒÔÈ¥acceptÕâ¸ösocket¡£µ±Ò»¸öclientÁ¬½Óµ½À´Ê±£¬ËùÓÐacceptµÄwork½ø³Ì¶¼»áÊܵ½Í¨Öª£¬µ«Ö»ÓÐÒ»¸ö½ø³Ì¿ÉÒÔaccept³É¹¦£¬ÆäËüµÄÔò»áacceptʧ°Ü¡£NginxÌṩÁËÒ»°Ñ¹²ÏíËøaccept_mutexÀ´±£Ö¤Í¬Ò»Ê±¿ÌÖ»ÓÐÒ»¸öwork½ø³ÌÔÚacceptÁ¬½Ó£¬´Ó¶ø½â¾ö¾ªÈºÎÊÌâ¡£µ±Ò»¸öworker½ø³ÌacceptÕâ¸öÁ¬½Óºó£¬¾Í¿ªÊ¼¶ÁÈ¡ÇëÇ󣬽âÎöÇëÇ󣬴¦ÀíÇëÇ󣬲úÉúÊý¾Ýºó£¬ÔÙ·µ»Ø¸ø¿Í»§¶Ë£¬×îºó²Å¶Ï¿ªÁ¬½Ó£¬ÕâÑùÒ»¸öÍê³ÉµÄÇëÇó¾Í½áÊøÁË¡£

¶ÔÓÚÒ»¸ö»ù±¾µÄweb·þÎñÆ÷À´Ëµ£¬Ê¼þͨ³£ÓÐÈýÖÖÀàÐÍ£¬ÍøÂçʼþ¡¢Ðźš¢¶¨Ê±Æ÷¡£´ÓÉÏÃæµÄ½²½âÖÐÖªµÀ£¬ÍøÂçʼþͨ¹ýÒì²½·Ç×èÈû¿ÉÒԺܺõĽâ¾öµô¡£ÈçºÎ´¦ÀíÐźÅÓ붨ʱÆ÷£¿

ÐźŵĴ¦Àí¡££¨´ý²¹³ä£©

¶¨Ê±Æ÷¡£nginxÀïÃæµÄ¶¨Ê±Æ÷ʼþÊÇ·ÅÔÚÒ»¿Åά»¤¶¨Ê±Æ÷µÄºìºÚÊ÷ÀïÃæ£¬Ã¿´ÎÔÚ½øÈëepoll_waitǰ£¬ÏȴӸúìºÚÊ÷ÀïÃæÄõ½ËùÓж¨Ê±Æ÷ʼþµÄ×îСʱ¼ä£¬ÔÚ¼ÆËã³öepoll_waitµÄ³¬Ê±Ê±¼äºó½øÈëepoll_wait¡££¨´ý²¹³ä£©

Áù¡¢¾ªÈºÏÖÏó

6.1 ʲôʾªÈºÏÖÏó

¾ªÈº¼òµ¥À´Ëµ¾ÍÊǶà¸ö½ø³Ì»òÕßÏß³ÌÔڵȴýͬһ¸öʼþ£¬µ±Ê¼þ·¢Éúʱ£¬ËùÓÐÏ̺߳ͽø³Ì¶¼»á±»Äں˻½ÐÑ¡£»½ÐѺóͨ³£Ö»ÓÐÒ»¸ö½ø³Ì»ñµÃÁ˸Ãʼþ²¢½øÐд¦Àí£¬ÆäËû½ø³Ì·¢ÏÖ»ñȡʼþʧ°ÜºóÓÖ¼ÌÐø½øÈëÁ˵ȴý״̬£¬ÔÚÒ»¶¨³Ì¶ÈÉϽµµÍÁËϵͳÐÔÄÜ¡£¾ßÌåÀ´Ëµ¾ªÈºÍ¨³£·¢ÉúÔÚ·þÎñÆ÷µÄ¼àÌýµÈ´ýµ÷ÓÃÉÏ£¬·þÎñÆ÷´´½¨¼àÌýsocket£¬ºófork¶à¸ö½ø³Ì£¬ÔÚÿ¸ö½ø³ÌÖе÷ÓÃaccept»òÕßepoll_waitµÈ´ýÖն˵ÄÁ¬½Ó¡£

6.2 nginxµÄ¾ªÈºÏÖÏó

ÿ¸öworker½ø³Ì¶¼ÊÇ´Ómaster½ø³Ìfork¹ýÀ´¡£ÔÚmaster½ø³ÌÀïÃæ£¬ÏȽ¨Á¢ºÃÐèÒªlistenµÄsocketÖ® ºó£¬È»ºóÔÙfork³ö¶à¸öworker½ø³Ì£¬ÕâÑùÿ¸öworker½ø³Ì¶¼¿ÉÒÔÈ¥acceptÕâ¸ösocket(µ±È»²»ÊÇͬһ¸ösocket£¬Ö»ÊÇÿ¸ö½ø³Ì µÄÕâ¸ösocket»á¼à¿ØÔÚͬһ¸öipµØÖ·Óë¶Ë¿Ú£¬Õâ¸öÔÚÍøÂçЭÒéÀïÃæÊÇÔÊÐíµÄ)¡£Ò»°ãÀ´Ëµ£¬µ±Ò»¸öÁ¬½Ó½øÀ´ºó£¬ËùÓÐÔÚacceptÔÚÕâ¸ösocketÉÏ ÃæµÄ½ø³Ì£¬¶¼»áÊÕµ½Í¨Öª£¬¶øÖ»ÓÐÒ»¸ö½ø³Ì¿ÉÒÔacceptÕâ¸öÁ¬½Ó£¬ÆäËüµÄÔòacceptʧ°Ü¡£

6.3 nginxÈçºÎ´¦Àí¾ªÈº

Äں˽â¾öepollµÄ¾ªÈºÐ§Ó¦ÊDZȽÏÍíµÄ£¬Òò´Ënginx×ÔÉí½â¾öÁ˸ÃÎÊÌ⣨¸ü׼ȷµÄ˵ÊDZÜÃâÁË£©¡£Æä¾ßÌå˼·ÊÇ£º²»Èöà¸ö½ø³ÌÔÚͬһʱ¼ä¼àÌý½ÓÊÜÁ¬½ÓµÄsocket£¬¶øÊÇÈÃÿ¸ö½ø³ÌÂÖÁ÷¼àÌý£¬ÕâÑùµ±ÓÐÁ¬½Ó¹ýÀ´µÄʱºò£¬¾ÍÖ»ÓÐÒ»¸ö½ø³ÌÔÚ¼àÌýÄǿ϶¨¾ÍûÓоªÈºµÄÎÊÌâ¡£¾ßÌå×ö·¨ÊÇ£ºÀûÓÃÒ»°Ñ½ø³Ì¼äËø£¬Ã¿¸ö½ø³ÌÖж¼³¢ÊÔ»ñµÃÕâ°ÑËø£¬Èç¹û»ñÈ¡³É¹¦½«¼àÌýsocket¼ÓÈëwait¼¯ºÏÖУ¬²¢ÉèÖó¬Ê±µÈ´ýÁ¬½Óµ½À´£¬Ã»ÓлñµÃËùµÄ½ø³ÌÔò½«¼àÌýsocket´Ówait¼¯ºÏÈ¥³ý¡£ÕâÀïÖ»ÊǼòµ¥ÌÖÂÛnginxÔÚ´¦Àí¾ªÈºÎÊÌâ»ù±¾×ö·¨£¬Êµ¼ÊÆä´úÂ뻹´¦ÀíÁ˺ܶàϸ½ÚÎÊÌ⣬ÀýÈç¼òµ¥µÄÁ¬½ÓµÄ¸ºÔؾùºâ¡¢¶¨Ê±Ê¼þ´¦ÀíµÈµÈ¡£

ºËÐĵĴúÂëÈçÏÂ

void ngx_process_events_and_timers(ngx_cycle_t *cycle){
...
//ÕâÀïÃæ»á¶Ô¼àÌýsocket´¦Àí
//1¡¢»ñµÃËøÔò¼ÓÈëwait¼¯ºÏ,ûÓлñµÃÔòÈ¥³ý
if (ngx_trylock_accept_mutex(cycle) == NGX_ERROR) {
return;
}
...
//ÉèÖÃÍøÂç¶ÁдʼþÑÓ³Ù´¦Àí±êÖ¾£¬¼´ÔÚÊÍ·ÅËøºó´¦Àí
if (ngx_accept_mutex_held) {
flags |= NGX_POST_EVENTS;
}
...
//ÕâÀïÃæepollwaitµÈ´ýÍøÂçʼþ
//ÍøÂçÁ¬½Óʼþ£¬·ÅÈëngx_posted_accept_events¶ÓÁÐ
//ÍøÂç¶Áдʼþ£¬·ÅÈëngx_posted_events¶ÓÁÐ
(void) ngx_process_events(cycle, timer, flags);
...
//ÏÈ´¦ÀíÍøÂçÁ¬½Óʼþ£¬Ö»ÓлñÈ¡µ½Ëø£¬ÕâÀï²Å»áÓÐÁ¬½Óʼþ
ngx_event_process_posted(cycle, &ngx_posted_accept_events);
//ÊÍ·ÅËø£¬ÈÃÆäËû½ø³ÌÒ²Äܹ»Äõ½
if (ngx_accept_mutex_held) {
ngx_shmtx_unlock(&ngx_accept_mutex);
}
//´¦ÀíÍøÂç¶Áдʼþ
ngx_event_process_posted(cycle, &ngx_posted_events);
}

Æß¡¢Ïà¶ÔÓÚỊ̈߳¬²ÉÓýø³ÌµÄÓÅµã½ø³ÌÖ®¼ä²»¹²Ïí×ÊÔ´£¬²»ÐèÒª¼ÓËø£¬ËùÒÔÊ¡µôÁËËø´øÀ´µÄ¿ªÏú¡£

²ÉÓöÀÁ¢µÄ½ø³Ì£¬¿ÉÒÔÈû¥ÏàÖ®¼ä²»»áÓ°Ï죬һ¸ö½ø³ÌÍ˳öºó£¬ÆäËü½ø³Ì»¹ÔÚ¹¤×÷£¬·þÎñ²»»áÖжϣ¬master½ø³ÌÔòºÜ¿ìÖØÐÂÆô¶¯ÐµÄworker½ø³Ì¡£

±à³ÌÉϸü¼ÓÈÝÒס£

°Ë¡¢¶àÏ̵߳ÄÎÊÌâ

¶ø¶àÏß³ÌÔڶಢ·¢Çé¿öÏ£¬Ï̵߳ÄÄÚ´æÕ¼Óôó£¬Ïß³ÌÉÏÏÂÎÄÇл»Ôì³ÉCPU´óÁ¿µÄ¿ªÏú¡£ÏëÏëapacheµÄ³£Óù¤×÷·½Ê½£¨apache Ò²ÓÐÒì²½·Ç×èÈû°æ±¾£¬µ«ÒòÆäÓë×Ô´øÄ³Ð©Ä£¿é³åÍ»£¬ËùÒÔ²»³£Óã©£¬Ã¿¸öÇëÇó»á¶ÀÕ¼Ò»¸ö¹¤×÷Ị̈߳¬µ±²¢·¢ÊýÉϵ½¼¸Ç§Ê±£¬¾ÍͬʱÓм¸Ç§µÄÏß³ÌÔÚ´¦ÀíÇëÇóÁË¡£Õâ¶Ô ²Ù×÷ϵͳÀ´Ëµ£¬ÊǸö²»Ð¡µÄÌôÕ½£¬Ï̴߳øÀ´µÄÄÚ´æÕ¼Ó÷dz£´ó£¬Ï̵߳ÄÉÏÏÂÎÄÇл»´øÀ´µÄcpu¿ªÏúºÜ´ó£¬×ÔÈ»ÐÔÄܾÍÉϲ»È¥ÁË£¬¶øÕâЩ¿ªÏúÍêÈ«ÊÇûÓÐÒâÒåµÄ¡£

¾Å¡¢Òì²½·Ç×èÈû

9.1. ʲôÊÇÒì²½£¿

Òì²½µÄ¸ÅÄîºÍͬ²½Ïà¶ÔµÄ£¬Ò²¾ÍÊDz»ÊÇʼþÖ®¼ä²»ÊÇͬʱ·¢ÉúµÄ¡£

9.2 ʲôÊÂ×èÈû·Ç×èÈû£¿

·Ç×èÈûµÄ¸ÅÄîÊǺÍ×èÈû¶ÔÓ¦µÄ£¬×èÈûÊÇʼþ°´Ë³ÐòÖ´ÐУ¬Ã¿Ò»Ê¼þ¶¼ÒªµÈ´ýÉÏһʼþµÄÍê³É£¬¶ø·Ç×èÈûÊÇÈç¹ûʼþûÓÐ×¼±¸ºÃ£¬Õâ¸öʼþ¿ÉÒÔÖ±½Ó·µ»Ø£¬¹ýÒ»¶Îʱ¼äÔÙ½øÐд¦ÀíѯÎÊ£¬ÕâÆÚ¼ä¿ÉÒÔ×öÆäËûÊÂÇé¡£µ«ÊÇ£¬¶à´ÎѯÎÊÒ²»á´øÀ´¶îÍâµÄ¿ªÏú¡£

9.3 Nginx²ÉÓÃÒì²½·Ç×èÈûµÄºÃ´¦£¿

²»ÐèÒª´´½¨Ị̈߳¬Ã¿¸öÇëÇóÖ»Õ¼ÓÃÉÙÁ¿µÄÄÚ´æ

ûÓÐÉÏÏÂÎÄÇл»£¬Ê¼þ´¦Àí·Ç³£ÇáÁ¿

ÌÔ±¦tengineÍŶÓ˵²âÊÔ½á¹ûÊÇ¡°24GÄÚ´æ»úÆ÷ÉÏ£¬´¦Àí²¢·¢ÇëÇó¿É´ï200Íò¡±¡£

Ê®¡¢libevent ¸ÅÀÀ

Ö§³ÖLibeventÔËתµÄ¾ÍÊÇÒ»¸ö´óÑ­»·£¬Õâ¸öÖ÷Ñ­»·ÌåÏÖÔÚevent_base_loop£¨Event.c/1533£©º¯ÊýÀ¸Ãº¯ÊýµÄÖ´ÐÐÁ÷³ÌÈçÏ£º

ÉÏͼµÄ¼òµ¥ÃèÊö¾ÍÊÇ£º

УÕýϵͳµ±Ç°Ê±¼ä¡£

½«µ±Ç°Ê±¼äÓë´æ·Åʱ¼äµÄ×îС¶ÑÖеÄʱ¼äÒÀ´Î½øÐбȽϣ¬½«ËùÓÐʱ¼äСÓÚµ±Ç°Ê±¼äµÄ¶¨Ê±Æ÷ʼþ´Ó¶ÑÖÐÈ¡³öÀ´¼ÓÈëµ½»î¶¯Ê¼þ¶ÓÁÐÖС£

µ÷ÓÃI/O·â×°£¨±ÈÈ磺Epoll£©µÄʼþ·Ö·¢º¯Êýdispatchº¯Êý£¬ÒÔµ±Ç°Ê±¼äÓëʱ¼ä¶ÑÖеÄ×îСֵ֮¼äµÄ²îÖµ£¨×îС¶ÑÈ¡×îСֵ¸´ÔÓ¶ÈΪO(1)£©×÷ΪEpoll/epoll_wait£¨Epoll.c/dispatch/407£©µÄtimeoutÖµ£¬ÔÚÆäÖн«´¥·¢µÄI/OºÍÐźÅʼþ¼ÓÈëµ½»î¶¯Ê¼þ¶ÓÁÐÖС£

µ÷Óú¯Êýevent_process_active£¨Event.c/1406£©±éÀú»î¶¯Ê¼þ¶ÓÁУ¬ÒÀ´Îµ÷ÓÃ×¢²áµÄ»Øµ÷º¯Êý´¦ÀíÏàӦʼþ¡£

¸½ÉÏevent_base_loopÔ´ÂëÈçÏ£º

int event_base_loop(struct event_base *base, int flags)
{
const struct eventop *evsel = base->evsel;
struct timeval tv;
struct timeval *tv_p;
int res, done, retval = 0;
/* Grab the lock. We will release it inside evsel.dispatch, and again
* as we invoke user callbacks. */
EVBASE_ACQUIRE_LOCK(base, th_base_lock);
if (base->running_loop) {
event_warnx("%s: reentrant invocation. Only one event_base_loop"
" can run on each event_base at once.", __func__);
EVBASE_RELEASE_LOCK(base, th_base_lock);
return -1;
}
base->running_loop = 1;
clear_time_cache(base);
if (base->sig.ev_signal_added && base->sig.ev_n_signals_added)
evsig_set_base(base);
done = 0;
#ifndef _EVENT_DISABLE_THREAD_SUPPORT
base->th_owner_id = EVTHREAD_GET_ID();
#endif
base->event_gotterm = base->event_break = 0;
while (!done) {
base->event_continue = 0;
/* Terminate the loop if we have been asked to */
if (base->event_gotterm) {
break;
}
if (base->event_break) {
break;
}
timeout_correct(base, &tv);
tv_p = &tv;
if (!N_ACTIVE_CALLBACKS(base) && !(flags & EVLOOP_NONBLOCK)) {
timeout_next(base, &tv_p);
} else {
/*
* if we have active events, we just poll new events
* without waiting.
*/
evutil_timerclear(&tv);
}
/* If we have no events, we just exit */
if (!event_haveevents(base) && !N_ACTIVE_CALLBACKS(base)) {
event_debug(("%s: no events registered.", __func__));
retval = 1;
goto done;
}
/* update last old time */
gettime(base, &base->event_tv);
clear_time_cache(base);
res = evsel->dispatch(base, tv_p);
if (res == -1) {
event_debug(("%s: dispatch returned unsuccessfully.",
__func__));
retval = -1;
goto done;
}
update_time_cache(base);
timeout_process(base);
if (N_ACTIVE_CALLBACKS(base)) {
int n = event_process_active(base);
if ((flags & EVLOOP_ONCE)
&& N_ACTIVE_CALLBACKS(base) == 0
&& n != 0)
done = 1;
} else if (flags & EVLOOP_NONBLOCK)
done = 1;
}
event_debug(("%s: asked to terminate loop.", __func__));
done:
clear_time_cache(base);
base->running_loop = 0;
EVBASE_RELEASE_LOCK(base, th_base_lock);
return (retval);
}
   
2251 ´Îä¯ÀÀ       31
????

HTTP????
nginx??????
SD-WAN???
5G?????
 
????

??????????
IPv6???????
??????????
???????
????

????????
????????
???????????????
??????????
×îл¼Æ»®
DeepSeekÔÚÈí¼þ²âÊÔÓ¦ÓÃʵ¼ù 4-12[ÔÚÏß]
DeepSeek´óÄ£ÐÍÓ¦Óÿª·¢Êµ¼ù 4-19[ÔÚÏß]
UAF¼Ü¹¹ÌåϵÓëʵ¼ù 4-11[±±¾©]
AIÖÇÄÜ»¯Èí¼þ²âÊÔ·½·¨Óëʵ¼ù 5-23[ÉϺ£]
»ùÓÚ UML ºÍEA½øÐзÖÎöÉè¼Æ 4-26[±±¾©]
ÒµÎñ¼Ü¹¹Éè¼ÆÓ뽨ģ 4-18[±±¾©]
 
×îÐÂÎÄÕÂ
ÔÆÔ­Éú¼Ü¹¹¸ÅÊö
K8S¸ß¿ÉÓü¯Èº¼Ü¹¹ÊµÏÖ
ÈÝÆ÷ÔÆ¹ÜÀíÖ®K8S¼¯Èº¸ÅÊö
k8s-ÕûÌå¸ÅÊöºÍ¼Ü¹¹
Ê®·ÖÖÓѧ»áÓÃdocker²¿Êð΢·þÎñ
×îпγÌ
ÔÆ¼ÆË㡢΢·þÎñÓë·Ö²¼Ê½¼Ü¹¹
Æóҵ˽ÓÐÔÆÔ­ÀíÓë¹¹½¨
»ùÓÚKubernetesµÄDevOpsʵ¼ù
ÔÆÆ½Ì¨¼Ü¹¹ÓëÓ¦Ó㨰¢ÀïÔÆ£©
Docker²¿Êð±»²âϵͳÓë×Ô¶¯»¯¿ò¼Üʵ¼ù
³É¹¦°¸Àý
±±¾© ÔÆÆ½Ì¨Óë΢·þÎñ¼Ü¹¹Éè¼Æ
ͨÓù«Ë¾GE DockerÔ­ÀíÓëʵ¼ùÅàѵ
ij¾ü¹¤Ñо¿µ¥Î» MDA£¨Ä£ÐÍÇý¶¯¼Ü¹¹£©
ÖªÃûÏû·Ñ½ðÈÚ¹«Ë¾ ÁìÓòÇý¶¯Éè¼Æ
ÉîÛÚijÆû³µÆóÒµ Ä£ÐÍÇý¶¯µÄ·ÖÎöÉè¼Æ