Edited at

go runtime


golang runtime

1.2ぐらいの話だったはず。

http://www.slideshare.net/masahiroyanai/gunosy-go-8runtime

この話です。

下書き一覧にあったのでと投稿します


Packages

http://golang.org/pkg/runtime/

http://golang.org/pkg/runtime/cgo/

http://golang.org/pkg/runtime/debug/

http://golang.org/pkg/runtime/pprof/

http://golang.org/pkg/runtime/race/


  • runtime

goroutineを制御する関数などランタイムシステムと対話できるパッケージです。


  • runtime/cgo

GoからCの関数/型にアクセスするために用いるパッケージです。

cgoを使えば、GoからCのコードが呼べます。


  • runtime/debug

実行中のプログラムをデバッグするためのパッケージです。


  • runtime/pprof

実行中のプログラムで時間がかかる部分を特定するのに使います。

https://code.google.com/p/gperftools/


  • runtime/race

データのコンフリクトによってクラッシュした原因とかを調査するパッケージです。

http://golang.org/doc/articles/race_detector.html


runtime


Constants


  • Compiler
    gcかgccか選べます

GOARCH, GOOS

クロスコンパイルの時に使います。

例えばlinux



GOOS=linux GOARCH=amd64 go build hello.go


Variables

MemProfileRate

メモリプロファイルに記録・報告されるメモリアロケーションの割合を制御します。

全てプロファイルする場合は1、無視する場合は0を設定します。

また、testingで

-memprofile メモリプロファイルを出力

-memprofilerate runtime.MemProfileRate の値を指定


func BlockProfile

http://golang.org/pkg/runtime/pprof/

http://golang.org/pkg/testing/

で使います

-blockprofile goroutine のブロックプロファイルを出力

-blockprofilerate runtime.SetBlockProfileRate の値を指定


func Breakpoint

ブレイクポイントを設定します

例えば、ブレイクポイントを設定して

package main

import (
"fmt"
"runtime"
)

func main() {
runtime.Breakpoint()
fmt.Println("Hello world!!")
}

実行すると

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

こんな感じ


func CPUProfile

runtime/pprofで使ってるサンプルがおおいから、そっち側でかな。


func Caller

実行中の行数とファイル名を取得します。

引数の1はスタックをさかのぼる数です。

http://play.golang.org/p/hELH1OEPTo

現在のファイル名とディレクトリはこちら

http://play.golang.org/p/EQezfIvN-F

もともと、FILEDIRがないのは、コンパイルを早くするためだとか


func Callers

callerで取得できる内容をpcスライスに格納する


func GC

GCを走らせる


func GOMAXPROCS

GOMAXPROCSは、同時に最大で実行可能なCPU数をセットし、前に設定していた値を返します。

http://play.golang.org/p/BJZ7nvhJou


func GOROOT

Goツリーのrootを返します。

http://play.golang.org/p/XRwJ1i-JnQ


func Goexit

呼び出したgoroutineを終了します。

http://play.golang.org/p/mLhLS31ofc

http://jxck.node-ninja.com/slides/goroutine-exit.png

https://github.com/Jxck/goroutine-sample/blob/master/goroutine-exit.go


func GoroutineProfile

http://play.golang.org/p/CvcNDiFl4G

アクティブゴルーチンスタック·プロファイル内のレコードの数を返す

0

1

2

4

8

16

32

64

128

256

512

1024

2048

4096

8192

16384

32768

65536

131072

こんな感じで返します


func Gosched

他のgoroutineが実行できるようにプロセッサーを割当るのかな

http://play.golang.org/p/Ovtx28IavM


func LockOSThread

LockOSThreadは、オペレーティングシステムのカレントスレッドと、この関数を呼び出したゴルーチンを関連付けます。呼び出したゴルーチンが終了するか、もしくはUnlockOSThreadが呼び出されるまで、常にそのスレッド内で実行されます。一方、他のゴルーチンはそのスレッド内では実行されなくなります。

http://play.golang.org/p/Q2paT00GNX


func MemProfile


func NumCPU

実行してるマシンのCPUのコア数を返す

下記みたいに、コア数を取得してセットするみたいな使い方かな

http://play.golang.org/p/YDLGX7yEwB


func NumGoroutine

現在動いてるgoroutineの数を取得

http://play.golang.org/p/0KxjeM3Yjy


func ReadMemStats

http://play.golang.org/p/CAdFKJrh9v

playgroundでは動かないですが、localのmacで動かしたら下記のような感じ

goroutine: 100000

cpu: 4

time: 0.441048

memory all: 29.164619 MB

memory: 305.813200 byte/goroutine


func SetBlockProfileRate

testingで使うのかな

http://golang.org/cmd/go/#hdr-Description_of_testing_flags

go test コマンド

http://golang-jp.org/cmd/go/

-blockprofilerate n

runtime.SetBlockProfileRateをnを指定して呼び出すことにより、goroutine

のブロックプロファイルに供給する詳細度を制御します。

'godoc runtime SetBlockProfileRate'を参照してください。

プロファイラはプログラムがブロックされているnナノ秒ごとに

1つのブロックイベントとして平均的にサンプルするように努めます。

デフォルトでは、-test.blockprofileをフラグなしで指定した場合には

すべてのブロックイベントが記録されます。-test.blockprofilerate=1

と同等となります。


func SetCPUProfileRate

debugで使うのかな


func SetFinalizer


func Stack


func ThreadCreateProfile


func UnlockOSThread

LockOSThreadを参照


func Version

バージョンを取得できます。

http://play.golang.org/p/qVT6QpOFcL


type BlockProfileRecord


type Error


type Func


func FuncForPC


func (*Func) Entry


func (*Func) FileLine


func (*Func) Name


type MemProfileRecord


func (*MemProfileRecord) InUseBytes


func (*MemProfileRecord) InUseObjects


func (*MemProfileRecord) Stack


type MemStats


type StackRecord


func (*StackRecord) Stack


type TypeAssertionError


func (*TypeAssertionError) Error


func (*TypeAssertionError) RuntimeError


runtime/debug

GC系の操作が多いですね。


FreeOSMemory

強制的にGCを行う


PrintStack

http://play.golang.org/p/LTahQPl8xk

こんな感じで標準エラーのスタックトレースを返します


ReadGCStats

https://github.com/jjhageman/dev-status/blob/bb52893cb86e430e2cdc67e3ae05f7b54264124b/Godeps/_workspace/src/github.com/rcrowley/go-metrics/debug.go

GCの統計情報を返します


SetGCPercent

デフォルトは100

debug.SetGCPercent(100)

debug.SetGCPercent(50)

だと、通常の半分のメモリ領域だけGCを行うのかな

debug.SetGCPercent(-1)

だとGCは無効になる


SetMaxStack

http://play.golang.org/p/5vFRbvIrgO

上記の例はstack overflowします。

1つのgoroutineにつき、使用できるメモリの最大量を設定できます。

デフォルト値は64ビットシステムで1ギガです。

設定した数を超えるとプログラムはクラッシュします。


SetMaxThreads

http://play.golang.org/p/5vFRbvIrgO

上記はthread exhaustionプログラムです

goプログラムが使用できるスレッドの最大数を設定できます。

デフォルトは1万スレッドです。

設定した数を超えるとプログラムはクラッシュします。


SetPanicOnFault

debug.SetPanicOnFault(true)

SetPanicOnFaultは、現在のゴルーチンにのみ適用されます。


Stack

この関数は非推奨


WriteHeapDump

WriteHeapDumpはヒープの説明と指定したファイル記述子にその中のオブジェクトを書き込みます。


runtime/pprof


StartCPUProfile

http://play.golang.org/p/_XCTa9ODbS


runtime/race

http://golang.org/doc/articles/race_detector.html

go run -race hello.go