Concurrency Bugsについての論文を読む
by
keitatomozawa
×
Copy
Open
Link
Embed
Share
Beginning
This slide
Copy link URL
Copy link URL
Copy iframe embed code
Copy iframe embed code
Copy javascript embed code
Copy javascript embed code
Share
Tweet
Share
Tweet
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