SlideShare a Scribd company logo
1 of 23
Gunosy.go#8
Package runtime
@yanap
Packages
• runtime
http://golang.org/pkg/runtime/
goroutineを制御する関数などランタイムシステムと対話できるパッケージで
す。また、reflectパッケージを利用した低レベルの型情報も扱ってます。
• runtime/cgo
http://golang.org/pkg/runtime/cgo/
GoからCの関数/型にアクセスするために用いるパッケージです。
cgoを使えば、GoからCのコードが呼べます。
• runtime/debug
http://golang.org/pkg/runtime/debug/
実行中のプログラムをデバッグするためのパッケージです。
Packages
• runtime/pprof
http://golang.org/pkg/runtime/pprof/
実行中のプログラムで時間がかかる部分を特定するのに使います。
https://code.google.com/p/gperftools/
• runtime/race
http://golang.org/pkg/runtime/race/
データのコンフリクトによってクラッシュした原因とかを調査するパッケージで
す。
http://golang.org/doc/articles/race_detector.html
go run –race hello.go
runtime / Constants
• クロスコンパイル
例えば、macでlinuxやwindows用にコンパイルできます。
% brew install go –cross-compile-all
• linux
% GOOS=linux GOARCH=amd64 go build hello.go
• windows
% GOOS=windows GOARCH=amd64 go build hello.go
runtime / func Breakpoint
• ブレイクポイントの例
http://play.golang.org/p/-l2BnhsGxZ
runtime/func BreakPoint
go run hello.go
SIGTRAP: trace trap
PC=0x266c1
goroutine 16 [running]:
runtime.breakpoint()
/usr/local/Cellar/go/1.3/libexec/src/pkg/runtime/asm_amd64.s:113 +0x1
fp=0x220832bed0 sp=0x220832bec8
runtime.Breakpoint()
/usr/local/Cellar/go/1.3/libexec/src/pkg/runtime/proc.c:2015 +0x1a fp=0x220832bed8
sp=0x220832bed0
main.main()
/Users/masahiroyanai/gocode/test_code/hello.go:9 +0x1e fp=0x220832bf50
sp=0x220832bed8
runtime.main()
/usr/local/Cellar/go/1.3/libexec/src/pkg/runtime/proc.c:247 +0x11a fp=0x220832bfa8
sp=0x220832bf50
runtime.goexit()
/usr/local/Cellar/go/1.3/libexec/src/pkg/runtime/proc.c:1445 fp=0x220832bfb0
sp=0x220832bfa8
created by _rt0_go
/usr/local/Cellar/go/1.3/libexec/src/pkg/runtime/asm_amd64.s:97 +0x120
goroutine 17 [runnable]:
runtime.MHeap_Scavenger()
/usr/local/Cellar/go/1.3/libexec/src/pkg/runtime/mheap.c:507
runtime.goexit()
/usr/local/Cellar/go/1.3/libexec/src/pkg/runtime/proc.c:1445
goroutine 18 [runnable]:
bgsweep()
/usr/local/Cellar/go/1.3/libexec/src/pkg/runtime/mgc0.c:1976
runtime.goexit()
/usr/local/Cellar/go/1.3/libexec/src/pkg/runtime/proc.c:1445
goroutine 19 [runnable]:
runfinq()
/usr/local/Cellar/go/1.3/libexec/src/pkg/runtime/mgc0.c:2606
runtime.goexit()
/usr/local/Cellar/go/1.3/libexec/src/pkg/runtime/proc.c:1445
rax 0x20817a120
rbx 0x208190180
rcx 0x20817a120
rdx 0x0
rdi 0x220817a000
rsi 0x208178160
rbp 0x0
rsp 0x220832bec8
r8 0x41
r9 0x16
r10 0x220832bdd8
r11 0x206
r12 0x8e98f1a0b590
r13 0x9326e5a20950
r14 0x1384cfc196147c00
r15 0x0
rip 0x266c1
rflags 0x202
cs 0x2b
fs 0x0
gs 0x8170000
exit status 2
runtime/func Callers
func Caller(skip int) (pc uintptr, file string, line int, ok bool)
• 実行中の行数とファイル名を取得する方法
引数の1はスタックをさかのぼる数です。
http://play.golang.org/p/hELH1OEPTo
• 現在のファイル名とディレクトリを取得する方法
http://play.golang.org/p/EQezfIvN-F
もともと、__FILE__や__DIR__がないのは、コンパイルを早くするため
だそうです。なので、欲しい場合は自分で実装します。
runtime / func GOMAXPROCS
• GOMAXPROCSは、同時に最大で実行可能な
CPU数をセットし、前に設定していた値を返し
ます。
http://play.golang.org/p/BJZ7nvhJou
runtime / func GOROOT
• Goツリーのrootを返します。
http://play.golang.org/p/XRwJ1i-JnQ
go run go_root.go
GOROOT : /usr/local/opt/go/libexec
runtime / func Goexit
• 呼び出したgoroutineを終了します。
http://play.golang.org/p/mLhLS31ofc
runtime / func GoroutineProfile
• 起動中のgoroutineのprofileを取得します。
http://play.golang.org/p/CvcNDiFl4G
• 下記はローカルで実行した結果
runtime / func Gosched
• 現在、動いてるgorutineが動いてるときに他
のgorutineが動けるようにする。でも、現在、
動いてるgorutineは中断されて止まることは
ない。
http://play.golang.org/p/Ovtx28IavM
runtime / func LockOSThread
• LockOSThreadは、オペレーティングシステムのカレントスレッ
ドと、この関数を呼び出したゴルーチンを関連付けます。呼
び出したゴルーチンが終了するか、もしくはUnlockOSThread
が呼び出されるまで、常にそのスレッド内で実行されます。
一方、他のゴルーチンはそのスレッド内では実行されなくなり
ます。LockOSThreadは、init関数内では使用できません。
http://play.golang.org/p/Q2paT00GNX
runtime / NumCPU
• 実行してるマシンのCPUのコア数を返す
• 下記みたいに、コア数を取得してセットするみ
たいな使い方かな
http://play.golang.org/p/YDLGX7yEwB
runtime / NumGoroutine
• 現在動いてるgorutineの数を取得
http://play.golang.org/p/0KxjeM3Yjy
runtime / func ReadMemStats
goroutine: 100000
cpu: 4
time: 0.433748
memory all: 29.155067 MB
memory: 305.713040 byte/goroutine
http://play.golang.org/p/CAdFKJrh9v
runtime / func Version
• バージョンを取得できます。
http://play.golang.org/p/qVT6QpOFcL
runtime/ type Func
• func FuncForPC
リフレクションを使って関数名を取得するには?
http://play.golang.org/p/Nx2bs8ymen
http://play.golang.org/p/BzcgKYUBSQ
runtime/debug
• func FreeOSMemory
強制的にGCを行う
• func PrintStack
http://play.golang.org/p/LTahQPl8xk
• func ReadGCStats
GCの統計情報を返します
runtime/debug
• SetGCPercent
デフォルトは100
debug.SetGCPercent(100)
debug.SetGCPercent(50)
だと、通常の半分のメモリ領域だけGCを行うのかな
debug.SetGCPercent(-1)
だとGCは無効になる
runtime/debug
• SetMaxStack
http://play.golang.org/p/5vFRbvIrgO
上記の例はstack overflowします。
1つのgorutineにつき、使用できるメモリの最大量
を設定できます。
デフォルト値は64ビットシステムで1ギガです。
設定した数を超えるとプログラムはクラッシュしま
す。
runtime/debug
• SetMaxThreads
http://play.golang.org/p/5vFRbvIrgO
上記はthread exhaustionプログラムです
goプログラムが使用できるスレッドの最大数を設定できま
す。
デフォルトは1万スレッドです。
設定した数を超えるとプログラムはクラッシュします。
runtime/debug
• SetPanicOnFault
debug.SetPanicOnFault(true)
SetPanicOnFaultは、現在のゴルーチンにのみ
適用されます。
• Stack
この関数は非推奨

More Related Content

Similar to Gunosy_go_8_runtime

ホームディレクトリに埋もれた便利なコードをさがせ!
ホームディレクトリに埋もれた便利なコードをさがせ!ホームディレクトリに埋もれた便利なコードをさがせ!
ホームディレクトリに埋もれた便利なコードをさがせ!
Yohei Fushii
 
Nseg20120929
Nseg20120929Nseg20120929
Nseg20120929
hiro345
 
Composerを利用した FuelPHPのパッケージ管理方法
Composerを利用した FuelPHPのパッケージ管理方法Composerを利用した FuelPHPのパッケージ管理方法
Composerを利用した FuelPHPのパッケージ管理方法
nasneg
 

Similar to Gunosy_go_8_runtime (20)

実践Go ツールの作成から配布まで
実践Go ツールの作成から配布まで実践Go ツールの作成から配布まで
実践Go ツールの作成から配布まで
 
RgGen ご紹介
RgGen ご紹介RgGen ご紹介
RgGen ご紹介
 
kyotovim#1
kyotovim#1kyotovim#1
kyotovim#1
 
【18-E-3】クラウド・ネイティブ時代の2016年だから始める Docker 基礎講座
【18-E-3】クラウド・ネイティブ時代の2016年だから始める Docker 基礎講座【18-E-3】クラウド・ネイティブ時代の2016年だから始める Docker 基礎講座
【18-E-3】クラウド・ネイティブ時代の2016年だから始める Docker 基礎講座
 
Programming camp Codereading
Programming camp CodereadingProgramming camp Codereading
Programming camp Codereading
 
メルカリアッテの実務で使えた、GAE/Goの開発を効率的にする方法
メルカリアッテの実務で使えた、GAE/Goの開発を効率的にする方法メルカリアッテの実務で使えた、GAE/Goの開発を効率的にする方法
メルカリアッテの実務で使えた、GAE/Goの開発を効率的にする方法
 
Dakota+openFoam1
Dakota+openFoam1Dakota+openFoam1
Dakota+openFoam1
 
Go1.8 for Google App Engine
Go1.8 for Google App EngineGo1.8 for Google App Engine
Go1.8 for Google App Engine
 
Go入門
Go入門Go入門
Go入門
 
ホームディレクトリに埋もれた便利なコードをさがせ!
ホームディレクトリに埋もれた便利なコードをさがせ!ホームディレクトリに埋もれた便利なコードをさがせ!
ホームディレクトリに埋もれた便利なコードをさがせ!
 
Anaconda & NumbaPro 使ってみた
Anaconda & NumbaPro 使ってみたAnaconda & NumbaPro 使ってみた
Anaconda & NumbaPro 使ってみた
 
qmake入門
qmake入門qmake入門
qmake入門
 
オススメの標準・準標準パッケージ20選
オススメの標準・準標準パッケージ20選オススメの標準・準標準パッケージ20選
オススメの標準・準標準パッケージ20選
 
Nseg20120929
Nseg20120929Nseg20120929
Nseg20120929
 
Composerを利用した FuelPHPのパッケージ管理方法
Composerを利用した FuelPHPのパッケージ管理方法Composerを利用した FuelPHPのパッケージ管理方法
Composerを利用した FuelPHPのパッケージ管理方法
 
Goでこれどうやるの? 入門
Goでこれどうやるの? 入門Goでこれどうやるの? 入門
Goでこれどうやるの? 入門
 
Redmine backlogs beginning
Redmine backlogs beginningRedmine backlogs beginning
Redmine backlogs beginning
 
Gocon2017:Goのロギング周りの考察
Gocon2017:Goのロギング周りの考察Gocon2017:Goのロギング周りの考察
Gocon2017:Goのロギング周りの考察
 
Gopenflow demo v1
Gopenflow demo v1Gopenflow demo v1
Gopenflow demo v1
 
PHP から Groonga を使うにはこんなコードになるよ!
PHP から Groonga を使うにはこんなコードになるよ!PHP から Groonga を使うにはこんなコードになるよ!
PHP から Groonga を使うにはこんなコードになるよ!
 

Gunosy_go_8_runtime

Editor's Notes

  1. まず、runtimeパッケージの概要をざっとお話します。
  2. 次にruntimeの定数について話します。 ごーおーえすとごーあーちについて、クロスコンパイルで使います
  3. ところどころ、説明を省きつつ、気になったところを話していきます BreakPoint関数について playgroundで見てみましょう
  4. ローカルで実行するとこんな感じです。
  5. 引数の1はスタックをさかのぼる数です。
  6. Palygroundでやると、sandoboxのパスがでてきて、macのローカルでやるとhomebrewでインストールしたパスがでます
  7. イメージこんな感じです。
  8. サンドボックスではこんな感じ ローカルで実行するといい感じでCPU使ってくれます
  9. コメントアウトして、あるときとないときを比べると出力の順番が変わることがわかる
  10. なんで、これだけ長いw サンプルコードが役にたつかわからないが、とりあえず
  11. サンドボックスのCPUのコア数は1なのかな ローカルの4コアのMacでやると4 4 でした