goのメモリ使用

OSスレッドは基本メモリ2MBだけど、これはWaitGroupを作って待つだけのプログラムなら余裕の量だけど、数十万個だと足りない。
今回は、なぜかメモリの使用率が99%で張り付いてしまい、その原因を探った。

-raceフラグ

race detectorの一種。
これを使うと、共有されたメモリにアクセスしている処理を検出することができるけど。今回はこれではなかった。

channelの待受

原因はこれだった。 こんなコードを書いていたんだけど、

for {  
  select {
  case err := <-shutdownChan:
    c.Stop()
    return err
  case <-ctx.Done():
    c.Stop()
    err := errors.New("Cron stopped because context canceled.")
    sentry.CaptureErrorAndWait(err, nil)
    return err
  }
  default:
}

ここのdefaultが無限にコールされ続けることが原因だった。 だからdefaultを消せばこの問題は解決した。

そもそも、selectは何らかの処理が始まるまでまつので、for loopは不要。 だからちなみに、なにも関連付けられないselect{}は永久に待ち続ける。

for{}で囲むのは、何回も待つ必要があるときのみ。