10GbE࣌ͷωοτϫʔΫI/OߴԽTakuya ASADA
View Slide
Slide URL•http://slidesha.re/16OV9Yx
͡Ίʹ• 10GbEɺ40GbEͳͲͷۃΊͯߴͳ௨৴Λαϙʔτ͢ΔNIC͕ɺPCαʔόͷྖҬͰΘΕΔΑ͏ʹͳ͖͍ͬͯͯΔ • ͜ͷΑ͏ͳͷ௨৴ΛιϑτΣΞʢOSʣͰॲཧ͠ߴ͍ੑೳΛಘΔʹ༷ʑͳো͕͋ΓɺϋʔυΣΞɾιϑτΣΞ྆໘ͷ࣮Λݟ͢ඞཁ͕͋Δ
ࠓͷτϐοΫ1. ׂΓࠐΈ͕ଟ͗͢Δ 2. ϓϩτίϧॲཧ͕ॏ͍ 3. ෳͷCPUͰύέοτॲཧ͍ͨ͠ 4. σʔλҠಈʹ͏ϨΠςϯγͷݮ 5. ϓϩτίϧελοΫΛܦ༝͠ͳ͍ωοτϫʔΫIO
1. ׂΓࠐΈ͕ଟ͗͢ΔProcess(User)Process(Kernel)HW Intr HandlerSW Intr Handlerύέοτड৴ϓϩτίϧॲཧιέοτड৴ॲཧϢʔβϓϩάϥϜVTFSCV⒎FSinputqueuesocketqueueύέοτγεςϜίʔϧϓϩηεىচιϑτΣΞׂΓࠐΈεέδϡʔϧϋʔυΣΞׂΓࠐΈϢʔβۭؒίϐʔ
ׂΓࠐΈ͕ଟ͗͢Δ• NICͷੑೳ্ʹΑͬͯɺҰఆ࣌ؒʹNIC͕ॲཧͰ͖Δύέοτ͕ඈ༂తʹ૿Ճ • ̍ύέοτຖʹׂΓࠐΈ͕དྷΔͱɺ௨৴ྔ͕ଟ͍ͱ͖ʹίϯςΩετεΠονճ͕૿͑͗͢ੑೳ͕ྼԽ
چདྷͷύέοτड৴ॲཧProcess(User)Process(Kernel)HW Intr HandlerSW Intr Handlerύέοτड৴ϓϩτίϧॲཧιέοτड৴ॲཧϢʔβϓϩάϥϜVTFSCV⒎FSinputqueuesocketqueueύέοτγεςϜίʔϧϓϩηεىচιϑτΣΞׂΓࠐΈεέδϡʔϧϋʔυΣΞׂΓࠐΈϢʔβۭؒίϐʔϋʔυΣΞׂΓࠐΈ ˣ ड৴ΩϡʔʹΩϡʔΠϯά ˣ ιϑτΣΞׂΓࠐΈεέδϡʔϧ
چདྷͷύέοτड৴ॲཧ• ̍ύέοτड৴͢ΔͨͼʹׂΓࠐΈΛड͚ͯॲཧΛߦ͍ͬͯΔ • 64byte frameͷ࠷େड৴Մೳɿ • GbEɿ1.5Mppsʢ150ສʣ • 10GbEɿ15Mppsʢ1500ສʣ
ׂΓࠐΈΛແޮʹ͢Δʁ• ϙʔϦϯάํࣜ • NICͷׂΓࠐΈΛېࢭ͠ɺΘΓʹΫϩοΫׂΓࠐΈΛ༻͍ͯఆظతʹड৴ΩϡʔΛνΣοΫ • σϝϦοτɿϨΠςϯγ্͕͕ΔɾఆظతʹCPUΛى͜͢ඞཁ͕͋Δ • ϋΠϒϦουํࣜ • ௨৴ྔ͕ଟ͘࿈ଓͯ͠ύέοτॲཧΛߦ͍ͬͯΔ࣌ͷΈׂΓࠐΈΛແޮԽͯ͠ϙʔϦϯάͰಈ࡞
NAPIʢϋΠϒϦουํࣜʣProcess(User)Process(Kernel)HW Intr HandlerSW Intr HandlerׂΓࠐΈແޮԽϓϩτίϧॲཧιέοτड৴ॲཧϢʔβϓϩάϥϜVTFSCV⒎FSsocketqueueύέοτγεςϜίʔϧϓϩηεىচϋʔυΣΞׂΓࠐΈϢʔβۭؒίϐʔύέοτύέοτιϑτΣΞׂΓࠐΈεέδϡʔϧύέοτड৴ύέοτ͕ແ͘ͳΔ·Ͱ܁Γฦ͠ϋʔυΣΞׂΓࠐΈ ˣ ׂΓࠐΈແޮԽˍ ϙʔϦϯά։࢝ ↓ ύέοτ͕ແ͘ͳͬͨΒׂΓࠐΈ༗ޮԽ
Interrupt Coalescing• NIC͕OSෛՙΛߟׂྀͯ͠ΓࠐΈΛؒҾ͘ • ύέοτݸʹҰճׂΓࠐΉɺ ͍҃Ұఆظ͔ؒͬͯΒׂΓࠐΉ • σϝϦοτɿϨΠςϯγ্͕͕Δ
Interrupt CoalescingͷޮՌ• Intel 82599(ixgbe)ͰInterrupt Coalescingແޮɺ ༗ޮʢׂΓࠐΈසࣗಈௐʣͰൺֱ • MultiQueue, GRO, LROແޮԽ • iperfͷTCPϞʔυͰܭଌinterrupts throughput packets CPU%(sy+si)ແޮ 46687 int/s 7.82 Gbps 660386 pkt/s 97.6%༗ޮ 7994 int/s 8.24 Gbps 711132 pkt/s 79.6%
Process(User)Process(Kernel)HW Intr HandlerSW Intr HandlerׂΓࠐΈແޮԽϓϩτίϧॲཧιέοτड৴ॲཧϢʔβϓϩάϥϜVTFSCV⒎FSsocketqueueύέοτγεςϜίʔϧϓϩηεىচϋʔυΣΞׂΓࠐΈϢʔβۭؒίϐʔύέοτύέοτιϑτΣΞׂΓࠐΈεέδϡʔϧύέοτड৴ύέοτ͕ແ͘ͳΔ·Ͱ܁Γฦ͠2.ϓϩτίϧॲཧ͕ॏ͍
ϓϩτίϧॲཧ͕ॏ͍• ಛʹখ͞ͳύέοτ͕େྔʹಧ͘߹ʹϓϩτίϧॲཧͰCPU࣌ؒΛେྔʹͬͯ͠·͏ • ύέοτϓϩτίϧελοΫ͕ݺͼग़͞ΕΔ ྫɿ64byte frameͷ߹ ˠཧ্ͷ࠷େ1500ສճ/s
TOE(TCP Offload Engine)• OSͰϓϩτίϧॲཧ͢ΔͷΛΊͯɺNICͰॲཧ͢Δ • σϝϦοτ • ηΩϡϦςΟɿTOEʹηΩϡϦςΟϗʔϧ͕ੜͯ͡ɺOSଆ͔Βରॲ͕ग़དྷͳ͍ • ෳࡶੑɿOSͷωοτϫʔΫελοΫΛTOEͰஔ͖͑Δʹ͔ͳΓൣғͷมߋ͕ඞཁ ϝʔΧʹΑͬͯTOEͷ࣮͕ҟͳΓڞ௨ΠϯλϑΣʔεఆ͕ٛࠔ • Linuxɿαϙʔτ༧ఆແ͠
Checksum Offloading • IPɾTCPɾUDP checksumͷܭࢉΛNICͰߦ͏
Checksum OffloadingͷޮՌ• Intel 82599(ixgbe)Ͱൺֱ • iperfͷTCPϞʔυͰܭଌ • MultiQueueແޮԽ • ethtool -K ix0 rx offthroughput CPU%(sy+si)ແޮ 8.27 Gbps 86༗ޮ 8.27 Gbps 85.2
LRO(Large Receive Offload)• NIC͕ड৴ͨ͠TCPύέοτΛ݁߹͠ɺ େ͖ͳύέοτʹ͔ͯ͠ΒOS͢ • ϓϩτίϧελοΫͷݺͼग़͠ճΛݮ • LinuxͰιϑτΣΞʹΑΔLRO͕࣮͞Ε͍ͯΔʢGROʣ
LRO͕ແ͍߹• ύέοτຖʹωοτϫʔΫελοΫΛ࣮ߦseq 10000 seq 10001 seq 10002 seq 10003←1500bytes→To network stack
LRO͕༗Δ߹• ύέοτΛ݁߹͔ͯ͠ΒωοτϫʔΫελοΫΛ࣮ߦɺωοτϫʔΫελοΫͷ࣮ߦճΛݮseq 10000 seq 10001 seq 10002 seq 10003←1500bytes→To network stackbig one packet
GROͷޮՌ• Intel 82599(ixgbe)Ͱൺֱ • MultiQueueແޮԽ • iperfͷTCPϞʔυͰܭଌ • ethtool -K ix0 gro offpackets network stackcalled countthroughput CPU%(sy+si)ແޮ 632139 pkt/s 632139 call/s 7.30 Gbps 97.6%༗ޮ 712387 pkt/s 47957 call/s 8.25 Gbps 79.6%
TSO(TCP Segmentation Offload)• LROͷٯ • ύέοτΛϑϥάϝϯτԽͤͣʹૹ৴ NIC͕ύέοτΛMTUαΠζʹׂ • OSύέοτׂॲཧΛলུग़དྷΔ • LinuxͰιϑτΣΞʹΑΔGSOɺ ϋʔυΣΞʹΑΔTSOʗUFOΛαϙʔτ
TSOͷޮՌ• Intel 82599(ixgbe)Ͱൺֱ • MultiQueueແޮԽ • iperfͷTCPϞʔυͰܭଌ • ethtool -K ix0 gso off tso offpackets throughput CPU%(sy+si)ແޮ 247794 pkt/s 2.87 Gbps 53.5%༗ޮ 713127 pkt/s 8.16 Gbps 26.8%
3.ෳͷCPUͰύέοτॲཧ͍ͨ͠cpu0Process(User)Process(Kernel)HW Intr HandlerSW Intr HandlerׂΓࠐΈແޮԽϓϩτίϧॲཧιέοτड৴ॲཧϢʔβϓϩάϥϜVTFSCV⒎FSsocketqueueύέοτγεςϜίʔϧϓϩηεىচϋʔυΣΞׂΓࠐΈϢʔβۭؒίϐʔύέοτύέοτιϑτΣΞׂΓࠐΈεέδϡʔϧύέοτड৴ύέοτ͕ແ͘ͳΔ·Ͱ܁Γฦ͠cpu1Process(User)Process(Kernel)HW Intr HandlerSW Intr HandlerׂΓࠐΈແޮԽϓϩτίϧॲཧιέοτड৴ॲཧϢʔβϓϩάϥϜVTFSCV⒎FSsocketqueueύέοτγεςϜίʔϧϓϩηεىচϋʔυΣΞׂΓࠐΈϢʔβۭؒίϐʔύέοτύέοτιϑτΣΞׂΓࠐΈεέδϡʔϧύέοτड৴ύέοτ͕ແ͘ͳΔ·Ͱ܁Γฦ͠
ιϑτׂΓࠐΈ͕̍ͭͷίΞʹภΔ
ιϑτׂΓࠐΈͱʁProcess(User)Process(Kernel)HW Intr HandlerSW Intr HandlerׂΓࠐΈແޮԽϓϩτίϧॲཧιέοτड৴ॲཧϢʔβϓϩάϥϜVTFSCV⒎FSsocketqueueύέοτγεςϜίʔϧϓϩηεىচϋʔυΣΞׂΓࠐΈϢʔβۭؒίϐʔύέοτύέοτιϑτΣΞׂΓࠐΈεέδϡʔϧύέοτड৴ύέοτ͕ແ͘ͳΔ·Ͱ܁Γฦ͠ϙʔϦϯά͔Β ϓϩτίϧॲཧ·Ͱ →ωοτϫʔΫIOͷେ෦
ԿނภΔʁιϑτׂΓࠐΈNICͷׂΓࠐΈ͕͔͔ͬͨCPU εέδϡʔϧ͞ΕΔ ˣ ϙʔϦϯά͔ΒϓϩτίϧελοΫͷ࣮ߦ·Ͱ ιϑτׂΓࠐΈͰ࣮ߦ͞ΕΔ ↓ NICͷׂΓࠐΈ͕͔͔͍ͬͯΔCPU͚ͩʹ ෛՙ͕͔͔Δ
ιϑτׂΓࠐΈ͕̍ͭͷίΞʹภͬͯੑೳ͕ग़ͳ͍• memcachedͳͲγϣʔτύέοτΛେྔʹࡹ͘ϫʔΫϩʔυͰݦࡏԽ • ιϑτΣΞׂΓࠐΈΛ࣮ߦ͍ͯ͠ΔCPU͕ϘτϧωοΫʹͳΓɺੑೳ͕εέʔϧ͠ͳ͘ͳΔ
ղܾํ๏• ύέοτΛෳͷCPUࢄ͔ͤͯ͞Βϓϩτίϧॲཧ͢ΔΈ͕͋Εྑ͍ • ୠ͠ɺTCPʹॱংอূ͕༗ΔͷͰฒྻʹॲཧ͞ΕΔͱύέοτͷฒ͠ʢϦΦʔμʣ͕ൃੜͯ͠ύϑΥʔϚϯε͕མͪΔ
TCP Reordering• γʔέϯεφϯόʔ௨ΓͷॱংͰύέοτ͕ண৴͍ͯ͠ΕॱʹόοϑΝίϐʔ͍͚ͯͩ͘͠ͰΑ͍͕…̍ ̍ protocolprocessinguser buffer
TCP Reordering̍ ̍ protocolprocessinguser bufferSFPSEFSRVFVF • ॱং͕ཚΕ͍ͯΔͱύέοτͷฒ͠ʢϦΦʔμʣ࡞ۀ͕ඞཁʹͳΔ
ղܾํ๏ʢଓʣ• ̍ͭͷϑϩʔ̍ͭͷCPUͰॲཧ͞ΕΔํ͕߹͕ྑ͍
RSSʢReceive Side Scalingʣ• CPU͝ͱʹผʑͷड৴ΩϡʔΛ࣋ͭNIC ʢMultiQueue NICͱݺΕΔʣ • ड৴Ωϡʔ͝ͱʹಠׂཱͨ͠ΓࠐΈΛ࣋ͭ • ಉ͡ϑϩʔʹଐ͢Δύέοτಉ͡Ωϡʔɺ ҟͳΔϑϩʔʹଐ͢ΔύέοτͳΔ͘ผͷΩϡʔࢄ ˠύέοτϔομͷϋογϡΛܭࢉ͢ΔࣄʹΑΓѼઌΩϡʔΛܾఆ
MSI-XׂΓࠐΈ• PCI ExpressͰαϙʔτ • σόΠε͋ͨΓ2048ݸͷIRQΛ࣋ͯΔ • ͦΕͧΕͷIRQͷׂΓࠐΈઌCPUΛબΔ ˠ1ͭͷNIC͕CPUίΞͷIRQΛ࣋ͯΔ
RSSʹΑΔύέοτৼΓ͚NICύέοτύέοτύέοτϋογϡܭࢉύέοτண৴hash queueσΟεύονࢀরRXQueue#0RXQueue#1RXQueue#2RXQueue#3cpu0 cpu1 cpu2 cpu3ड৴ॲཧׂΓࠐΈड৴ॲཧ■■01
Ωϡʔબͷखॱindirection_table[64] = initial_value input[12] = {src_addr, dst_addr, src_port, dst_port} key = toeplitz_hash(input, 12) index = key & 0x3f queue = indirection_table[index]
RSSಋೖલ
RSSಋೖޙ
RPS• RSSඇରԠͷΦϯϘʔυNICΛ͏·͔ͭͬͯ͘αʔόͷੑೳΛ্͍ͤͨ͞ • ιϑτͰRSSΛ࣮ͯ͠͠·͓͏ • ιϑτׂΓࠐΈͷஈ֊ͰύέοτΛ֤CPUΒ·͘ • CPUׂؒΓࠐΈΛͬͯଞͷCPUΛՔಈͤ͞Δ • RSSͷιϑτΤΞʹΑΔΤϛϡϨʔγϣϯ
cpu3cpu2cpu1cpu0ׂΓࠐΈແޮԽϓϩτίϧॲཧιέοτड৴ॲཧϢʔβϓϩάϥϜVTFSCV⒎FSsocketqueueύέοτγεςϜίʔϧϓϩηεىচϋʔυΣΞׂΓࠐΈϢʔβۭؒίϐʔύέοτύέοτιϑτΣΞׂΓࠐΈύέοτड৴ϋογϡܭࢉσΟεύονϓϩτίϧॲཧιέοτड৴ॲཧϢʔβϓϩάϥϜVTFSCV⒎FSsocketqueuebacklog#1hash queueࢀর■■01$16ׂؒΓࠐΈbacklog#2backlog#3
RPSͷ͍ํ# echo "f" > /sys/class/net/eth0/queues/rx-0/rps_cpus # echo 4096 > /sys/class/net/eth0/queues/rx-0/rps_flow_cnt
RPSಋೖલ
RPSಋೖޙ
RPS netperf resultnetperf benchmark result on lwn.net: e1000e on 8 core Intel Without RPS: 90K tps at 33% CPU With RPS: 239K tps at 60% CPU !foredeth on 16 core AMD Without RPS: 103K tps at 15% CPU With RPS: 285K tps at 49% CPU
RFS• ϓϩηεػೳΛRPSʹՃ
RFSϑϩʔʹׂΓͯΒΕͨΩϡʔ͕ѼઌϓϩηεͷCPUͱҟͳΔͱΦʔόϔου͕ൃੜ͢Δ
RFSϋογϡςʔϒϧͷઃఆΛมߋ͢ΔࣄͰCPUΛҰகͤ͞Δࣄ͕Ͱ͖Δ
RFSͷ͍ํ# echo "f" > /sys/class/net/eth0/queues/rx-0/rps_cpus # echo 4096 > /sys/class/net/eth0/queues/rx-0/rps_flow_cnt # echo 32768 > /proc/sys/net/core/rps_sock_flow_entries
RFS netperf resultnetperf benchmark result on lwn.net: e1000e on 8 core Intel No RFS or RPS 104K tps at 30% CPU No RFS (best RPS config): 290K tps at 63% CPU RFS 303K tps at 61% CPU !RPC test tps CPU% 50/90/99% usec latency StdDev No RFS or RPS 103K 48% 757/900/3185 4472.35 RPS only: 174K 73% 415/993/2468 491.66 RFS 223K 73% 379/651/1382 315.61
Accelerated RFS• RFSΛMultiQueue NICͰ࣮ݱ͢ΔͨΊͷNICυϥΠό֦ு • Linux kernelϓϩηεͷ࣮ߦதCPUΛNICυϥΠόʹ௨ • NICυϥΠό௨Λड͚ͯϑϩʔͷΩϡʔׂΓͯΛߋ৽
Receive Side Scalingͷ੍ݶ• 32bitͷϋογϡΛͦͷ··༻͍ͯ͠Εϋογϡিಥ͠ʹ͍͕͘ɺIndirection Table͕খ͍͞ͷͰগͳ͍ϏοτͰindexΛϚεΫ͍ͯ͠Δ ˠϑϩʔ͕ଟ͍࣌ʹϋογϡিಥ͢Δ • Accelerated RFSʹෆ͖
Flow Steering• ϑϩʔͱΩϡʔͷରԠใΛهԱ 4tupleɿΩϡʔ൪߸ͷΑ͏ͳܗࣜͰઃఆ • RSSͷΑ͏ͳ໌֬ͳڞ௨༷ແ͍͕ɺ֤ࣾͷ10GbEʹ࣮͞Ε͍ͯΔ • Accelerated RFSFlow SteeringΛલఏͱ͍ͯ͠Δ
Flow SteeringͰखಈϑΟϧλઃఆ# ethtool --config-nfc ix00 flow-type tcp4src-ip 10.0.0.1 dst-ip 10.0.0.2 src-port 10000dst-port 10001 action 6 Added rule with ID 2045
XPS• MultiQueue NICૹ৴Ωϡʔෳ͍࣋ͬͯΔ • XPSCPUͱૹ৴ΩϡʔͷׂΓͯΛܾΊΔΠϯλϑΣʔε
XPSͷ͍ํ# echo 1 > /sys/class/net/eth0/queues/tx-0/xps_cpus # echo 2 > /sys/class/net/eth0/queues/tx-1/xps_cpus # echo 4 > /sys/class/net/eth0/queues/tx-2/xps_cpus # echo 8 > /sys/class/net/eth0/queues/tx-3/xps_cpus
4.σʔλҠಈʹ͏ϨΠςϯγͷݮ
σʔλҠಈʹ͏ϨΠςϯγͷݮ• ϓϩτίϧॲཧΑΓΉ͠ΖNIC㲗ϝϞϦ㲗CPUΩϟογϡͷؒͰͷσʔλҠಈʹ͏Φʔόϔουͷํ͕ॏ͍έʔε͕͋Δ • ಛʹϝϞϦΞΫηε͕
Intel Data Direct I/OTechnology• NIC͕DMAͨ͠ύέοτͷσʔλɺ࠷ॳʹCPU͕ΞΫηεͨ࣌͠ʹඞͣΩϟογϡώοτϛεΛى͜͢ ɹɹɹɹɹɹɹɹɹˣ • CPUͷLLCʢࡾ࣍ΩϟογϡʣʹDMAͯ͠͠·͑ʂ • ৽͍͠XeonͱIntel 10GbEͰαϙʔτ • OSରԠෆཁʢHW͕ಁաతʹఏڙ͢Δػೳʣ
ίϐʔ͕ॏ͍Process(User)Process(Kernel)HW Intr HandlerSW Intr Handlerύέοτड৴ϓϩτίϧॲཧιέοτड৴ॲཧϢʔβϓϩάϥϜVTFSCV⒎FSinputqueuesocketqueueύέοτγεςϜίʔϧϓϩηεىচιϑτΣΞׂΓࠐΈεέδϡʔϧϋʔυΣΞׂΓࠐΈϢʔβۭؒίϐʔ
ίϐʔ͕ॏ͍͕θϩίϐʔԽࠔ• NICͷDMAόοϑΝΩϡʔຖʹઃఆͰ͖Δ͕ϑϩʔຖͰͳ͍ ˠͦͦΩϡʔΛҰͭͷΞϓϦͰઐ༗ग़དྷΔલఏͰͳ͍ͱແཧ • όοϑΝ͕ϖʔδαΠζʹΞϥΠϯɾΞϩέʔτ͞Εͯͳ͍ͱແཧ • ύέοτϔομͱϖΠϩʔυ͕͞Εͯͳ͍ͱόοϑΝʹύέοτϔομ·Ͱॻ͔Εͯ͠·͏
• ʢIntel I/O ATͱݺΕΔʣ • NICͷόοϑΝˠΞϓϦέʔγϣϯͷόοϑΝDMAసૹ • CPUෛՙΛݮ • νοϓηοτʹ࣮ • CONFIG_NET_DMA=y in LinuxIntel QuickData Technology
5.ϓϩτίϧελοΫΛܦ༝͠ͳ͍ωοτϫʔΫIO
ϓϩτίϧελοΫΛܦ༝͠ͳ͍ωοτϫʔΫIO• ϓϩτίϧॲཧΛ͢ΔඞཁSocket APIͰ͋Δඞཁແ͍ͳΒɺωοτϫʔΫIOͬͱ͘ग़དྷΔ • ಛఆ༻్͚ • ϓϩτίϧॲཧΛඞཁͱ͠ͳ͍ΞϓϦέʔγϣϯ ˠsnortɺOpenvSwitchͳͲ • ϓϩτίϧॲཧΛࣗલͰߦͳͬͯͰੑೳΛ্͍͛ͨΞϓϦέʔγϣϯ
جຊతͳΈ• ઐ༻NICυϥΠόͱઐ༻ϥΠϒϥϦΛ༻͍ͯɺNICͷड৴όοϑΝΛMMAP • ύέοτΛϙʔϦϯά • ΞϓϦݻ༗ͷύέοτʹର͢ΔॲཧΛ࣮ߦNICRX1 RX2 RX3Kernel DriverAppRX1 RX2 RX3MMAP1BDLFUTPollingDo somework
RAWιέοτɾBPFͱͷҧ͍ʁ• θϩίϐʔ͕جຊ • ϚϧνΩϡʔͷड৴όοϑΝΛͦͷ··ϢʔβϥϯυʹΤΫεϙʔτ͍ͯ͠Δ • ↑ʹΑΓɺϚϧνεϨουੑೳ͕ߴ͍ ʢRAWιέοτɾBPFγϯάϧεϨουʣ • ্ड़ͷػೳΛ࣮ݱ͢ΔͨΊNICͷυϥΠόΛվ
Intel DPDK• ׂΓࠐΈΛΊͯϙʔϦϯάΛ༻͠Φʔόϔουݮ • ड৴όοϑΝʹHugePageΛ͏ࣄʹΑΓTLB missΛݮ • 64 byte packetͷL3ϑΥϫʔσΟϯάੑೳʢIntelࢿྉΑΓʣ • Linux network stackɿXeon E5645 x 2 → 12.2Mpps • DPDKɿXeon E5645 x 1 → 35.2Mpps • DPDK : Next generation Intel Processor x 1 → 80Mpps • OpenvSwitchରԠ • ରԠNICɿIntel
ྨࣅͷ࣮• PF_RING DNA ntopͷ࣮ɺLinux͚ libpcapαϙʔτ ରԠNICɿIntel • Netmap FreeBSD͚ͷ࣮ɺҰԠLinux൛͋Γ libpcap, OpenvSwitchαϙʔτ ରԠNICɿIntel, Realtek...
·ͱΊ• ߴͳωοτϫʔΫIOΛࡹͨ͘Ίʹ༷ʑͳվળ͕ߦΘΕ͍ͯΔࣄΛհ • ϋʔυΣΞɾιϑτΣΞͷ྆໘Ͱ࣮ͷݟ͕͠ཁٻ͞Ε͓ͯΓɺͦͷൣғωοτϫʔΫʹؔͳ͍Α͏ͳॴʹ·ͰٴͿ • औΓ͑ͣ໌͔Βग़དྷΔ͜ͱɿ ·ͣαʔόʹऔΓ͚ΔNICΛ ʮϚϧνΩϡʔNICʯʮRSSରԠʯʹ͠Α͏