runtime_test.go 1.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778
  1. package metrics
  2. import (
  3. "runtime"
  4. "testing"
  5. "time"
  6. )
  7. func BenchmarkRuntimeMemStats(b *testing.B) {
  8. r := NewRegistry()
  9. RegisterRuntimeMemStats(r)
  10. b.ResetTimer()
  11. for i := 0; i < b.N; i++ {
  12. CaptureRuntimeMemStatsOnce(r)
  13. }
  14. }
  15. func TestRuntimeMemStats(t *testing.T) {
  16. r := NewRegistry()
  17. RegisterRuntimeMemStats(r)
  18. CaptureRuntimeMemStatsOnce(r)
  19. zero := runtimeMetrics.MemStats.PauseNs.Count() // Get a "zero" since GC may have run before these tests.
  20. runtime.GC()
  21. CaptureRuntimeMemStatsOnce(r)
  22. if count := runtimeMetrics.MemStats.PauseNs.Count(); 1 != count-zero {
  23. t.Fatal(count - zero)
  24. }
  25. runtime.GC()
  26. runtime.GC()
  27. CaptureRuntimeMemStatsOnce(r)
  28. if count := runtimeMetrics.MemStats.PauseNs.Count(); 3 != count-zero {
  29. t.Fatal(count - zero)
  30. }
  31. for i := 0; i < 256; i++ {
  32. runtime.GC()
  33. }
  34. CaptureRuntimeMemStatsOnce(r)
  35. if count := runtimeMetrics.MemStats.PauseNs.Count(); 259 != count-zero {
  36. t.Fatal(count - zero)
  37. }
  38. for i := 0; i < 257; i++ {
  39. runtime.GC()
  40. }
  41. CaptureRuntimeMemStatsOnce(r)
  42. if count := runtimeMetrics.MemStats.PauseNs.Count(); 515 != count-zero { // We lost one because there were too many GCs between captures.
  43. t.Fatal(count - zero)
  44. }
  45. }
  46. func TestRuntimeMemStatsBlocking(t *testing.T) {
  47. if g := runtime.GOMAXPROCS(0); g < 2 {
  48. t.Skipf("skipping TestRuntimeMemStatsBlocking with GOMAXPROCS=%d\n", g)
  49. }
  50. ch := make(chan int)
  51. go testRuntimeMemStatsBlocking(ch)
  52. var memStats runtime.MemStats
  53. t0 := time.Now()
  54. runtime.ReadMemStats(&memStats)
  55. t1 := time.Now()
  56. t.Log("i++ during runtime.ReadMemStats:", <-ch)
  57. go testRuntimeMemStatsBlocking(ch)
  58. d := t1.Sub(t0)
  59. t.Log(d)
  60. time.Sleep(d)
  61. t.Log("i++ during time.Sleep:", <-ch)
  62. }
  63. func testRuntimeMemStatsBlocking(ch chan int) {
  64. i := 0
  65. for {
  66. select {
  67. case ch <- i:
  68. return
  69. default:
  70. i++
  71. }
  72. }
  73. }