Slide 1

Slide 1 text

Go Scheduler Cyril Lashkevich GoWayFest 2017

Slide 2

Slide 2 text

Планировщик главное отличие go от современных mainstream языков В остальном это Pascal c GC

Slide 3

Slide 3 text

func main() { var x int threads := runtime.GOMAXPROCS(0) for i := 0; i < threads; i++ { go func() { for { x++ } }() } time.Sleep(time.Second) fmt.Println("x =", x) }

Slide 4

Slide 4 text

func test() { a := 100 for i := 1; i < 1000; i++ { a = i*100/i + a } } func main() { runtime.GOMAXPROCS(1) go func() { for { test() } }() time.Sleep(100 * time.Millisecond) fmt.Println("hello world") }

Slide 5

Slide 5 text

runtime: tight loops should be preemptible #10958 aclements opened this issue on May 26, 2015 · 50 comments

Slide 6

Slide 6 text

Конкурентность и языки Язык Отображение на системные потоки Lua none C, C++, Python 1:1 Java <= 1.1, j2me, Python n:1 Go, Erlang n:m

Slide 7

Slide 7 text

Goroutines VS threads Свойство Goroutines Threads Время создания Быстро Медленно Время удаления Быстро Медленно Переключение контекста Быстро Медленно Потребление памяти под стек 2kB 512kB-1MB Допустимое количество 10^4 10^6

Slide 8

Slide 8 text

Вытесняющая и кооперативная многозадачность

Slide 9

Slide 9 text

Планировщики — Work Sharing при появлении новой задачи попытаться мигрировать ее на свободный процессор — Work Stealing когда процессор освобождается, он пытается найти себе задачу

Slide 10

Slide 10 text

Scheduling Multithreaded Computations by Work Stealing

Slide 11

Slide 11 text

G M P — G - Goroutine — M - OS thread — P - "Processor"

Slide 12

Slide 12 text

No content

Slide 13

Slide 13 text

No content

Slide 14

Slide 14 text

No content

Slide 15

Slide 15 text

No content

Slide 16

Slide 16 text

GOMAXPROCS Просто количество P

Slide 17

Slide 17 text

Spining threads — M с P ищет G — M без P ищет P — Есть готовая к исполнению G, свободная P, но нет M

Slide 18

Slide 18 text

No content

Slide 19

Slide 19 text

Когда происходит переключение goroutines — morestack() --> newstack() — runtime.Gosched() — locks — network I/O — syscalls

Slide 20

Slide 20 text

GOEXPERIMENT = preemptibleloops

Slide 21

Slide 21 text

Влияние на GC GC не может работать пока есть невытесняемая goroutine

Slide 22

Slide 22 text

https://morsmachine.dk/go-scheduler https://rakyll.org/scheduler/ https://github.com/golang/go/blob/master/src/runtime/ proc.go https://docs.google.com/document/d/ 1TTj4T2JO42uD5ID9e89oa0sLKhJYD0Y_kqxDv3I3XMw https://github.com/golang/go/issues/10958 https://github.com/golang/go/issues/16051 https://github.com/golang/go/issues/17831 https://www.slideshare.net/matthewrdale/demystifying- the-go-scheduler https://povilasv.me/go-scheduler/