Skip to content

Commit cda7390

Browse files
committed
goapcket生成包应该不支持并发,并发之后性能下降很多
1 parent 29523a2 commit cda7390

File tree

6 files changed

+188
-25
lines changed

6 files changed

+188
-25
lines changed

log/logger.go

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -10,24 +10,24 @@ func init() {
1010
}
1111

1212
func Print(v ...interface{}) {
13-
logger.Print(v)
13+
logger.Print(v...)
1414
}
1515
func Println(v ...interface{}) {
16-
logger.Println(v)
16+
logger.Println(v...)
1717
}
1818

1919
func Panicf(formatString string, v ...interface{}) {
20-
logger.Panicf(formatString, v)
20+
logger.Panicf(formatString, v...)
2121
}
2222

2323
func Panic(v ...interface{}) {
24-
logger.Panic(v)
24+
logger.Panic(v...)
2525
}
2626

2727
func Fatal(v ...interface{}) {
28-
logger.Fatal(v)
28+
logger.Fatal(v...)
2929
}
3030

3131
func Fatalf(formatString string, v ...interface{}) {
32-
logger.Fatalf(formatString, v)
32+
logger.Fatalf(formatString, v...)
3333
}
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
package main
2+
3+
import "flow-generator/producer"
4+
5+
func main() {
6+
sfg := producer.SimpleFlowGenerator{}
7+
sfg.Init()
8+
sfg.Run()
9+
}
Lines changed: 139 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,139 @@
1+
package producer
2+
3+
import (
4+
"flag"
5+
"flow-generator/util"
6+
"fmt"
7+
"log"
8+
"time"
9+
10+
"github.com/google/gopacket"
11+
"github.com/google/gopacket/layers"
12+
"github.com/google/gopacket/pcap"
13+
)
14+
15+
type SimpleFlowGenerator struct {
16+
config map[string]string
17+
handler *pcap.Handle
18+
}
19+
20+
func (s *SimpleFlowGenerator) getOptions() {
21+
var nicName string
22+
flag.StringVar(&nicName, "i", "enp10s0", "the nic name used for sending packets.")
23+
24+
flag.Parse()
25+
s.config["i"] = nicName
26+
}
27+
28+
func (s *SimpleFlowGenerator) Init() {
29+
//init struct
30+
s.config = make(map[string]string, 0)
31+
//get options
32+
s.getOptions()
33+
34+
//init other
35+
s.initHandler()
36+
}
37+
38+
func (s *SimpleFlowGenerator) initHandler() {
39+
var (
40+
snapshotLen int32 = 65535
41+
promiscuous bool = false
42+
err error
43+
timeout time.Duration = 30 * time.Second
44+
nicName string
45+
)
46+
if v, ok := s.config["i"]; ok {
47+
nicName = v
48+
} else {
49+
log.Panic("nic name needed!")
50+
}
51+
52+
devices, err := pcap.FindAllDevs()
53+
if err != nil {
54+
log.Fatal(err)
55+
}
56+
57+
for _, value := range devices {
58+
//这里为了兼容win与linux,同时检查2个
59+
if value.Description == nicName || value.Name == nicName {
60+
//Open device
61+
s.handler, err = pcap.OpenLive(value.Name, snapshotLen, promiscuous, timeout)
62+
if err != nil {
63+
log.Fatal(err)
64+
}
65+
}
66+
fmt.Println(value.Description, value.Name)
67+
}
68+
69+
if s.handler == nil {
70+
log.Panicln("can not find nic:", nicName)
71+
}
72+
}
73+
74+
func (s *SimpleFlowGenerator) Run() {
75+
defer s.handler.Close()
76+
77+
var (
78+
buffer gopacket.SerializeBuffer
79+
options gopacket.SerializeOptions
80+
err error
81+
flowPackets int
82+
lys *randomPacketLayer
83+
)
84+
85+
// And create the packet with the layers
86+
buffer = gopacket.NewSerializeBuffer()
87+
88+
count := 0
89+
lastTime := time.Now()
90+
//loop
91+
for {
92+
flowPackets = util.RandomInt(6, 32)
93+
lys = randPktConfig()
94+
//gen a flow
95+
for flowPackets > 0 {
96+
//change content
97+
gopacket.SerializeLayers(buffer, options,
98+
lys.ether,
99+
lys.ipv4,
100+
lys.tcp,
101+
gopacket.Payload(util.RandomBytes(20)),
102+
)
103+
err = s.handler.WritePacketData(buffer.Bytes())
104+
if err != nil {
105+
log.Fatal(err)
106+
}
107+
//change flag
108+
if flowPackets == 1 {
109+
//the last of a flow
110+
lys.tcp.SYN = false
111+
lys.tcp.PSH = false
112+
lys.tcp.FIN = util.RandomBoolean() //have ending or not
113+
} else {
114+
lys.tcp.SYN = false
115+
lys.tcp.FIN = false
116+
lys.tcp.PSH = true
117+
}
118+
//count
119+
count++
120+
now := time.Now()
121+
if now.Sub(lastTime) > time.Second*1 {
122+
fmt.Println("pps:", count)
123+
lastTime = now
124+
count = 0
125+
}
126+
//
127+
flowPackets--
128+
129+
}
130+
131+
}
132+
}
133+
134+
func simpleRandomChangePacket(lys *randomPacketLayer) {
135+
lys.ipv4.SrcIP = util.RandomIPv4()
136+
lys.ipv4.DstIP = util.RandomIPv4()
137+
lys.tcp.SrcPort = layers.TCPPort(util.RandomPort())
138+
lys.tcp.DstPort = layers.TCPPort(util.RandomPort())
139+
}

producer/random_packet_generator.go

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -55,9 +55,10 @@ func (r *RandPktGenerator) Run() {
5555
wg.Wait()
5656
}
5757

58+
//TODO 增加worker的数量>=2的时候,吞吐量反而下降巨多,说明gopacket生成包对并发操作支持不好。
5859
func defaultConfig() map[string]int {
5960
return map[string]int{
60-
"default_worker_count": 10,
61+
"default_worker_count": 1,
6162
}
6263
}
6364

@@ -203,6 +204,8 @@ func (w *worker) Run() {
203204
logTicker := time.NewTicker(time.Second * 1)
204205
defer stopTicker.Stop()
205206
defer logTicker.Stop()
207+
208+
buffer := gopacket.NewSerializeBuffer()
206209
for w.runningStatus == WorkStatusRunning {
207210
select {
208211
case <-stopTicker.C:
@@ -211,12 +214,11 @@ func (w *worker) Run() {
211214
w.sts.CountClear()
212215
default: //do rand update
213216
randomChangePacket(w.tmplate)
214-
buffer := gopacket.NewSerializeBuffer()
215217
gopacket.SerializeLayers(buffer, gopacket.SerializeOptions{},
216218
w.tmplate.ether,
217219
w.tmplate.ipv4,
218220
w.tmplate.tcp,
219-
gopacket.Payload(util.RandomBytes(util.RandomInt(0, 1000))),
221+
gopacket.Payload(util.RandomBytes(util.RandomInt(0, 10))),
220222
)
221223
w.exportChan <- buffer.Bytes()
222224
w.sts.CountAdd()
@@ -303,6 +305,10 @@ func (s *sender) Run() {
303305
s.father.addWorker()
304306
log.Println("[sender]chan is not full,call father adding a worker")
305307
} else {
308+
//若只有一个worker,则不删除
309+
if len(s.father.workers) <= 1 {
310+
continue
311+
}
306312
s.father.removeWorker()
307313
log.Println("[sender]chan is full,call father removing a worker")
308314
}

test/go_gopkt_test.go

Lines changed: 24 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -3,14 +3,15 @@ package test
33
import (
44
"bytes"
55
"fmt"
6-
"github.com/google/gopacket"
7-
"github.com/google/gopacket/layers"
8-
"github.com/google/gopacket/pcap"
96
"log"
107
"math/rand"
118
"net"
129
"testing"
1310
"time"
11+
12+
"github.com/google/gopacket"
13+
"github.com/google/gopacket/layers"
14+
"github.com/google/gopacket/pcap"
1415
)
1516

1617
func TestUseGopacket(t *testing.T) {
@@ -30,7 +31,7 @@ func TestUseGopacket(t *testing.T) {
3031
}
3132

3233
for _, value := range devices {
33-
if value.Description == "Realtek Gaming GbE Family Controller" {
34+
if value.Description == "Realtek Gaming GbE Family Controller" || value.Name == "enp10s0" {
3435
//Open device
3536
handle, err = pcap.OpenLive(value.Name, snapshot_len, promiscuous, timeout)
3637
if err != nil {
@@ -39,6 +40,7 @@ func TestUseGopacket(t *testing.T) {
3940
}
4041
fmt.Println(value.Description, value.Name)
4142
}
43+
defer handle.Close()
4244
// Send raw bytes over wire
4345
data := "this is raw data in packets"
4446
data = ""
@@ -77,24 +79,31 @@ func TestUseGopacket(t *testing.T) {
7779
}
7880
// And create the packet with the layers
7981
buffer = gopacket.NewSerializeBuffer()
80-
gopacket.SerializeLayers(buffer, options,
81-
ethernetLayer,
82-
ipLayer,
83-
tcpLayer,
84-
gopacket.Payload(rawBytes),
85-
)
86-
outgoingPacket := buffer.Bytes()
82+
83+
count := 0
84+
lastTime := time.Now()
8785
for {
88-
time.Sleep(time.Second * 3)
89-
fmt.Println(handle)
90-
fmt.Println(len(outgoingPacket))
86+
gopacket.SerializeLayers(buffer, options,
87+
ethernetLayer,
88+
ipLayer,
89+
tcpLayer,
90+
gopacket.Payload(rawBytes),
91+
)
92+
outgoingPacket := buffer.Bytes()
93+
9194
err = handle.WritePacketData(outgoingPacket)
9295
if err != nil {
9396
log.Fatal(err)
9497
}
98+
count++
99+
now := time.Now()
100+
if now.Sub(lastTime) > time.Second*1 {
101+
fmt.Println("pps:", count)
102+
lastTime = now
103+
count = 0
104+
}
95105
}
96106

97-
handle.Close()
98107
}
99108

100109
func TestCountOx(t *testing.T) {

util/random.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ func RandomSequence() uint32 {
3131

3232
func RandomBoolean() bool {
3333
const N = 1 << 10
34-
return rand.Intn(N)-N/2 >= 0
34+
return rand.Intn(N) >= N/2
3535
}
3636

3737
func RandomString(n int) string {

0 commit comments

Comments
 (0)