func main() { var urls = flag.String("s", nats.DefaultURL, "The NATS server URLs (separated by comma)") var tls = flag.Bool("tls", false, "Use TLS secure sonnection") var numPubs = flag.Int("np", DefaultNumPubs, "Number of concurrent publishers") var numSubs = flag.Int("ns", DefaultNumSubs, "Number of concurrent subscribers") var numMsgs = flag.Int("n", DefaultNumMsgs, "Number of messages to publish") var async = flag.Bool("a", DefaultAsync, "Async message publishing") var messageSize = flag.Int("ms", DefaultMessageSize, "Message size in bytes.") var ignoreOld = flag.Bool("io", DefaultIgnoreOld, "Subscribers ignore old messages") var maxPubAcks = flag.Int("mpa", DefaultMaxPubAcksInflight, "Max number of published acks in flight") var clientID = flag.String("id", DefaultClientID, "Benchmark process base client ID") var csvFile = flag.String("csv", "", "Save bench data to csv file") log.SetFlags(0) flag.Usage = usage flag.Parse() args := flag.Args() if len(args) != 1 { usage() } // Setup the option block opts := nats.DefaultOptions opts.Servers = strings.Split(*urls, ",") for i, s := range opts.Servers { opts.Servers[i] = strings.Trim(s, " ") } opts.Secure = *tls benchmark = bench.NewBenchmark("NATS Streaming", *numSubs, *numPubs) var startwg sync.WaitGroup var donewg sync.WaitGroup donewg.Add(*numPubs + *numSubs) // Run Subscribers first startwg.Add(*numSubs) for i := 0; i < *numSubs; i++ { subID := fmt.Sprintf("%s-sub-%d", *clientID, i) go runSubscriber(&startwg, &donewg, opts, *numMsgs, *messageSize, *ignoreOld, subID) } startwg.Wait() // Now Publishers startwg.Add(*numPubs) pubCounts := bench.MsgsPerClient(*numMsgs, *numPubs) for i := 0; i < *numPubs; i++ { pubID := fmt.Sprintf("%s-pub-%d", *clientID, i) go runPublisher(&startwg, &donewg, opts, pubCounts[i], *messageSize, *async, pubID, *maxPubAcks) } log.Printf("Starting benchmark [msgs=%d, msgsize=%d, pubs=%d, subs=%d]\n", *numMsgs, *messageSize, *numPubs, *numSubs) startwg.Wait() donewg.Wait() benchmark.Close() fmt.Print(benchmark.Report()) if len(*csvFile) > 0 { csv := benchmark.CSV() ioutil.WriteFile(*csvFile, []byte(csv), 0644) fmt.Printf("Saved metric data in csv file %s\n", *csvFile) } }
func main() { var urls = flag.String("s", nats.DefaultURL, "The nats server URLs (separated by comma)") var tls = flag.Bool("tls", false, "Use TLS Secure Connection") var numConns = flag.Int("nc", DefaultNumConns, "Number of connections to use (default is publishers+subscribers)") var numPubs = flag.Int("np", DefaultNumPubs, "Number of Concurrent Publishers") var numSubs = flag.Int("ns", DefaultNumSubs, "Number of Concurrent Subscribers") var numMsgs = flag.Int("n", DefaultNumMsgs, "Number of Messages to Publish") var async = flag.Bool("a", DefaultAsync, "Async Message Publishing") var messageSize = flag.Int("ms", DefaultMessageSize, "Message Size in bytes.") var ignoreOld = flag.Bool("io", DefaultIgnoreOld, "Subscribers Ignore Old Messages") var maxPubAcks = flag.Int("mpa", DefaultMaxPubAcksInflight, "Max number of published acks in flight") var clientID = flag.String("id", DefaultClientID, "Benchmark process base client ID.") var csvFile = flag.String("csv", "", "Save bench data to csv file") var uniqueSubjs = flag.Bool("us", false, "Use unique subjects") var vb = flag.Bool("v", false, "Verbose") log.SetFlags(0) flag.Usage = usage flag.Parse() args := flag.Args() if len(args) != 1 { usage() } useUniqueSubjects = *uniqueSubjs verbose = *vb st = newSubTrack() // Setup the option block opts := nats.DefaultOptions opts.Servers = strings.Split(*urls, ",") for i, s := range opts.Servers { opts.Servers[i] = strings.Trim(s, " ") } opts.Secure = *tls opts.AsyncErrorCB = errorHandler opts.DisconnectedCB = disconnectedHandler opts.ReconnectedCB = reconnectedHandler opts.ClosedCB = closedHandler if err := buildConns(*numConns, &opts); err != nil { log.Fatalf("Unable to create connections: %v", err) } benchmark = bench.NewBenchmark("NATS Streaming", *numSubs, *numPubs) var startwg sync.WaitGroup var pubwg sync.WaitGroup var subwg sync.WaitGroup subwg.Add(*numSubs) pubwg.Add(*numPubs) // Run Subscribers first startwg.Add(*numSubs) for i := 0; i < *numSubs; i++ { subID := fmt.Sprintf("%s-sub-%d", *clientID, i) go runSubscriber(&startwg, &subwg, opts, *numMsgs, *messageSize, *ignoreOld, subID, getNextSubject(args[0], *numSubs)) } startwg.Wait() log.Printf("Starting scaling test [msgs=%d, msgsize=%d, pubs=%d, subs=%d]\n", *numMsgs, *messageSize, *numPubs, *numSubs) // Now Publishers startwg.Add(*numPubs) pubCounts := bench.MsgsPerClient(*numMsgs, *numPubs) for i := 0; i < *numPubs; i++ { pubID := fmt.Sprintf("%s-pub-%d", *clientID, i) go runPublisher(&startwg, &pubwg, opts, pubCounts[i], *messageSize, *async, pubID, *maxPubAcks, args[0], *numSubs) } startwg.Wait() pubwg.Wait() log.Println("Done publishing.") isFinished := st.printUnfinishedCount() // 10 mins is a long time to wait, but for stress tests see if they recover. for i := 0; i < 600 && !isFinished; i++ { st.printUnfinishedDetail(5) time.Sleep(1 * time.Second) isFinished = st.printUnfinishedCount() } subwg.Wait() benchmark.Close() fmt.Print(benchmark.Report()) if len(*csvFile) > 0 { csv := benchmark.CSV() ioutil.WriteFile(*csvFile, []byte(csv), 0644) fmt.Printf("Saved metric data in csv file %s\n", *csvFile) } }
func main() { var urls = flag.String("s", nats.DefaultURL, "The nats server URLs (separated by comma)") var tls = flag.Bool("tls", false, "Use TLS Secure Connection") var numPubs = flag.Int("np", DefaultNumPubs, "Number of Concurrent Publishers") var numSubs = flag.Int("ns", DefaultNumSubs, "Number of Concurrent Subscribers") var numMsgs = flag.Int("n", DefaultNumMsgs, "Number of Messages to Publish") var msgSize = flag.Int("ms", DefaultMessageSize, "Size of the message.") var csvFile = flag.String("csv", "", "Save bench data to csv file") log.SetFlags(0) flag.Usage = usage flag.Parse() args := flag.Args() if len(args) != 1 { usage() } // Setup the option block opts := nats.DefaultOptions opts.Servers = strings.Split(*urls, ",") for i, s := range opts.Servers { opts.Servers[i] = strings.Trim(s, " ") } opts.Secure = *tls benchmark = bench.NewBenchmark("NATS", *numSubs, *numPubs) var startwg sync.WaitGroup var donewg sync.WaitGroup donewg.Add(*numPubs + *numSubs) // Run Subscribers first startwg.Add(*numSubs) for i := 0; i < *numSubs; i++ { go runSubscriber(&startwg, &donewg, opts, *numMsgs, *msgSize) } startwg.Wait() // Now Publishers startwg.Add(*numPubs) pubCounts := bench.MsgsPerClient(*numMsgs, *numPubs) for i := 0; i < *numPubs; i++ { go runPublisher(&startwg, &donewg, opts, pubCounts[i], *msgSize) } log.Printf("Starting benchmark [msgs=%d, msgsize=%d, pubs=%d, subs=%d]\n", *numMsgs, *msgSize, *numPubs, *numSubs) startwg.Wait() donewg.Wait() benchmark.Close() fmt.Print(benchmark.Report()) if len(*csvFile) > 0 { csv := benchmark.CSV() ioutil.WriteFile(*csvFile, []byte(csv), 0644) fmt.Printf("Saved metric data in csv file %s\n", *csvFile) } }