Submit Search
Upload
goroutineはどうやって動いているのか
•
2 likes
•
4,208 views
ota42y
Follow
https://shinjukurb.connpass.com/event/91172/ の発表資料です。
Read less
Read more
Engineering
Report
Share
Report
Share
1 of 34
Download Now
Download to read offline
Recommended
TRICK 2022 Results
TRICK 2022 Results
mametter
分散システムについて語らせてくれ
分散システムについて語らせてくれ
Kumazaki Hiroki
Protocol Buffers 入門
Protocol Buffers 入門
Yuichi Ito
テストとリファクタリングに関する深い方法論 #wewlc_jp
テストとリファクタリングに関する深い方法論 #wewlc_jp
kyon mm
マイクロにしすぎた結果がこれだよ!
マイクロにしすぎた結果がこれだよ!
mosa siru
Iocコンテナについて
Iocコンテナについて
Akio Terayama
事業が対峙する現実からエンジニアリングを俯瞰する #devlove
事業が対峙する現実からエンジニアリングを俯瞰する #devlove
Itsuki Kuroda
世界一わかりやすいClean Architecture - DroidKaigiバージョン
世界一わかりやすいClean Architecture - DroidKaigiバージョン
Atsushi Nakamura
More Related Content
What's hot
リーンなコードを書こう:実践的なオブジェクト指向設計
リーンなコードを書こう:実践的なオブジェクト指向設計
増田 亨
SQLアンチパターン メンター用資料
SQLアンチパターン メンター用資料
Hironori Miura
Java8でRDBMS作ったよ
Java8でRDBMS作ったよ
なおき きしだ
良い?悪い?コードコメントの書き方
良い?悪い?コードコメントの書き方
Shigenori Sagawa
それはYAGNIか? それとも思考停止か?
それはYAGNIか? それとも思考停止か?
Yoshitaka Kawashima
イミュータブルデータモデル(入門編)
イミュータブルデータモデル(入門編)
Yoshitaka Kawashima
オブジェクト指向できていますか?
オブジェクト指向できていますか?
Moriharu Ohzu
Akkaとは。アクターモデル とは。
Akkaとは。アクターモデル とは。
Kenjiro Kubota
解説!30分で分かるLEAN ANALYTICS
解説!30分で分かるLEAN ANALYTICS
しくみ製作所
本当は恐ろしい分散システムの話
本当は恐ろしい分散システムの話
Kumazaki Hiroki
オブジェクト指向エクササイズのススメ
オブジェクト指向エクササイズのススメ
Yoji Kanno
正規表現リテラルは本当に必要なのか?
正規表現リテラルは本当に必要なのか?
kwatch
がっつりMongoDB事例紹介
がっつりMongoDB事例紹介
Tetsutaro Watanabe
エンジニアの個人ブランディングと技術組織
エンジニアの個人ブランディングと技術組織
Takafumi ONAKA
MySQL 5.7にやられないためにおぼえておいてほしいこと
MySQL 5.7にやられないためにおぼえておいてほしいこと
yoku0825
フロー効率性とリソース効率性について #xpjug
フロー効率性とリソース効率性について #xpjug
Itsuki Kuroda
BigQueryで集計するシステムを作って分かったKPI集計ツール作成
BigQueryで集計するシステムを作って分かったKPI集計ツール作成
(shibao)芝尾 (kouichiro)幸一郎
技術記事を書く&楽しむチームの作り方
技術記事を書く&楽しむチームの作り方
Takafumi ONAKA
Pythonによる黒魔術入門
Pythonによる黒魔術入門
大樹 小倉
2016/12/15 SQLチューニングと対戦格闘ゲームの類似性について語る。 JPOUG Advent Calendar 2016 Day 15
2016/12/15 SQLチューニングと対戦格闘ゲームの類似性について語る。 JPOUG Advent Calendar 2016 Day 15
歩 柴田
What's hot
(20)
リーンなコードを書こう:実践的なオブジェクト指向設計
リーンなコードを書こう:実践的なオブジェクト指向設計
SQLアンチパターン メンター用資料
SQLアンチパターン メンター用資料
Java8でRDBMS作ったよ
Java8でRDBMS作ったよ
良い?悪い?コードコメントの書き方
良い?悪い?コードコメントの書き方
それはYAGNIか? それとも思考停止か?
それはYAGNIか? それとも思考停止か?
イミュータブルデータモデル(入門編)
イミュータブルデータモデル(入門編)
オブジェクト指向できていますか?
オブジェクト指向できていますか?
Akkaとは。アクターモデル とは。
Akkaとは。アクターモデル とは。
解説!30分で分かるLEAN ANALYTICS
解説!30分で分かるLEAN ANALYTICS
本当は恐ろしい分散システムの話
本当は恐ろしい分散システムの話
オブジェクト指向エクササイズのススメ
オブジェクト指向エクササイズのススメ
正規表現リテラルは本当に必要なのか?
正規表現リテラルは本当に必要なのか?
がっつりMongoDB事例紹介
がっつりMongoDB事例紹介
エンジニアの個人ブランディングと技術組織
エンジニアの個人ブランディングと技術組織
MySQL 5.7にやられないためにおぼえておいてほしいこと
MySQL 5.7にやられないためにおぼえておいてほしいこと
フロー効率性とリソース効率性について #xpjug
フロー効率性とリソース効率性について #xpjug
BigQueryで集計するシステムを作って分かったKPI集計ツール作成
BigQueryで集計するシステムを作って分かったKPI集計ツール作成
技術記事を書く&楽しむチームの作り方
技術記事を書く&楽しむチームの作り方
Pythonによる黒魔術入門
Pythonによる黒魔術入門
2016/12/15 SQLチューニングと対戦格闘ゲームの類似性について語る。 JPOUG Advent Calendar 2016 Day 15
2016/12/15 SQLチューニングと対戦格闘ゲームの類似性について語る。 JPOUG Advent Calendar 2016 Day 15
Similar to goroutineはどうやって動いているのか
MF GeeksNight pplogの話
MF GeeksNight pplogの話
Naoto Koshikawa
なぜか技術書典5で 3サークルの運営を同時にやった話
なぜか技術書典5で 3サークルの運営を同時にやった話
ota42y
なぜか技術書典5で 3サークルの運営をやってた話
なぜか技術書典5で 3サークルの運営をやってた話
ota42y
Rails上でのpub/sub イベントハンドラの扱い
Rails上でのpub/sub イベントハンドラの扱い
ota42y
Git超入門
Git超入門
Shun Nishitsuji
JobScheduler Code Reading
JobScheduler Code Reading
Shinobu Okano
マイクロサービスにおける 結果整合性との戦い
マイクロサービスにおける 結果整合性との戦い
ota42y
「CodeYourRuby」で オープンなコードレビューを体験しよう
「CodeYourRuby」で オープンなコードレビューを体験しよう
中條 剛
Gitoriousをubuntu 10.04 LTSへインストール
Gitoriousをubuntu 10.04 LTSへインストール
Kiyoshi SATOH
メモリアロケーションからみた拡張ライブラリに大切なこと
メモリアロケーションからみた拡張ライブラリに大切なこと
Masaya TARUI
bootsnapはどれくらい早くなるのか
bootsnapはどれくらい早くなるのか
ota42y
Mruby and microcomputer_board
Mruby and microcomputer_board
Hara Yoshihiko
Rubyist started to learn Groovy - things important to leran new LL
Rubyist started to learn Groovy - things important to leran new LL
Uchio Kondo
HerokuでRails3.2 we love herokuの事例
HerokuでRails3.2 we love herokuの事例
Naoto Koshikawa
Groovy Grails eXchage 2014 報告
Groovy Grails eXchage 2014 報告
Tsuyoshi Yamamoto
とある Perl Monger の働き方
とある Perl Monger の働き方
Yusuke Wada
5人と5万円で 2人が救えた話
5人と5万円で 2人が救えた話
Mahito Ogura
5分で資料作ってSlideShareにアップロードする錬金術
5分で資料作ってSlideShareにアップロードする錬金術
Shinobu Okano
コミュニティのある風景
コミュニティのある風景
Ryunosuke SATO
マイクロサービスにおける非同期アーキテクチャ
マイクロサービスにおける非同期アーキテクチャ
ota42y
Similar to goroutineはどうやって動いているのか
(20)
MF GeeksNight pplogの話
MF GeeksNight pplogの話
なぜか技術書典5で 3サークルの運営を同時にやった話
なぜか技術書典5で 3サークルの運営を同時にやった話
なぜか技術書典5で 3サークルの運営をやってた話
なぜか技術書典5で 3サークルの運営をやってた話
Rails上でのpub/sub イベントハンドラの扱い
Rails上でのpub/sub イベントハンドラの扱い
Git超入門
Git超入門
JobScheduler Code Reading
JobScheduler Code Reading
マイクロサービスにおける 結果整合性との戦い
マイクロサービスにおける 結果整合性との戦い
「CodeYourRuby」で オープンなコードレビューを体験しよう
「CodeYourRuby」で オープンなコードレビューを体験しよう
Gitoriousをubuntu 10.04 LTSへインストール
Gitoriousをubuntu 10.04 LTSへインストール
メモリアロケーションからみた拡張ライブラリに大切なこと
メモリアロケーションからみた拡張ライブラリに大切なこと
bootsnapはどれくらい早くなるのか
bootsnapはどれくらい早くなるのか
Mruby and microcomputer_board
Mruby and microcomputer_board
Rubyist 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の事例
Groovy Grails eXchage 2014 報告
Groovy Grails eXchage 2014 報告
とある Perl Monger の働き方
とある Perl Monger の働き方
5人と5万円で 2人が救えた話
5人と5万円で 2人が救えた話
5分で資料作ってSlideShareにアップロードする錬金術
5分で資料作ってSlideShareにアップロードする錬金術
コミュニティのある風景
コミュニティのある風景
マイクロサービスにおける非同期アーキテクチャ
マイクロサービスにおける非同期アーキテクチャ
More from ota42y
Microservices Architecture の利点と欠点
Microservices Architecture の利点と欠点
ota42y
ruby-ffiについてざっくり解説
ruby-ffiについてざっくり解説
ota42y
FiNCでのOSSとのつきあい方
FiNCでのOSSとのつきあい方
ota42y
CarrieWaveについてざっくり解説
CarrieWaveについてざっくり解説
ota42y
prmdのドキュメントが読みやすくなる話
prmdのドキュメントが読みやすくなる話
ota42y
身近なサイバー攻撃から身を守る
身近なサイバー攻撃から身を守る
ota42y
HCI分野の紹介と最新研究
HCI分野の紹介と最新研究
ota42y
More from ota42y
(7)
Microservices Architecture の利点と欠点
Microservices Architecture の利点と欠点
ruby-ffiについてざっくり解説
ruby-ffiについてざっくり解説
FiNCでのOSSとのつきあい方
FiNCでのOSSとのつきあい方
CarrieWaveについてざっくり解説
CarrieWaveについてざっくり解説
prmdのドキュメントが読みやすくなる話
prmdのドキュメントが読みやすくなる話
身近なサイバー攻撃から身を守る
身近なサイバー攻撃から身を守る
HCI分野の紹介と最新研究
HCI分野の紹介と最新研究
goroutineはどうやって動いているのか
1.
ota42y 2018/06/26 Shinjuku.rb #62 goroutineは どうやって動いているのか
2.
• ota42y • サーバサイドエンジニア •
rubyとかrustとかgoとかC++とか • Twitter、github → ota42y • 技術書典4でマイクロサービス本を出した – https://ota42y.com/blog/2018/04/10/mi croservices_yorozu_book/ 自己紹介
3.
goroutine
4.
• go func
で関数を非同期にする凄いヤツ • 簡単すぎて内部で何をやっているか謎 →内でどう動いているか調べた goroutine
5.
• goroutineはプロセッサ数に応じて適切に 分散されて動く • スレッドを作りすぎないよう上手くやる •
基本はwork-stealingアルゴリズム 結論
6.
goroutineは何をするか
7.
• このコード goroutine開始時
8.
• こんな感じになる • newprocに関数を渡してそう •
newprocはnewproc1をほぼ読んでるだけ • `go` の中身はnewproc1っぽい goroutine開始時
9.
newproc1
10.
newproc1 (´・_・`)
11.
Design doc • スケジューラのDesign
docがある – https://golang.org/s/go11sched – おそらくgo 1.1? • 大きくは変わって無さそうなので適応できる
12.
goroutineのスケジューラー • 登場人物は3つ – P •
Processor – M • Thread – G • gorutineに渡された関数
13.
goroutineのスケジューラー • 登場人物は3つ – P •
Gを処理していくプロセッサ • GOMAXPROCSの数だけPがある – M • 特定のPに紐付いている – G
14.
goroutineの登録 G P M G Gは発行されると キューに入る head
15.
goroutineの登録 G P G M PはGを取り出してMに くっつけて実行する head
16.
goroutineの登録 G P M G PはGを取り出してMに くっつけて実行する head
17.
goroutineの登録 G P M G M Mが待ちになるとPは 別のMを処理する (syscallとかロックとか) head
18.
goroutineの登録 P M G M G Mが待ちになるとPは 別のMを処理する (syscallとかロックとか) head
19.
goroutineのスケジュール
20.
goroutineのスケジュール G P M G G P M 複数Pが存在する場合 head
21.
goroutineのスケジュール G P M G G P M 複数Pが存在する場合 →デッドロックが起きる 並列数を増やしても性 能を上げられない head
22.
goroutineのスケジュール G P M G P M Pごとにキューを持つ GG
23.
goroutineのスケジュール G P M G P M Pごとにキューを用意 →自分のキューから取る ことでデッドロック回避GG
24.
goroutineのスケジュール G P M G P M P間でGの量に差が出る あるPは急がしいが 別のPは暇の場合がある 適切な負荷分散が必要
25.
work-stealing
26.
• 暇なworkerが、別のworkerからjobを stealする(盗む)アルゴリズム • 中央の管理者無しで良い感じにjobが分散 するらしい •
別workerへのアクセス回数が少なく 競合が発生しにくい work-stealing
27.
work-stealing G P M G P M キューからGが無くなる
28.
work-stealing G P M G P M キューからGが無くなる 別Pのキューにアクセス
29.
work-stealing G P M G P M キューからGが無くなる 別Pのキューにアクセス 中身を半分奪う
30.
work-stealing G P M G P M 普段は自キューを使う →デッドロック回避 空になったときだけ奪う →他キューへのアクセス は少ない
31.
work-stealing G P M G P M キューがあふれたときに 半分globalキューに詰む globalキューは両端キュー 先にglobalキューから stealする G
32.
• goroutineは関数をキューに積むだけ • スケジューラがプロセッサ数に応じて適 切に分散される •
基本はwork-stealingアルゴリズム • スレッドも良い感じに使い回す まとめ
33.
• 両端キューではなく片側キューを使ってる – タブンネ –
両端キューだとより性能が良いはず • 先頭から取り出して後ろから盗む • headを触るのはその所有者のPのみ – キューの実装が循環キューなのが関係している? • メモリ消費かも(両端キューのほうが消費量多いはず) • Pを移動するさいのメモリの扱いとか – もうちょっとdeepに踏み込むのが必要そう わかんなかったこと
34.
• https://golang.org/s/go11sched • https://github.com/golang/go/blob/0 a7ac93c27c9ade79fe0f66ae0bb81484 c241ae5/src/runtime/proc.go •
https://rakyll.org/scheduler/ 参考資料
Editor's Notes
この中に、マイクロサービスアーキテクチャを知ってる人どれくらいいますか? ありがとうございます、以外と少なくて資料作った会がありました…
Download Now