æåã«ãpcapãã©ã®ããã«æ©èœãããã«ã€ããŠããã€ãã®èšèãå ±æããããšæããŸã-ãã±ããããã£ããã£ããããã®ããç¥ãããæ¹æ³ iftopãtcpdumpãarpwatchãªã©ã®äžè¬çãªãŠãŒãã£ãªãã£ã§äœ¿çšãããŸãã ããã«ãããã»ããµã®è² è·ãéåžžã«é«ããªããŸãã
ãããã£ãŠããããã®ã€ã³ã¿ãŒãã§ã€ã¹ãéããŠãéåžžã®ã¢ãããŒã-bind / recvã䜿çšããŠãããããããã±ãŒãžãåŸ æ©ããŠããŸãã 次ã«ãã«ãŒãã«ã¯ãããã¯ãŒã¯ã«ãŒãããããŒã¿ãåä¿¡ããã«ãŒãã«ã¹ããŒã¹ã«ä¿åããŸãããã®åŸããŠãŒã¶ãŒããŠãŒã¶ãŒã¹ããŒã¹ã§ããŒã¿ãåä¿¡ãããããšãæ€åºãããã®ããŒã¿ãæ ŒçŽãããããã¡ãŒã¢ãã¬ã¹ãrecvã³ãã³ãã«åŒæ°ã§æž¡ããŸãã ã«ãŒãã«ã¯ããŒã¿ãå¿ å®ã«ã³ããŒããŸãïŒ2åç®ïŒïŒã ããªãè€éã«ãªããŸãããããããã¹ãŠã®pcapã®åé¡ã§ã¯ãããŸããã
ããã«ãrecvã¯ã·ã¹ãã ã³ãŒã«ã§ãããã€ã³ã¿ãŒãã§ã€ã¹ã«çä¿¡ãããã¹ãŠã®ãã±ããã«å¯ŸããŠåŒã³åºãããšãæãåºããŠãã ãããéåžžãã·ã¹ãã ã³ãŒã«ã¯éåžžã«é«éã§ãããææ°ã®10GEã€ã³ã¿ãŒãã§ã€ã¹ã®é床ïŒ1ç§ãããæ倧1,460äžåã®åŒã³åºãïŒã§ãéåžžã«è»œãåŒã³åºãã«ãªããŸãåŒã³åºãã®é »åºŠã ãã®ããã«ã·ã¹ãã ã®ã³ã¹ããããããŸãã
ãŸãããµãŒããŒã«ã¯éåžž2ã€ä»¥äžã®è«çã³ã¢ãããããšã«æ³šæããŠãã ããã ãããŠãããŒã¿ã¯ãããã®ã©ãã«ã§ãé£ã¶ããšãã§ããŸãïŒ ãŸããpcapã䜿çšããŠããŒã¿ãåä¿¡ããã¢ããªã±ãŒã·ã§ã³ã¯ãã·ã³ã°ã«ã³ã¢ã䜿çšããŸãã ããã§ã«ãŒãã«åŽã®ããã¯ããªã³ã«ãªãããã£ããã£ããã»ã¹ãå€§å¹ ã«é ããªããŸããçŸåšãã¡ã¢ãªã®ã³ããŒ/ãã±ããã®åŠçã ãã§ãªããä»ã®ã«ãŒãã«ãå æããŠããããã¯ã®è§£æŸãåŸ ã£ãŠããŸãã ç§ãä¿¡ããŠãããã¯ã¯å€ãã®å ŽåããµãŒããŒå šäœã®ããã»ããµãªãœãŒã¹ã®æ倧90ïŒ ãå ããããšããããŸãã
åé¡ã®è¯ããªã¹ãïŒ ã ãããç§ãã¡ã¯ããããã¹ãŠãè±éçã«è§£æ±ºããããšããŸãïŒ
ãããã£ãŠãæ確ã«ããããã«ããã©ãŒããŒãã§äœæ¥ããããšãä¿®æ£ããŸãïŒã€ãŸãããããã¯ãŒã¯ã®å€éšããç¹å®ã®ãµãŒããŒã®ãã¹ãŠã®ãã©ãã£ãã¯ã®ã³ããŒãååŸããããšãæå³ããŸãïŒã 次ã«ããã©ãã£ãã¯ãåä¿¡ããŸã-14.6 mpps / 7.6GEã®é床ã§æå°ãµã€ãºã®SYNãã©ãããã±ããã
SourceForgeã®ãããã¯ãŒã¯ixgbeãã©ã€ããŒã4.1.1ãDebian 8 Jessieã ã¢ãžã¥ãŒã«æ§æïŒmodprobe ixgbe RSS = 8.8ïŒããã¯éèŠã§ãïŒïŒã 8ã€ã®è«çã³ã¢ãåããi7 3820ããã»ããµãŒã䜿çšããŠããŸãã ãããã£ãŠã8ïŒã³ãŒãå ãå«ãïŒã䜿çšããå Žåã¯åžžã«ã䜿çšããŠããã³ã¢ã®æ°ã䜿çšããå¿ èŠããããŸãã
å²ã蟌ã¿ãæ¢åã®ã«ãŒãã«ã«é åžãã
å®å MACã¢ãã¬ã¹ããããã¯ãŒã¯ã«ãŒãã®MACã¢ãã¬ã¹ãšäžèŽããªããã±ãããããŒãã«å°çããããšã«æ³šæããŠãã ããã ããããªããšãLinuxã¹ã¿ãã¯ãTCP / IPæäœãéå§ãããã·ã³ããã©ãã£ãã¯ã§çªæ¯ããŸãã ãã®ç¹ã¯éåžžã«éèŠã§ããä»ã®äººã®ãã©ãã£ãã¯ã®ãã£ããã£ã«ã€ããŠã®ã¿èª¬æãããã®ãã·ã³å®ãŠã®ãã©ãã£ãã¯ã®åŠçã«ã€ããŠã¯èª¬æããŠããŸããïŒãã ãããã®æ¹æ³ã¯äœ¿ããããã§ãïŒã
次ã«ããã¹ãŠã®ãã©ãã£ãã¯ã®ãªãã¹ã³ãéå§ããå Žåã«åãå ¥ããããšãã§ãããã©ãã£ãã¯ã®éã確èªããŸãããã
ãããã¯ãŒã¯ã«ãŒãã§ç¡å·®å¥ã¢ãŒãããªã³ã«ããŸãã
ifconfig eth6 promisc
ãã®åŸãhtopã«éåžžã«äžå¿«ãªç»åã衚瀺ãããŸã-ã³ã¢ã®1ã€ã®å®å šãªãªãŒããŒããŒãïŒ
1 [|||||||||||||||||||||||||||||||||||||||||||||||||||ïŒ |||||||||||| 100.0ïŒ ] 2 [0.0ïŒ ] 3 [0.0ïŒ ] 4 [0.0ïŒ ] 5 [0.0ïŒ ] 6 [0.0ïŒ ] 7 [0.0ïŒ ] 8 [0.0ïŒ ]
ã€ã³ã¿ãŒãã§ã€ã¹ã®é床ã決å®ããã«ã¯ãç¹å¥ãªpps.shã¹ã¯ãªããã䜿çšããŸãïŒ gist.github.com/pavel-odintsov/bc287860335e872db9a5
ã€ã³ã¿ãŒãã§ã€ã¹ã®é床ã¯ããªãå°ããã1ç§ããã400äžãã±ããã§ãã
bash /root/pps.sh eth6
TX eth6ïŒ0 pkts / s RX eth6ïŒ3882721 pkts / s TX eth6ïŒ0 pkts / s RX eth6ïŒ3745027 pkts / s
ãã®åé¡ã解決ãããã¹ãŠã®è«çã³ã¢ïŒ8ã€ãããŸãïŒã«è² è·ãåæ£ããã«ã¯ã次ã®ã¹ã¯ãªãããå®è¡ããå¿ èŠããããŸãã
ããããé床ã¯ããã«æ倧12mppsã«ãªããŸããïŒãã ããããã¯ãã£ããã£ã§ã¯ãããŸãããããã¯ããããã¯ãŒã¯ãããã®é床ã§ãã©ãã£ãã¯ãèªã¿åãããšãã§ããããšã瀺ããŠããŸãïŒã
bash /root/pps.sh eth6 TX eth6ïŒ0 pkts / s RX eth6ïŒ12528942 pkts / s TX eth6ïŒ0 pkts / s RX eth6ïŒ12491898 pkts / s TX eth6ïŒ0 pkts / s RX eth6ïŒ12554312 pkts / s
ãããŠãã³ã¢ã®è² è·ãå®å®ããŸããïŒ
1 [||||| 7.4ïŒ ] 2 [|||||||| 9.7ïŒ ] 3 [|||||| 8.9ïŒ ] 4 [|| 2.8ïŒ ] 5 [||| 4.1ïŒ ] 6 [||| 3.9ïŒ ] 7 [||| 4.1ïŒ ] 8 [||||| 7.8ïŒ ]
ããã¹ãã§2ã€ã®ã³ãŒããµã³ãã«ã䜿çšãããããšã«ããã«æ³šç®ããŸãã
AF_PACKETãAF_PACKET + FANOUTïŒ gist.github.com/pavel-odintsov/c2154f7799325aed46ae
AF_PACKET RX_RINGãAF_PACKET + RX_RING + FANOUTïŒ gist.github.com/pavel-odintsov/15b7435e484134650f20
ãããã¯ãæ倧ã¬ãã«ã®æé©åãåããå®å šãªã¢ããªã±ãŒã·ã§ã³ã§ãã äžéïŒæããã«é ãããŒãžã§ã³ã®ã³ãŒãïŒã¯æäŸããŸãããããã¹ãŠã®æé©åã管çããããã®ãã¹ãŠã®ãã©ã°ã匷調衚瀺ãããboolãšããŠã³ãŒãã§å®£èšãããŸã-èªå® ã§ç°¡åã«ãã¹ãç¹°ãè¿ãããšãã§ããŸãã
æé©åãªãã§AF_PACKETãã£ããã£ãå®è¡ããæåã®è©Šã¿
ãã®ãããAF_PACKETã䜿çšããŠãã©ãã£ãã¯ããã£ããã£ããã¢ããªã±ãŒã·ã§ã³ãèµ·åããŸãã
åŠçïŒ222048 pps åŠçïŒ186315 pps
ãããŠå€©äºã®è² è·ïŒ
1 [|||||||||||||||||||||||||||||||||||||||||||||||||||ïŒ ||||||||| 86.1ïŒ ] 2 [||||||||||||||||||||||||||||||||||||||||||||||||||||ïŒ |||||| 84.1ïŒ ] 3 | | |||| 79.8ïŒ ] 4 [|||||||||||||||||||||||||||||||||||||||||||||||||||ïŒ |||||||||| 88.3ïŒ ] 5 [|||||||||||||||||||||||||||||||||||||||||||||||||||ïŒ ||||||| 83.7ïŒ ] 6 [|||||||||||||||||||||||||||||||||||||||||||||||||||ïŒ |||||||||| 86.7ïŒ ] 7 | | ||||||||||| 89.8ïŒ ] 8 [|||||||||||||||||||||||||||||||||||||||||||||||||||| ||||||||||||| 90.9ïŒ ]
ã«ãŒãã«ãããã¯ã§drããçç±ã¯ããã¹ãŠã®ããã»ããµãŒæéãæ¶è²»ããŸãã
ãµã³ãã«ïŒã€ãã³ã 'cpu-clock'ã®303Kãã€ãã³ãã«ãŠã³ãïŒçŽïŒïŒ53015222600 59.57ïŒ [ã«ãŒãã«] [k] _raw_spin_lock 9.13ïŒ [ã«ãŒãã«] [k] packet_rcv 7.23ïŒ [ixgbe] [k] ixgbe_clean_rx_irq 3.35ïŒ [ã«ãŒãã«] [k] pvclock_clocksource_read 2.76ïŒ [ã«ãŒãã«] [k] __netif_receive_skb_core 2.00ïŒ [ã«ãŒãã«] [k] dev_gro_receive 1.98ïŒ [ã«ãŒãã«] [k] consumer_skb 1.94ïŒ [ã«ãŒãã«] [k] build_skb 1.42ïŒ [ã«ãŒãã«] [k] kmem_cache_alloc 1.39ïŒ [ã«ãŒãã«] [k] kmem_cache_free 0.93ïŒ [ã«ãŒãã«] [k] inet_gro_receive 0.89ïŒ [ã«ãŒãã«] [k] __netdev_alloc_frag 0.79ïŒ [ã«ãŒãã«] [k] tcp_gro_receive
FANOUTã§AF_PACKETãã£ããã£ãæé©åãã
ããã§ã¯ã©ãããŸããïŒ å°ãèãããš:)è€æ°ã®ããã»ããµã1ã€ã®ãªãœãŒã¹ã䜿çšããããšãããšããã¯ãçºçããŸãã ç§ãã¡ã®å Žåãããã¯ã1ã€ã®ãœã±ãããããã1ã€ã®ã¢ããªã±ãŒã·ã§ã³ã«ãã£ãŠåŠçããããšããäºå®ã«ãããã®ã§ããããã«ãããæ®ãã®8ã€ã®è«çããã»ããµãåžžã«æåŸ ãããç¶æ ã«ãªããŸãã
ããã§ã¯ãåªããæ©èœãç§ãã¡ã®å©ãã«ãªããŸã-FANOUTããããŠãã·ã¢èªã®å Žå-åå²ã AF_PACKETã®å Žåãè€æ°ãå®è¡ã§ããŸãïŒãã¡ããããã®ã±ãŒã¹ã§æãæé©ãªã®ã¯ãè«çã³ã¢ã®æ°ã«çããããã»ã¹ã®æ°ã§ãïŒã ããã«ããããã®ãœã±ãããä»ããŠããŒã¿ãé åžããã¢ã«ãŽãªãºã ãæå®ã§ããŸãã PACKET_FANOUT_CPUã¢ãŒããéžæããŸãããç§ã®å ŽåãããŒã¿ã¯ãããã¯ãŒã¯ã«ãŒããã¥ãŒéã§éåžžã«åçã«åæ£ãããŠãããããã¯ãªãœãŒã¹éäžåã®ãã©ã³ã·ã³ã°ãªãã·ã§ã³ãšããŠã¯æå°ã ãšæããŸãïŒä¿èšŒã¯ã§ããŸããããã«ãŒãã«ã³ãŒãã確èªããããšããå§ãããŸãïŒã
ãµã³ãã«ã³ãŒãã§ã¯ãbool use_multiple_fanout_processes = true;ãä¿®æ£ããŸãã
ãããŠåã³ã¢ããªã±ãŒã·ã§ã³ãèµ·åããŸãã
å¥è·¡ïŒ 10åã®å éïŒ
åŠçïŒ2250709 pps åŠçïŒ2234301 pps åŠçïŒ2266138 pps
ãã¡ãããããã»ããµã¯ãŸã å®å šã«ããŒããããŠããŸãïŒ
1 [|||||||||||||||||||||||||||||||||||||||||||||||||||ïŒ ||||||||||||| 92.6ïŒ ] 2 [||||||||||||||||||||||||||||||||||||||||||||||||||||ïŒ ||||||||||||| 93.1ïŒ ] 3 [|||||||||||||||||||||||||||||||||||||||||||||||||||ïŒ ||||||||||||| 93.2ïŒ ] 4 [|||||||||||||||||||||||||||||||||||||||||||||||||||ïŒ ||||||||||||| 93.3ïŒ ] 5 [|||||||||||||||||||||||||||||||||||||||||||||||||||ïŒ ||||||||||||| 93.1ïŒ ] 6 [|||||||||||||||||||||||||||||||||||||||||||||||||||ïŒ ||||||||||||| 93.7ïŒ ] 7 [|||||||||||||||||||||||||||||||||||||||||||||||||||ïŒ ||||||||||||| 93.7ïŒ ] 8 [|||||||||||||||||||||||||||||||||||||||||||||||||||| ||||||||||||| 93.2ïŒ ]
ããããperfã®ããããããã¯å®å šã«ç°ãªã£ãŠèŠããŸã-ããããã¯ã¯ãããŸããïŒ
ãµã³ãã«ïŒ1Mã®ã€ãã³ããcpu-clockããã€ãã³ãã«ãŠã³ãïŒçŽïŒïŒ110166379815 17.22ïŒ [ixgbe] [k] ixgbe_clean_rx_irq 7.07ïŒ [ã«ãŒãã«] [k] pvclock_clocksource_read 6.04ïŒ [ã«ãŒãã«] [k] __netif_receive_skb_core 4.88ïŒ [ã«ãŒãã«] [k] build_skb 4.76ïŒ [ã«ãŒãã«] [k] dev_gro_receive 4.28ïŒ [ã«ãŒãã«] [k] kmem_cache_free 3.95ïŒ [ã«ãŒãã«] [k] kmem_cache_alloc 3.04ïŒ [ã«ãŒãã«] [k] packet_rcv 2.47ïŒ [ã«ãŒãã«] [k] __netdev_alloc_frag 2.39ïŒ [ã«ãŒãã«] [k] inet_gro_receive 2.29ïŒ [ã«ãŒãã«] [k] copy_user_generic_string 2.11ïŒ [ã«ãŒãã«] [k] tcp_gro_receive 2.03ïŒ [ã«ãŒãã«] [k] _raw_spin_unlock_irqrestore
ããã«ããœã±ããïŒAF_PACKETã«ã€ããŠã¯ããããŸãããïŒã«åä¿¡ãããã¡ãŒSO_RCVBUFãèšå®ããæ©èœããããŸããããã¹ãã¹ã¿ã³ãã§çµæãåŸãããŸããã§ããã
RX_RINGãªã³ã°ãããã¡ãŒã䜿çšããŠAF_PACKETãã£ããã£ãæé©åãã
äœããã¹ãããããã§ããªãé ãã®ã§ããïŒ çãã¯build_skbé¢æ°ã«ãããŸããããã¯ãã«ãŒãã«å ã§ã¡ã¢ãªã®2ã€ã®ã³ããŒããŸã äœæãããŠããããšãæå³ããŸãïŒ
ããã§ãRX_RINGã䜿çšããŠã¡ã¢ãªã®å²ãåœãŠãææ¡ããŠã¿ãŸãããã
ãããŠ4 MPPSã®ãããã也æ¯ïŒ
åŠçïŒ3582498 pps åŠçïŒ3757254 pps åŠçïŒ3669876 pps åŠçïŒ3757254 pps åŠçïŒ3815506 pps åŠçïŒ3873758 pps
ãã®é床ã®åäžã¯ããããã¯ãŒã¯ã«ãŒããããã¡ããã®ã¡ã¢ãªã®ã³ããŒã1åã®ã¿è¡ãããããã«ãªã£ãããšã«ããä¿èšŒãããŸããã ãŸããã«ãŒãã«ç©ºéãããŠãŒã¶ãŒç©ºéã«è»¢éããå Žåãç¹°ãè¿ãã³ããŒã¯å®è¡ãããŸããã ããã¯ãã«ãŒãã«ã«å²ãåœãŠããããŠãŒã¶ãŒç©ºéã§ã¹ããããããå ±æãããã¡ãŒã«ãã£ãŠä¿èšŒãããŸãã
åäœããã¢ãããŒããå€åããŠããŸã-ãã±ãããå°çãããšãã«ãã³ã°ããŠãªãã¹ã³ã§ããªããªããŸããïŒããã¯ãªãŒããŒãããã§ãïŒïŒãä»åºŠã¯ããŒãªã³ã°åŒã³åºãã§ããããã¯å šäœããã£ã±ãã«ãªã£ããšãã«ã·ã°ãã«ãæåŸ ã§ããŸãïŒ ãããŠãåŠçãéå§ããŸãã
FANOUTã«ããRX_RINGã䜿çšããAF_PACKETãã£ããã£ã®æé©å
ããã§ããããã¯ã«ã¯åé¡ããããŸãïŒ ããããæã¡è² ããã«ã¯ïŒ å€ãæ¹æ³ã¯ãFANOUTãæå¹ã«ããŠãåãã³ãã©ã¹ã¬ããã«ã¡ã¢ãªãããã¯ãå²ãåœãŠãããšã§ãïŒ
ãµã³ãã«ïŒ778Kã®ã€ãã³ããcpu-clockããã€ãã³ãã«ãŠã³ãïŒçŽïŒïŒ87039903833 74.26ïŒ [ã«ãŒãã«] [k] _raw_spin_lock 4.55ïŒ [ixgbe] [k] ixgbe_clean_rx_irq 3.18ïŒ [ã«ãŒãã«] [k] tpacket_rcv 2.50ïŒ [ã«ãŒãã«] [k] pvclock_clocksource_read 1.78ïŒ [ã«ãŒãã«] [k] __netif_receive_skb_core 1.55ïŒ [ã«ãŒãã«] [k] sock_def_readable 1.20ïŒ [ã«ãŒãã«] [k] build_skb 1.19ïŒ [ã«ãŒãã«] [k] dev_gro_receive 0.95ïŒ [ã«ãŒãã«] [k] kmem_cache_free 0.93ïŒ [ã«ãŒãã«] [k] kmem_cache_alloc 0.60ïŒ [ã«ãŒãã«] [k] inet_gro_receive 0.57ïŒ [ã«ãŒãã«] [k] kfree_skb 0.52ïŒ [ã«ãŒãã«] [k] tcp_gro_receive 0.52ïŒ [ã«ãŒãã«] [k] __netdev_alloc_frag
ããã§ãRX_RINGããŒãžã§ã³ã®FANOUTã¢ãŒããæ¥ç¶ããŸãïŒ
ã»ãïŒ èšé²!!! 9 MPPS !!!
åŠçïŒ9611580 pps åŠçïŒ8912556 pps åŠçïŒ8941682 pps åŠçïŒ8854304 pps åŠçïŒ8912556 pps åŠçïŒ8941682 pps åŠçïŒ8883430 pps åŠçïŒ8825178 pps
ããã©ãŒãã³ã¹ãããïŒ
ãµã³ãã«ïŒ224Kã®ã€ãã³ããcpu-clockããã€ãã³ãã«ãŠã³ãïŒçŽïŒïŒ42501395417 21.79ïŒ [ixgbe] [k] ixgbe_clean_rx_irq 9.96ïŒ [ã«ãŒãã«] [k] tpacket_rcv 6.58ïŒ [ã«ãŒãã«] [k] pvclock_clocksource_read 5.88ïŒ [ã«ãŒãã«] [k] __netif_receive_skb_core 4.99ïŒ [ã«ãŒãã«] [k] memcpy 4.91ïŒ [ã«ãŒãã«] [k] dev_gro_receive 4.55ïŒ [ã«ãŒãã«] [k] build_skb 3.10ïŒ [ã«ãŒãã«] [k] kmem_cache_alloc 3.09ïŒ [ã«ãŒãã«] [k] kmem_cache_free 2.63ïŒ [ã«ãŒãã«] [k] prb_fill_curr_block.isra.57
ã¡ãªã¿ã«ãå ¬å¹³ã®ããã«ãã«ãŒãã«4.0.0ãã©ã³ããæŽæ°ããŠããããã»ã©é«éåãããŸããã§ããã é床ã¯åãå¶éå ã«ç¶æãããŸããã ããããã³ã¢ã®è² è·ã¯å€§å¹ ã«äœäžããŸããïŒ
1 | | 55.1ïŒ ] 2 [||||||||||||||||||||||||||||||||||||||ïŒ 52.5ïŒ ] 3 [||||||||||||||||||||||||||||||||||||||||||||||||||| 62.5ïŒ ] 4 [||||||||||||||||||||||||||||||||||||||||||||||||||| 62.5ïŒ ] 5 [||||||||||||||||||||||||||||||||||||||||||||| 57.7ïŒ ] 6 [||||||||||||||||||||||||||||||||||||| 47.7ïŒ ] 7 [||||||||||||||||||||||||||||||||||||||||||||| 55.9ïŒ ] 8 [||||||||||||||||||||||||||||||||||||||||||||||||| 61.4ïŒ ]
çµè«ãšããŠãLinuxã¯ãç¹æ®ãªã«ãŒãã«ã¢ãžã¥ãŒã«ãæ§ç¯ã§ããªãç°å¢ã§ãããã©ãã£ãã¯åæã®ããã®åçŽãªçŽ æŽããããã©ãããã©ãŒã ã§ãããšä»ãå ããŸãã ãšãŠã幞ãã§ãã ã«ãŒãã«ã®æ¬¡ã®ããŒãžã§ã³ã§ã¯ã1800ã¡ã¬ãã«ãããã»ããµã䜿çšããŠã1460äž/ç§ã®ãã±ããã®ãã«ã¯ã€ã€ã¹ããŒãã§10GEãåŠçã§ããããšãæåŸ ãããŠããŸã:)
æšå¥šè³æïŒ
www.kernel.org/doc/Documentation/networking/packet_mmap.txt
man7.org/linux/man-pages/man7/packet.7.html