Concurrency Bugsについての論文を読む

Concurrency Bugsについての論文を読む

4d42a62c859bd411625778b406c38c4d?s=128

keitatomozawa

January 25, 2020
Tweet

Transcript

  1. Concurrency Bugsについての 論文を読む 2020-01-25 Umeda.go 2020 Winter LT

  2. About me • twitter: @tomoz6o9 • freee株式会社 • Webアプリケーションエンジニア ◦

    RoR/React • GoはTour of Goをやったくらい
  3. 話すこと • “Understanding Real-World Concurrency Bugs in Go”という論文を読ん だと言う話 •

    “the morning paper”と言うサイトで紹介されているのが • misreading chat #73 で紹介されていたのを聞いたのがきっかけ • 詳しく知りたければ各サイトへGo
  4. どんな論文? • GoのConcurrency周りで人々がどのようなバグを犯しがちなのかの調査 ◦ 対象: Docker, K8s, etcdなど • 調査したバグをその性質、原因それぞれ2つに分類

  5. バグの性質 blocking bugs • goroutineが止まってしまい動か なくなる類のバグ non-blocking bugs • 処理自体は止まらないが、そも

    そも意図しない動きになってしま う類のバグ
  6. バグの原因 misuse of message passing • channelが原因のバグ misuse of shared

    memory • Mutex, RWMutex, WaitGroup などが原因のバグ
  7. 結論 message passing shared memory Total blocking 49 36 85

    non-blocking 17 69 86 Total 66 105 171
  8. Blocking × shared memory • Goだからというよりは、いわゆる一般的なプログラミング言語と同じような 過ちが原因のバグ ◦ Mutex, RWMutexでデッドロックとか

    • WaitGroup起因のものはGo独特
  9. Non-blocking × shared memory • これもやはり一般的なプログラミング言語と同じような過ちが多い ◦ 論文内で “traditional” とされているもので50個ほど

    • 残りは大別して以下の二つ ◦ goroutineに渡す匿名関数内での変数スコープの誤りなど ◦ WaitGroup関連
  10. WaitGroupに関するバグ Waitする場所間違えて 動かなくなる Addする場所間違えて すりぬける

  11. Blocking × message passing • Channel周りは気をつけよう • 例えば ◦ goroutineからchannel経由でmessageを受け取り後続の処理へ

    ◦ selectなどでtimeout処理をしたらgoroutineはchanに書き込める? ◦ →適切にBuffered Channelを使ったりする
  12. Non-blocking × message passing • 少ないものの存在(例:close chan twice) • channelの性質上正しく使えてない場合はblockingとして現れることが多

    いことを考えると、正しく使いこなせればよりエラーを起こしにくい仕組みで あると言えるようだ。
  13. まとめ • 他の言語でも気をつけなければいけないところはしっかり気をつけよう • WaitGroupもケアした方がよさそう • channelは挙動をちゃんと理解してつかおう

  14. thanks