Slide 1

Slide 1 text

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

Slide 2

Slide 2 text

About me ● twitter: @tomoz6o9 ● freee株式会社 ● Webアプリケーションエンジニア ○ RoR/React ● GoはTour of Goをやったくらい

Slide 3

Slide 3 text

話すこと ● “Understanding Real-World Concurrency Bugs in Go”という論文を読ん だと言う話 ● “the morning paper”と言うサイトで紹介されているのが ● misreading chat #73 で紹介されていたのを聞いたのがきっかけ ● 詳しく知りたければ各サイトへGo

Slide 4

Slide 4 text

どんな論文? ● GoのConcurrency周りで人々がどのようなバグを犯しがちなのかの調査 ○ 対象: Docker, K8s, etcdなど ● 調査したバグをその性質、原因それぞれ2つに分類

Slide 5

Slide 5 text

バグの性質 blocking bugs ● goroutineが止まってしまい動か なくなる類のバグ non-blocking bugs ● 処理自体は止まらないが、そも そも意図しない動きになってしま う類のバグ

Slide 6

Slide 6 text

バグの原因 misuse of message passing ● channelが原因のバグ misuse of shared memory ● Mutex, RWMutex, WaitGroup などが原因のバグ

Slide 7

Slide 7 text

結論 message passing shared memory Total blocking 49 36 85 non-blocking 17 69 86 Total 66 105 171

Slide 8

Slide 8 text

Blocking × shared memory ● Goだからというよりは、いわゆる一般的なプログラミング言語と同じような 過ちが原因のバグ ○ Mutex, RWMutexでデッドロックとか ● WaitGroup起因のものはGo独特

Slide 9

Slide 9 text

Non-blocking × shared memory ● これもやはり一般的なプログラミング言語と同じような過ちが多い ○ 論文内で “traditional” とされているもので50個ほど ● 残りは大別して以下の二つ ○ goroutineに渡す匿名関数内での変数スコープの誤りなど ○ WaitGroup関連

Slide 10

Slide 10 text

WaitGroupに関するバグ Waitする場所間違えて 動かなくなる Addする場所間違えて すりぬける

Slide 11

Slide 11 text

Blocking × message passing ● Channel周りは気をつけよう ● 例えば ○ goroutineからchannel経由でmessageを受け取り後続の処理へ ○ selectなどでtimeout処理をしたらgoroutineはchanに書き込める? ○ →適切にBuffered Channelを使ったりする

Slide 12

Slide 12 text

Non-blocking × message passing ● 少ないものの存在(例:close chan twice) ● channelの性質上正しく使えてない場合はblockingとして現れることが多 いことを考えると、正しく使いこなせればよりエラーを起こしにくい仕組みで あると言えるようだ。

Slide 13

Slide 13 text

まとめ ● 他の言語でも気をつけなければいけないところはしっかり気をつけよう ● WaitGroupもケアした方がよさそう ● channelは挙動をちゃんと理解してつかおう

Slide 14

Slide 14 text

thanks