EpollÊÇLinuxÄÚºËΪ´¦Àí´óÅúÁ¿¾ä±ú¶ø×÷Á˸ĽøµÄpoll¡£ÒªÊ¹ÓÃepollÖ»ÐèÒªÕâÈý¸öϵͳµ÷Óãºepoll_create(2)£¬ epoll_ctl(2)£¬ epoll_wait(2)¡£ËüÊÇÔÚ2.5.44ÄÚºËÖб»Òý½øµÄ(epoll(4) is a new API introduced in Linux kernel 2.5.44)£¬ÔÚ2.6ÄÚºËÖеõ½¹ã·ºÓ¦Óã¬ÀýÈçLigHttpd¡£
epoll µÄÓŵã
Ö§³ÖÒ»¸ö½ø³Ì´ò¿ª´óÊýÄ¿µÄsocketÃèÊö·û(FD)
select ×î²»ÄÜÈÌÊܵÄÊÇÒ»¸ö½ø³ÌËù´ò¿ªµÄFDÊÇÓÐÒ»¶¨ÏÞÖÆµÄ£¬ÓÉFD_SETSIZEÉèÖã¬Ä¬ÈÏÖµÊÇ2048¡£¶ÔÓÚÄÇЩÐèÒªÖ§³ÖµÄÉÏÍòÁ¬½ÓÊýÄ¿µÄIM·þÎñÆ÷À´ËµÏÔȻ̫ÉÙÁË¡£ÕâʱºòÄãÒ»ÊÇ¿ÉÒÔÑ¡ÔñÐÞ¸ÄÕâ¸öºêÈ»ºóÖØÐ±àÒëÄںˣ¬²»¹ý×ÊÁÏҲͬʱָ³öÕâÑù»á´øÀ´ÍøÂçЧÂʵÄϽµ£¬¶þÊÇ¿ÉÒÔÑ¡Ôñ¶à½ø³ÌµÄ½â¾ö·½°¸(´«Í³µÄApache·½°¸)£¬²»¹ýËäÈ»linuxÉÏÃæ´´½¨½ø³ÌµÄ´ú¼Û±È½ÏС£¬µ«ÈÔ¾ÉÊDz»¿ÉºöÊӵ쬼ÓÉϽø³Ì¼äÊý¾Ýͬ²½Ô¶±È²»ÉÏÏ̼߳äͬ²½µÄ¸ßЧ£¬ËùÒÔÒ²²»ÊÇÒ»ÖÖÍêÃÀµÄ·½°¸¡£²»¹ý epollÔòûÓÐÕâ¸öÏÞÖÆ£¬ËüËùÖ§³ÖµÄFDÉÏÏÞÊÇ×î´ó¿ÉÒÔ´ò¿ªÎļþµÄÊýÄ¿£¬Õâ¸öÊý×ÖÒ»°ãÔ¶´óÓÚ2048,¾Ù¸öÀý×Ó,ÔÚ1GBÄÚ´æµÄ»úÆ÷ÉÏ´óÔ¼ÊÇ10Íò×óÓÒ£¬¾ßÌåÊýÄ¿¿ÉÒÔcat /proc/sys/fs/file-max²ì¿´,Ò»°ãÀ´ËµÕâ¸öÊýÄ¿ºÍϵͳÄÚ´æ¹ØÏµºÜ´ó¡£
IOЧÂʲ»ËæFDÊýÄ¿Ôö¼Ó¶øÏßÐÔϽµ
´«Í³µÄselect/pollÁíÒ»¸öÖÂÃüÈõµã¾ÍÊǵ±ÄãÓµÓÐÒ»¸öºÜ´óµÄsocket¼¯ºÏ£¬²»¹ýÓÉÓÚÍøÂçÑÓʱ£¬ÈÎһʱ¼äÖ»Óв¿·ÖµÄsocketÊÇ"»îÔ¾"µÄ£¬µ«ÊÇselect/pollÿ´Îµ÷Óö¼»áÏßÐÔɨÃèÈ«²¿µÄ¼¯ºÏ£¬µ¼ÖÂЧÂʳÊÏÖÏßÐÔϽµ¡£µ«ÊÇepoll²»´æÔÚÕâ¸öÎÊÌ⣬ËüÖ»»á¶Ô"»îÔ¾"µÄsocket½øÐвÙ×÷---ÕâÊÇÒòΪÔÚÄÚºËʵÏÖÖÐepollÊǸù¾Ýÿ¸öfdÉÏÃæµÄcallbackº¯ÊýʵÏֵġ£ÄÇô£¬Ö»ÓÐ"»îÔ¾"µÄsocket²Å»áÖ÷¶¯µÄÈ¥µ÷Óà callbackº¯Êý£¬ÆäËûidle״̬socketÔò²»»á£¬ÔÚÕâµãÉÏ£¬epollʵÏÖÁËÒ»¸ö"α"AIO£¬ÒòΪÕâʱºòÍÆ¶¯Á¦ÔÚosÄںˡ£ÔÚһЩ benchmarkÖУ¬Èç¹ûËùÓеÄsocket»ù±¾É϶¼ÊÇ»îÔ¾µÄ---±ÈÈçÒ»¸ö¸ßËÙLAN»·¾³£¬epoll²¢²»±Èselect/pollÓÐʲôЧÂÊ£¬Ïà·´£¬Èç¹û¹ý¶àʹÓÃepoll_ctl,ЧÂÊÏà±È»¹ÓÐÉÔ΢µÄϽµ¡£µ«ÊÇÒ»µ©Ê¹ÓÃidle connectionsÄ£ÄâWAN»·¾³,epollµÄЧÂʾÍÔ¶ÔÚselect/pollÖ®ÉÏÁË¡£
ʹÓÃmmap¼ÓËÙÄÚºËÓëÓû§¿Õ¼äµÄÏûÏ¢´«µÝ¡£
Õâµãʵ¼ÊÉÏÉæ¼°µ½epollµÄ¾ßÌåʵÏÖÁË¡£ÎÞÂÛÊÇselect,poll»¹ÊÇepoll¶¼ÐèÒªÄں˰ÑFDÏûϢ֪ͨ¸øÓû§¿Õ¼ä£¬ÈçºÎ±ÜÃâ²»±ØÒªµÄÄڴ濽±´¾ÍºÜÖØÒª£¬ÔÚÕâµãÉÏ£¬epollÊÇͨ¹ýÄÚºËÓÚÓû§¿Õ¼ämmapͬһ¿éÄÚ´æÊµÏֵġ£¶øÈç¹ûÄãÏëÎÒÒ»Ñù´Ó2.5Äں˾͹Ø×¢epollµÄ»°£¬Ò»¶¨²»»áÍü¼ÇÊÖ¹¤ mmapÕâÒ»²½µÄ¡£
ÄÚºË΢µ÷
ÕâÒ»µãÆäʵ²»ËãepollµÄÓŵãÁË£¬¶øÊÇÕû¸ölinuxƽ̨µÄÓŵ㡣ҲÐíÄã¿ÉÒÔ»³ÒÉlinuxƽ̨£¬µ«ÊÇÄãÎÞ·¨»Ø±Ülinuxƽ̨¸³ÓèÄã΢µ÷Äں˵ÄÄÜÁ¦¡£±ÈÈ磬ÄÚºËTCP/IPÐÒéջʹÓÃÄÚ´æ³Ø¹ÜÀísk_buff½á¹¹£¬ÄÇô¿ÉÒÔÔÚÔËÐÐʱÆÚ¶¯Ì¬µ÷ÕûÕâ¸öÄÚ´æpool(skb_head_pool)µÄ´óС--- ͨ¹ýecho XXXX>/proc/sys/net/core/hot_list_lengthÍê³É¡£ÔÙ±ÈÈçlistenº¯ÊýµÄµÚ2¸ö²ÎÊý(TCPÍê³É3´ÎÎÕÊÖµÄÊý¾Ý°ü¶ÓÁ㤶È)£¬Ò²¿ÉÒÔ¸ù¾ÝÄãÆ½Ì¨ÄÚ´æ´óС¶¯Ì¬µ÷Õû¡£¸üÉõÖÁÔÚÒ»¸öÊý¾Ý°üÃæÊýÄ¿¾Þ´óµ«Í¬Ê±Ã¿¸öÊý¾Ý°ü±¾Éí´óСȴºÜСµÄÌØÊâϵͳÉϳ¢ÊÔ×îеÄNAPIÍø¿¨Çý¶¯¼Ü¹¹¡£
epoll µÄʹÓÃ
ÁîÈ˸ßÐ˵ÄÊÇ£¬2.6Äں˵Äepoll±ÈÆä2.5¿ª·¢°æ±¾µÄ/dev/epoll¼ò½àÁËÐí¶à£¬ËùÒÔ£¬´ó²¿·ÖÇé¿öÏ£¬Ç¿´óµÄ¶«Î÷ÍùÍùÊǼòµ¥µÄ¡£Î¨Ò»ÓеãÂé·³ÊÇepollÓÐ2ÖÖ¹¤×÷·½Ê½:LTºÍET¡£
LT(level triggered)ÊÇȱʡµÄ¹¤×÷·½Ê½£¬²¢ÇÒͬʱ֧³ÖblockºÍno-block socket.ÔÚÕâÖÖ×ö·¨ÖУ¬Äں˸æËßÄãÒ»¸öÎļþÃèÊö·ûÊÇ·ñ¾ÍÐ÷ÁË£¬È»ºóÄã¿ÉÒÔ¶ÔÕâ¸ö¾ÍÐ÷µÄfd½øÐÐIO²Ù×÷¡£Èç¹ûÄã²»×÷ÈκβÙ×÷£¬Äں˻¹ÊÇ»á¼ÌÐøÍ¨ÖªÄ㠵ģ¬ËùÒÔ£¬ÕâÖÖģʽ±à³Ì³ö´íÎó¿ÉÄÜÐÔҪСһµã¡£´«Í³µÄselect/poll¶¼ÊÇÕâÖÖÄ£Ð͵Ĵú±í£®
ET (edge-triggered)ÊǸßËÙ¹¤×÷·½Ê½£¬Ö»Ö§³Öno-block socket¡£ÔÚÕâÖÖģʽÏ£¬µ±ÃèÊö·û´Óδ¾ÍÐ÷±äΪ¾ÍÐ÷ʱ£¬ÄÚºËͨ¹ýepoll¸æËßÄ㡣ȻºóËü»á¼ÙÉèÄãÖªµÀÎļþÃèÊö·ûÒѾ¾ÍÐ÷£¬²¢ÇÒ²»»áÔÙΪÄǸöÎļþÃèÊö ·û·¢Ë͸ü¶àµÄ¾ÍÐ÷֪ͨ£¬Ö±µ½Äã×öÁËijЩ²Ù×÷µ¼ÖÂÄǸöÎļþÃèÊö·û²»ÔÙΪ¾ÍÐ÷״̬ÁË(±ÈÈ磬ÄãÔÚ·¢ËÍ£¬½ÓÊÕ»òÕß½ÓÊÕÇëÇ󣬻òÕß·¢ËͽÓÊÕµÄÊý¾ÝÉÙÓÚÒ»¶¨Á¿Ê±µ¼Ö ÁËÒ»¸öEWOULDBLOCK ´íÎ󣩡£µ«ÊÇÇë×¢Ò⣬Èç¹ûÒ»Ö±²»¶ÔÕâ¸öfd×÷IO²Ù×÷(´Ó¶øµ¼ÖÂËüÔٴαä³Éδ¾ÍÐ÷)£¬Äں˲»»á·¢Ë͸ü¶àµÄ֪ͨ(only once),²»¹ýÔÚTCPÐÒéÖУ¬ETģʽµÄ¼ÓËÙЧÓÃÈÔÐèÒª¸ü¶àµÄbenchmarkÈ·ÈÏ¡£
epollÖ»ÓÐepoll_create,epoll_ctl,epoll_wait 3¸öϵͳµ÷Óã¬
¾ßÌåÓ÷¨Çë²Î¿¼http://www.xmailserver.org/linux-patches/nio-improve.html
ÔÚhttp://www.kegel.com/rn/ÓÐÒ»¸öÍêÕûµÄÀý×Ó¡£
À´×Ô:¿ªÔ´ÖйúÉçÇø

