bench_test.go 2.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108
  1. // Copyright (c) Tailscale Inc & AUTHORS
  2. // SPDX-License-Identifier: BSD-3-Clause
  3. // Create two wgengine instances and pass data through them, measuring
  4. // throughput, latency, and packet loss.
  5. package main
  6. import (
  7. "fmt"
  8. "testing"
  9. "time"
  10. "tailscale.com/types/logger"
  11. )
  12. func BenchmarkTrivialNoAlloc(b *testing.B) {
  13. run(b, setupTrivialNoAllocTest)
  14. }
  15. func BenchmarkTrivial(b *testing.B) {
  16. run(b, setupTrivialTest)
  17. }
  18. func BenchmarkBlockingChannel(b *testing.B) {
  19. run(b, setupBlockingChannelTest)
  20. }
  21. func BenchmarkNonblockingChannel(b *testing.B) {
  22. run(b, setupNonblockingChannelTest)
  23. }
  24. func BenchmarkDoubleChannel(b *testing.B) {
  25. run(b, setupDoubleChannelTest)
  26. }
  27. func BenchmarkUDP(b *testing.B) {
  28. run(b, setupUDPTest)
  29. }
  30. func BenchmarkBatchTCP(b *testing.B) {
  31. run(b, setupBatchTCPTest)
  32. }
  33. func BenchmarkWireGuardTest(b *testing.B) {
  34. b.Skip("https://github.com/tailscale/tailscale/issues/2716")
  35. run(b, func(logf logger.Logf, traf *TrafficGen) {
  36. setupWGTest(b, logf, traf, Addr1, Addr2)
  37. })
  38. }
  39. type SetupFunc func(logger.Logf, *TrafficGen)
  40. func run(b *testing.B, setup SetupFunc) {
  41. sizes := []int{
  42. ICMPMinSize + 8,
  43. ICMPMinSize + 100,
  44. ICMPMinSize + 1000,
  45. }
  46. for _, size := range sizes {
  47. b.Run(fmt.Sprintf("%d", size), func(b *testing.B) {
  48. runOnce(b, setup, size)
  49. })
  50. }
  51. }
  52. func runOnce(b *testing.B, setup SetupFunc, payload int) {
  53. b.StopTimer()
  54. b.ReportAllocs()
  55. var logf logger.Logf = b.Logf
  56. if !testing.Verbose() {
  57. logf = logger.Discard
  58. }
  59. traf := NewTrafficGen(b.StartTimer)
  60. setup(logf, traf)
  61. logf("initialized. (n=%v)", b.N)
  62. b.SetBytes(int64(payload))
  63. traf.Start(Addr1.Addr(), Addr2.Addr(), payload, int64(b.N))
  64. var cur, prev Snapshot
  65. var pps int64
  66. i := 0
  67. for traf.Running() {
  68. i += 1
  69. time.Sleep(10 * time.Millisecond)
  70. if (i % 100) == 0 {
  71. prev = cur
  72. cur = traf.Snap()
  73. d := cur.Sub(prev)
  74. if prev.WhenNsec != 0 {
  75. logf("%v @%7d pkt/sec", d, pps)
  76. }
  77. }
  78. pps = traf.Adjust()
  79. }
  80. cur = traf.Snap()
  81. d := cur.Sub(prev)
  82. loss := float64(d.LostPackets) / float64(d.RxPackets)
  83. b.ReportMetric(loss*100, "%lost")
  84. }