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

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

```go
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

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

#### 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します。

１つのgoroutineにつき、使用できるメモリの最大量を設定できます。
デフォルト値は64ビットシステムで１ギガです。
設定した数を超えるとプログラムはクラッシュします。

#### 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