SlideShare a Scribd company logo
1 of 34
ota42y
2018/06/26
Shinjuku.rb #62
goroutineは
どうやって動いているのか
• ota42y
• サーバサイドエンジニア
• rubyとかrustとかgoとかC++とか
• Twitter、github → ota42y
• 技術書典4でマイクロサービス本を出した
– https://ota42y.com/blog/2018/04/10/mi
croservices_yorozu_book/
自己紹介
goroutine
• go func で関数を非同期にする凄いヤツ
• 簡単すぎて内部で何をやっているか謎
→内でどう動いているか調べた
goroutine
• goroutineはプロセッサ数に応じて適切に
分散されて動く
• スレッドを作りすぎないよう上手くやる
• 基本はwork-stealingアルゴリズム
結論
goroutineは何をするか
• このコード
goroutine開始時
• こんな感じになる
• newprocに関数を渡してそう
• newprocはnewproc1をほぼ読んでるだけ
• `go` の中身はnewproc1っぽい
goroutine開始時
newproc1
newproc1
(´・_・`)
Design doc
• スケジューラのDesign docがある
– https://golang.org/s/go11sched
– おそらくgo 1.1?
• 大きくは変わって無さそうなので適応できる
goroutineのスケジューラー
• 登場人物は3つ
– P
• Processor
– M
• Thread
– G
• gorutineに渡された関数
goroutineのスケジューラー
• 登場人物は3つ
– P
• Gを処理していくプロセッサ
• GOMAXPROCSの数だけPがある
– M
• 特定のPに紐付いている
– G
goroutineの登録
G
P
M
G
Gは発行されると
キューに入る
head
goroutineの登録
G
P
G
M
PはGを取り出してMに
くっつけて実行する
head
goroutineの登録
G
P
M
G
PはGを取り出してMに
くっつけて実行する
head
goroutineの登録
G
P
M
G
M
Mが待ちになるとPは
別のMを処理する
(syscallとかロックとか)
head
goroutineの登録
P
M
G
M
G
Mが待ちになるとPは
別のMを処理する
(syscallとかロックとか)
head
goroutineのスケジュール
goroutineのスケジュール
G
P
M
G G
P
M
複数Pが存在する場合
head
goroutineのスケジュール
G
P
M
G G
P
M
複数Pが存在する場合
→デッドロックが起きる
並列数を増やしても性
能を上げられない
head
goroutineのスケジュール
G
P
M
G
P
M
Pごとにキューを持つ
GG
goroutineのスケジュール
G
P
M
G
P
M
Pごとにキューを用意
→自分のキューから取る
ことでデッドロック回避GG
goroutineのスケジュール
G
P
M
G
P
M
P間でGの量に差が出る
あるPは急がしいが
別のPは暇の場合がある
適切な負荷分散が必要
work-stealing
• 暇なworkerが、別のworkerからjobを
stealする(盗む)アルゴリズム
• 中央の管理者無しで良い感じにjobが分散
するらしい
• 別workerへのアクセス回数が少なく
競合が発生しにくい
work-stealing
work-stealing
G
P
M
G
P
M
キューからGが無くなる
work-stealing
G
P
M
G
P
M
キューからGが無くなる
別Pのキューにアクセス
work-stealing
G
P
M
G
P
M
キューからGが無くなる
別Pのキューにアクセス
中身を半分奪う
work-stealing
G
P
M
G
P
M
普段は自キューを使う
→デッドロック回避
空になったときだけ奪う
→他キューへのアクセス
は少ない
work-stealing
G
P
M
G
P
M
キューがあふれたときに
半分globalキューに詰む
globalキューは両端キュー
先にglobalキューから
stealする
G
• goroutineは関数をキューに積むだけ
• スケジューラがプロセッサ数に応じて適
切に分散される
• 基本はwork-stealingアルゴリズム
• スレッドも良い感じに使い回す
まとめ
• 両端キューではなく片側キューを使ってる
– タブンネ
– 両端キューだとより性能が良いはず
• 先頭から取り出して後ろから盗む
• headを触るのはその所有者のPのみ
– キューの実装が循環キューなのが関係している?
• メモリ消費かも(両端キューのほうが消費量多いはず)
• Pを移動するさいのメモリの扱いとか
– もうちょっとdeepに踏み込むのが必要そう
わかんなかったこと
• https://golang.org/s/go11sched
• https://github.com/golang/go/blob/0
a7ac93c27c9ade79fe0f66ae0bb81484
c241ae5/src/runtime/proc.go
• https://rakyll.org/scheduler/
参考資料

More Related Content

What's hot

プログラミングコンテストでの動的計画法
プログラミングコンテストでの動的計画法プログラミングコンテストでの動的計画法
プログラミングコンテストでの動的計画法
Takuya Akiba
 
大規模グラフアルゴリズムの最先端
大規模グラフアルゴリズムの最先端大規模グラフアルゴリズムの最先端
大規模グラフアルゴリズムの最先端
Takuya Akiba
 
勉強か?趣味か?人生か?―プログラミングコンテストとは
勉強か?趣味か?人生か?―プログラミングコンテストとは勉強か?趣味か?人生か?―プログラミングコンテストとは
勉強か?趣味か?人生か?―プログラミングコンテストとは
Takuya Akiba
 

What's hot (20)

新分野に飛び入って半年で業績を作るには
新分野に飛び入って半年で業績を作るには新分野に飛び入って半年で業績を作るには
新分野に飛び入って半年で業績を作るには
 
できる!並列・並行プログラミング
できる!並列・並行プログラミングできる!並列・並行プログラミング
できる!並列・並行プログラミング
 
色々なダイクストラ高速化
色々なダイクストラ高速化色々なダイクストラ高速化
色々なダイクストラ高速化
 
プログラミングコンテストでの動的計画法
プログラミングコンテストでの動的計画法プログラミングコンテストでの動的計画法
プログラミングコンテストでの動的計画法
 
強力なグラフィック機能を備えた組版処理システムTwightの開発
強力なグラフィック機能を備えた組版処理システムTwightの開発強力なグラフィック機能を備えた組版処理システムTwightの開発
強力なグラフィック機能を備えた組版処理システムTwightの開発
 
書くネタがCoqしかない
書くネタがCoqしかない書くネタがCoqしかない
書くネタがCoqしかない
 
新しい暗号技術
新しい暗号技術新しい暗号技術
新しい暗号技術
 
暗認本読書会12
暗認本読書会12暗認本読書会12
暗認本読書会12
 
トランザクションをSerializableにする4つの方法
トランザクションをSerializableにする4つの方法トランザクションをSerializableにする4つの方法
トランザクションをSerializableにする4つの方法
 
ARM CPUにおけるSIMDを用いた高速計算入門
ARM CPUにおけるSIMDを用いた高速計算入門ARM CPUにおけるSIMDを用いた高速計算入門
ARM CPUにおけるSIMDを用いた高速計算入門
 
OSS強化学習フレームワークの比較
OSS強化学習フレームワークの比較OSS強化学習フレームワークの比較
OSS強化学習フレームワークの比較
 
最小カットを使って「燃やす埋める問題」を解く
最小カットを使って「燃やす埋める問題」を解く最小カットを使って「燃やす埋める問題」を解く
最小カットを使って「燃やす埋める問題」を解く
 
Rolling hash
Rolling hashRolling hash
Rolling hash
 
イベント駆動プログラミングとI/O多重化
イベント駆動プログラミングとI/O多重化イベント駆動プログラミングとI/O多重化
イベント駆動プログラミングとI/O多重化
 
大規模グラフアルゴリズムの最先端
大規模グラフアルゴリズムの最先端大規模グラフアルゴリズムの最先端
大規模グラフアルゴリズムの最先端
 
C#とILとネイティブと
C#とILとネイティブとC#とILとネイティブと
C#とILとネイティブと
 
ConvNetの歴史とResNet亜種、ベストプラクティス
ConvNetの歴史とResNet亜種、ベストプラクティスConvNetの歴史とResNet亜種、ベストプラクティス
ConvNetの歴史とResNet亜種、ベストプラクティス
 
明日使えないすごいビット演算
明日使えないすごいビット演算明日使えないすごいビット演算
明日使えないすごいビット演算
 
勉強か?趣味か?人生か?―プログラミングコンテストとは
勉強か?趣味か?人生か?―プログラミングコンテストとは勉強か?趣味か?人生か?―プログラミングコンテストとは
勉強か?趣味か?人生か?―プログラミングコンテストとは
 
MagicOnion~C#でゲームサーバを開発しよう~
MagicOnion~C#でゲームサーバを開発しよう~MagicOnion~C#でゲームサーバを開発しよう~
MagicOnion~C#でゲームサーバを開発しよう~
 

Similar to goroutineはどうやって動いているのか

メモリアロケーションからみた拡張ライブラリに大切なこと
メモリアロケーションからみた拡張ライブラリに大切なことメモリアロケーションからみた拡張ライブラリに大切なこと
メモリアロケーションからみた拡張ライブラリに大切なこと
Masaya TARUI
 

Similar to goroutineはどうやって動いているのか (20)

MF GeeksNight pplogの話
MF GeeksNight pplogの話MF GeeksNight pplogの話
MF GeeksNight pplogの話
 
なぜか技術書典5で 3サークルの運営を同時にやった話
なぜか技術書典5で 3サークルの運営を同時にやった話なぜか技術書典5で 3サークルの運営を同時にやった話
なぜか技術書典5で 3サークルの運営を同時にやった話
 
なぜか技術書典5で 3サークルの運営をやってた話
なぜか技術書典5で 3サークルの運営をやってた話なぜか技術書典5で 3サークルの運営をやってた話
なぜか技術書典5で 3サークルの運営をやってた話
 
Rails上でのpub/sub イベントハンドラの扱い
Rails上でのpub/sub イベントハンドラの扱いRails上でのpub/sub イベントハンドラの扱い
Rails上でのpub/sub イベントハンドラの扱い
 
Git超入門
Git超入門Git超入門
Git超入門
 
JobScheduler Code Reading
JobScheduler Code ReadingJobScheduler Code Reading
JobScheduler Code Reading
 
マイクロサービスにおける 結果整合性との戦い
マイクロサービスにおける 結果整合性との戦いマイクロサービスにおける 結果整合性との戦い
マイクロサービスにおける 結果整合性との戦い
 
「CodeYourRuby」で オープンなコードレビューを体験しよう
「CodeYourRuby」で オープンなコードレビューを体験しよう「CodeYourRuby」で オープンなコードレビューを体験しよう
「CodeYourRuby」で オープンなコードレビューを体験しよう
 
Gitoriousをubuntu 10.04 LTSへインストール
Gitoriousをubuntu 10.04 LTSへインストールGitoriousをubuntu 10.04 LTSへインストール
Gitoriousをubuntu 10.04 LTSへインストール
 
メモリアロケーションからみた拡張ライブラリに大切なこと
メモリアロケーションからみた拡張ライブラリに大切なことメモリアロケーションからみた拡張ライブラリに大切なこと
メモリアロケーションからみた拡張ライブラリに大切なこと
 
bootsnapはどれくらい早くなるのか
bootsnapはどれくらい早くなるのかbootsnapはどれくらい早くなるのか
bootsnapはどれくらい早くなるのか
 
Mruby and microcomputer_board
Mruby and microcomputer_boardMruby and microcomputer_board
Mruby and microcomputer_board
 
omotesando.rb_20231005.pdf
omotesando.rb_20231005.pdfomotesando.rb_20231005.pdf
omotesando.rb_20231005.pdf
 
Rubyist started to learn Groovy - things important to leran new LL
Rubyist started to learn Groovy - things important to leran new LLRubyist started to learn Groovy - things important to leran new LL
Rubyist started to learn Groovy - things important to leran new LL
 
HerokuでRails3.2 we love herokuの事例
HerokuでRails3.2 we love herokuの事例HerokuでRails3.2 we love herokuの事例
HerokuでRails3.2 we love herokuの事例
 
Groovy Grails eXchage 2014 報告
Groovy Grails eXchage 2014 報告Groovy Grails eXchage 2014 報告
Groovy Grails eXchage 2014 報告
 
とある Perl Monger の働き方
とある Perl Monger の働き方とある Perl Monger の働き方
とある Perl Monger の働き方
 
5人と5万円で 2人が救えた話
5人と5万円で 2人が救えた話5人と5万円で 2人が救えた話
5人と5万円で 2人が救えた話
 
5分で資料作ってSlideShareにアップロードする錬金術
5分で資料作ってSlideShareにアップロードする錬金術5分で資料作ってSlideShareにアップロードする錬金術
5分で資料作ってSlideShareにアップロードする錬金術
 
コミュニティのある風景
コミュニティのある風景コミュニティのある風景
コミュニティのある風景
 

More from ota42y

CarrieWaveについてざっくり解説
CarrieWaveについてざっくり解説CarrieWaveについてざっくり解説
CarrieWaveについてざっくり解説
ota42y
 

More from ota42y (8)

Microservices Architecture の利点と欠点
Microservices Architecture の利点と欠点Microservices Architecture の利点と欠点
Microservices Architecture の利点と欠点
 
マイクロサービスにおける 非同期アーキテクチャ
マイクロサービスにおける非同期アーキテクチャマイクロサービスにおける非同期アーキテクチャ
マイクロサービスにおける 非同期アーキテクチャ
 
ruby-ffiについてざっくり解説
ruby-ffiについてざっくり解説ruby-ffiについてざっくり解説
ruby-ffiについてざっくり解説
 
FiNCでのOSSとのつきあい方
FiNCでのOSSとのつきあい方FiNCでのOSSとのつきあい方
FiNCでのOSSとのつきあい方
 
CarrieWaveについてざっくり解説
CarrieWaveについてざっくり解説CarrieWaveについてざっくり解説
CarrieWaveについてざっくり解説
 
prmdのドキュメントが読みやすくなる話
prmdのドキュメントが読みやすくなる話prmdのドキュメントが読みやすくなる話
prmdのドキュメントが読みやすくなる話
 
身近なサイバー攻撃から身を守る
身近なサイバー攻撃から身を守る身近なサイバー攻撃から身を守る
身近なサイバー攻撃から身を守る
 
HCI分野の紹介と最新研究
HCI分野の紹介と最新研究HCI分野の紹介と最新研究
HCI分野の紹介と最新研究
 

goroutineはどうやって動いているのか

Editor's Notes

  1. この中に、マイクロサービスアーキテクチャを知ってる人どれくらいいますか? ありがとうございます、以外と少なくて資料作った会がありました…