SlideShare ist ein Scribd-Unternehmen logo
1 von 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/
参考資料

Weitere ähnliche Inhalte

Was ist angesagt?

Was ist angesagt? (20)

Master Canary Forging: 新しいスタックカナリア回避手法の提案 by 小池 悠生 - CODE BLUE 2015
Master Canary Forging: 新しいスタックカナリア回避手法の提案 by 小池 悠生 - CODE BLUE 2015Master Canary Forging: 新しいスタックカナリア回避手法の提案 by 小池 悠生 - CODE BLUE 2015
Master Canary Forging: 新しいスタックカナリア回避手法の提案 by 小池 悠生 - CODE BLUE 2015
 
単なるキャッシュじゃないよ!?infinispanの紹介
単なるキャッシュじゃないよ!?infinispanの紹介単なるキャッシュじゃないよ!?infinispanの紹介
単なるキャッシュじゃないよ!?infinispanの紹介
 
BuildKitによる高速でセキュアなイメージビルド
BuildKitによる高速でセキュアなイメージビルドBuildKitによる高速でセキュアなイメージビルド
BuildKitによる高速でセキュアなイメージビルド
 
UEFIベアメタルプログラミング
UEFIベアメタルプログラミングUEFIベアメタルプログラミング
UEFIベアメタルプログラミング
 
eStargzイメージとlazy pullingによる高速なコンテナ起動
eStargzイメージとlazy pullingによる高速なコンテナ起動eStargzイメージとlazy pullingによる高速なコンテナ起動
eStargzイメージとlazy pullingによる高速なコンテナ起動
 
C++ マルチスレッドプログラミング
C++ マルチスレッドプログラミングC++ マルチスレッドプログラミング
C++ マルチスレッドプログラミング
 
30分で分かる!OSの作り方
30分で分かる!OSの作り方30分で分かる!OSの作り方
30分で分かる!OSの作り方
 
いつやるの?Git入門
いつやるの?Git入門いつやるの?Git入門
いつやるの?Git入門
 
Xbyakの紹介とその周辺
Xbyakの紹介とその周辺Xbyakの紹介とその周辺
Xbyakの紹介とその周辺
 
BuildKitの概要と最近の機能
BuildKitの概要と最近の機能BuildKitの概要と最近の機能
BuildKitの概要と最近の機能
 
AndroidとPCのみでスマート電球BLEハッキング
AndroidとPCのみでスマート電球BLEハッキングAndroidとPCのみでスマート電球BLEハッキング
AndroidとPCのみでスマート電球BLEハッキング
 
WASM(WebAssembly)入門 ペアリング演算やってみた
WASM(WebAssembly)入門 ペアリング演算やってみたWASM(WebAssembly)入門 ペアリング演算やってみた
WASM(WebAssembly)入門 ペアリング演算やってみた
 
3種類のTEE比較(Intel SGX, ARM TrustZone, RISC-V Keystone)
3種類のTEE比較(Intel SGX, ARM TrustZone, RISC-V Keystone)3種類のTEE比較(Intel SGX, ARM TrustZone, RISC-V Keystone)
3種類のTEE比較(Intel SGX, ARM TrustZone, RISC-V Keystone)
 
【Unite Tokyo 2018】さては非同期だなオメー!async/await完全に理解しよう
【Unite Tokyo 2018】さては非同期だなオメー!async/await完全に理解しよう【Unite Tokyo 2018】さては非同期だなオメー!async/await完全に理解しよう
【Unite Tokyo 2018】さては非同期だなオメー!async/await完全に理解しよう
 
Docker Compose 徹底解説
Docker Compose 徹底解説Docker Compose 徹底解説
Docker Compose 徹底解説
 
暗号技術の実装と数学
暗号技術の実装と数学暗号技術の実装と数学
暗号技術の実装と数学
 
マイクロサービスにおける 非同期アーキテクチャ
マイクロサービスにおける非同期アーキテクチャマイクロサービスにおける非同期アーキテクチャ
マイクロサービスにおける 非同期アーキテクチャ
 
今日からできる!簡単 .NET 高速化 Tips
今日からできる!簡単 .NET 高速化 Tips今日からできる!簡単 .NET 高速化 Tips
今日からできる!簡単 .NET 高速化 Tips
 
DXとかDevOpsとかのなんかいい感じのやつ 富士通TechLive
DXとかDevOpsとかのなんかいい感じのやつ 富士通TechLiveDXとかDevOpsとかのなんかいい感じのやつ 富士通TechLive
DXとかDevOpsとかのなんかいい感じのやつ 富士通TechLive
 
ARM CPUにおけるSIMDを用いた高速計算入門
ARM CPUにおけるSIMDを用いた高速計算入門ARM CPUにおけるSIMDを用いた高速計算入門
ARM CPUにおけるSIMDを用いた高速計算入門
 

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

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

Ähnlich wie 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にアップロードする錬金術
 
コミュニティのある風景
コミュニティのある風景コミュニティのある風景
コミュニティのある風景
 

Mehr von ota42y (7)

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はどうやって動いているのか

Hinweis der Redaktion

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