goroutineがスケールしない。Golangのスケジューラと向き合う


高速なTCPサーバーをGolangで作りベンチマークを取っていたのですが、CPUが2コアや4コアだと100%CPUを使い切れるのに、16コアになるとCPUを100%使いきれずアイドルする現象に困っていました。16コアのサーバーを用いても実質4コア分のパフォーマンスしか出せていませんでした。

goroutine同士は干渉しないのにCPU数を上げてもスケールしないのには納得がいかず、GolangのスケジューラがCPUをブロックしているのではないかと考え、実験しました。

goroutineをスイッチするタイミングについては

- [意外と知らないgoroutineのスケジューラーの挙動 #golang](http://qiita.com/niconegoto/items/3952d3c53d00fccc363b)
- [goroutineがスイッチされるタイミング](http://qiita.com/umisama/items/93333ffe4d9fc7e4ba1f)

これらの記事が参考になります。

## 実験環境

- Cloud: Degital Ocean
- OS: Ubuntu16.04.3

### ubuntu-16

- CPU: 16 Core
- Memory: 24GB
- Type: High CPU

### ubuntu-4

- CPU: 4 Core
- Memory: 6GB
- Type: High CPU

## sche-cpu サンプルコード

```go:main.go
package main

import (
	"log"
	"net/http"
	_ "net/http/pprof"
	"os"
	"runtime"
	"strconv"
	"sync"
)

var wg sync.WaitGroup

func main() {
	runtime.SetBlockProfileRate(1)
	go func() {
		log.Println(http.ListenAndServe("0.0.0.0:6060", nil))
	}()
	test, err := strconv.Atoi(os.Args[1])
	if err != nil {
		log.Fatal(err)
	}
	client, err := strconv.Atoi(os.Args[2])
	if err != nil {
		log.Fatal(err)
	}
	buffer, err := strconv.Atoi(os.Args[3])
	if err != nil {
		log.Fatal(err)
	}
	var work worker
	switch test {
	case 1:
		log.Println("work1")
		work = work1
	case 2:
		log.Println("work2")
		work = work2
	case 3:
		log.Println("work3")
		work = work3
	default:
		log.Println("work3")
		work = work3
	}

	stop := make(chan struct{})

	for i := 0; i < client; i++ {
		wg.Add(1)
		go work(stop, buffer)
	}
	defer func() {
		close(stop)
		wg.Wait()
		log.Println("done")
	}()

	var ch chan bool
	<-ch
}

type worker func(stop chan struct{}, buffer int)

func work1(stop chan struct{}, buffer int) {
	defer wg.Done()

	var count int
	for {
		select {
		case <-stop:
			return
		default:
			count++
		}
	}
}

func work2(stop chan struct{}, buffer int) {
	defer wg.Done()

	var count int
	for {
		select {
		case <-stop:
			return
		default:
			count++
			if count > buffer {
				runtime.Gosched()
				count = 0
			}
		}
	}
}

func work3(stop chan struct{}, buffer int) {
	defer wg.Done()
	hoge := make(chan int, buffer)

	go func() {
		var count int
		for {
			select {
			case <-stop:
				return
			case count = <-hoge:
				count++
			}
		}
	}()
	var count int
	for {
		select {
		case <-stop:
			return
		case hoge <- count:
			count++
		}
	}
}
```

ビルド環境

- OS: macOS 10.12.6
- Go: 1.8.3

```
GOOS=linux GOARCH=amd64 go build -o sche-cpu
```

### type 1

for ループによるビジーウェイトを作り出しgoroutineのスイッチを阻止する

### type 2

`runtime.Gosched()`によって強制的にスケジューラを起動しgoroutineをスイッチさせる
buffer を増やすことによって、スケジューラを呼び出す前にビジーウェイトを作り出す

### type 3

チャネルの操作によってgoroutineをスイッチさせる
buffer を増やすことによってチャネルのバッファーを増やす

## 考察と結論

実験内容がとても長いので先に結論と考察を書きます。

### CPU 4コアと16コアの対照実験からわかること

4コアではtype 1, 2, 3 共にCPUをほぼ100%使えています。
しかし、16コアでは、type 2, 3 において、40%程度の iowait がでて、CPUを60%程度しか使えていません。
CPU数が増えても処理がスケールしないことがわかります。

### 16コアで実行したtype 1,2,3からわかること

#### type 1

スケジューラを呼ばないビジーループをすると100%CPUを使い切れることがわかりました。

#### type 2

高頻度でスケジューラを呼んでスイッチすると100%CPUを使いきれません。
ただし、スケジューラを呼ぶ前にビジーウェイトを挟むと、100%CPUを使い切ることができます。
これは、単位時間に実行されるgoroutineのスイッチの回数が少なくなるためだと考えられます。

#### type 3

高頻度でchannelを操作するとスケジューラが呼ばれて100%CPUを使いきれません。
buffer付きchannelでも100%CPUは使いきれません。channelの操作ではbufferに空きがあってもスケジューラが呼び出されていることがわかります。
また、buffer付きchannelはbufferに空きがある場合はgoroutineをスイッチさせずに処理を継続しますが、スケジューラ自体は呼び出されているのではないかと思いました。

### まとめ

高頻度でgoroutineをスイッチするとスイッチングコストによりCPUが100%使いきれないのではないかと思います。

[GoConで発表してきたのでついでにruntime以下の知識をまとめていく #golang](http://niconegoto.hatenadiary.jp/entry/2017/04/11/092810) 
この記事に書かれているGolangのスケジューラの仕組みによると、goroutineのキューはローカルキューとグローバルキューがあり、それらのstealの操作があるそうです。そのあたりで全体に対するロックがかかってしまっているのかな？と推測しましたが、実際のソースコードを読み解けなかったのでわかりません。

回避策としては、なるべくgoroutineをスイッチさせないこと、並行化させる処理は比較的重い処理をさせるべきなのかなと思いました。

解決策や原因など、詳しい方がいらっしゃいましたら教えていただきたいです。

## goroutineのスケジューラについての実験結果

### 16 Core

#### type 1

```
root@ubuntu-16:~# ./bin/sche-cpu 1 100 0
2017/09/01 02:15:48 work1
```

vmstat 2

```
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
 r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa st
 0  0      0 24142660  16848 406184    0    0     4     2  246  136  3  2 96  0  0
16  0      0 24141008  16848 406184    0    0     0     0 2198  313 50  0 50  0  0
16  0      0 24141008  16848 406184    0    0     0     0 4112  272 100  0  0  0  0
16  0      0 24141008  16848 406184    0    0     0     0 4112  292 100  0  0  0  0
16  0      0 24141008  16856 406184    0    0     0     6 4113  275 100  0  0  0  0
17  0      0 24141040  16856 406184    0    0     0     0 4112  289 100  0  0  0  0
16  0      0 24141040  16856 406184    0    0     0     0 4112  287 100  0  0  0  0
```

mpstat -P ALL 2

```
root@ubuntu-16:~# mpstat -P ALL 2
Linux 4.4.0-87-generic (ubuntu-16) 	09/01/2017 	_x86_64_	(16 CPU)

02:18:54 AM  CPU    %usr   %nice    %sys %iowait    %irq   %soft  %steal  %guest  %gnice   %idle
02:18:56 AM  all   99.94    0.00    0.03    0.00    0.00    0.00    0.03    0.00    0.00    0.00
02:18:56 AM    0  100.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00
02:18:56 AM    1  100.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00
02:18:56 AM    2   99.50    0.00    0.00    0.00    0.00    0.00    0.50    0.00    0.00    0.00
02:18:56 AM    3  100.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00
02:18:56 AM    4  100.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00
02:18:56 AM    5  100.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00
02:18:56 AM    6  100.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00
02:18:56 AM    7  100.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00
02:18:56 AM    8  100.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00
02:18:56 AM    9  100.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00
02:18:56 AM   10  100.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00
02:18:56 AM   11  100.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00
02:18:56 AM   12  100.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00
02:18:56 AM   13  100.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00
02:18:56 AM   14  100.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00
02:18:56 AM   15  100.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00
```

#### type 2

##### buffer 0

```
root@ubuntu-16:~# ./bin/sche-cpu 2 100 0
2017/09/01 02:20:06 work2
```

vmstat 2

```
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
 r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa st
 0  0      0 24142732  16868 406224    0    0     4     2  238  129  5  1 94  0  0
 0  0      0 24142344  16868 406224    0    0     0     0   23   30  0  0 100  0  0
13  3      0 24140672  16868 406224    0    0     0     0 222896 524104 12 30 37 21  0
 7 10      0 24140672  16868 406224    0    0     0     0 326306 714181 17 42  3 38  0
 7  9      0 24140672  16868 406224    0    0     0     0 329344 712460 17 42  1 40  0
10  8      0 24140672  16868 406224    0    0     0     0 324700 702652 18 42  1 39  0
16  2      0 24140672  16868 406224    0    0     0     0 325307 703997 17 43  1 39  0
16  1      0 24140672  16868 406224    0    0     0     0 325730 705695 17 43  1 39  0
15  2      0 24140672  16868 406224    0    0     0     0 329006 711620 18 41  1 40  0
 8  9      0 24140672  16868 406224    0    0     0     0 330731 714501 17 43  1 40  0
15  1      0 24140672  16868 406224    0    0     0     0 322472 698715 16 43  1 40  0
```

mpstat -P ALL 2

```
root@ubuntu-16:~# mpstat -P ALL 2
Linux 4.4.0-87-generic (ubuntu-16) 	09/01/2017 	_x86_64_	(16 CPU)

02:24:52 AM  CPU    %usr   %nice    %sys %iowait    %irq   %soft  %steal  %guest  %gnice   %idle
02:24:54 AM  all   17.28    0.00   42.94   39.02    0.00    0.00    0.00    0.00    0.00    0.77
02:24:54 AM    0   17.17    0.00   42.42   39.39    0.00    0.00    0.00    0.00    0.00    1.01
02:24:54 AM    1   16.23    0.00   42.93   40.31    0.00    0.00    0.00    0.00    0.00    0.52
02:24:54 AM    2   16.75    0.00   43.15   39.09    0.00    0.00    0.00    0.00    0.00    1.02
02:24:54 AM    3   14.14    0.00   46.07   38.74    0.00    0.00    0.00    0.00    0.00    1.05
02:24:54 AM    4   17.99    0.00   41.80   39.68    0.00    0.00    0.00    0.00    0.00    0.53
02:24:54 AM    5   15.90    0.00   44.62   38.46    0.00    0.00    0.00    0.00    0.00    1.03
02:24:54 AM    6   15.90    0.00   45.13   37.95    0.00    0.00    0.00    0.00    0.00    1.03
02:24:54 AM    7   20.41    0.00   41.84   37.24    0.00    0.00    0.00    0.00    0.00    0.51
02:24:54 AM    8   17.71    0.00   43.23   38.54    0.00    0.00    0.00    0.00    0.00    0.52
02:24:54 AM    9   17.62    0.00   43.52   38.34    0.00    0.00    0.00    0.00    0.00    0.52
02:24:54 AM   10   14.95    0.00   43.30   40.72    0.00    0.00    0.00    0.00    0.00    1.03
02:24:54 AM   11   16.16    0.00   43.94   38.89    0.00    0.00    0.00    0.00    0.00    1.01
02:24:54 AM   12   21.11    0.00   39.20   38.69    0.00    0.00    0.00    0.00    0.00    1.01
02:24:54 AM   13   14.95    0.00   43.81   40.21    0.00    0.00    0.00    0.00    0.00    1.03
02:24:54 AM   14   17.17    0.00   41.92   39.90    0.00    0.00    0.00    0.00    0.00    1.01
02:24:54 AM   15   21.39    0.00   40.11   38.50    0.00    0.00    0.00    0.00    0.00    0.00
```

iowait が 40% ほど
idle は 1%

##### buffer 1000

```
root@ubuntu-16:~# ./bin/sche-cpu 2 100 1000
2017/09/01 02:27:11 work2
```

vmstat 2

```
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
 r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa st
16  0      0 24141084  16892 406168    0    0     4     2  282  547  6  5 86  3  0
16  0      0 24140820  16892 406168    0    0     0     0 5144 7809 99  1  0  0  0
16  0      0 24140820  16892 406168    0    0     0     0 5012 7225 99  1  0  0  0
16  0      0 24140852  16892 406168    0    0     0     0 5174 7566 99  1  0  0  0
16  0      0 24140852  16892 406168    0    0     0     0 5003 6980 98  1  1  0  0
16  0      0 24140852  16892 406168    0    0     0     0 4988 7143 99  1  0  0  0
```

mpstat -P ALL 2

```
root@ubuntu-16:~# mpstat -P ALL 2
Linux 4.4.0-87-generic (ubuntu-16) 	09/01/2017 	_x86_64_	(16 CPU)

02:28:03 AM  CPU    %usr   %nice    %sys %iowait    %irq   %soft  %steal  %guest  %gnice   %idle
02:28:05 AM  all   98.78    0.00    0.82    0.06    0.00    0.00    0.00    0.00    0.00    0.34
02:28:05 AM    0   94.00    0.00    1.50    0.00    0.00    0.00    0.00    0.00    0.00    4.50
02:28:05 AM    1   98.50    0.00    1.00    0.50    0.00    0.00    0.00    0.00    0.00    0.00
02:28:05 AM    2   98.99    0.00    1.01    0.00    0.00    0.00    0.00    0.00    0.00    0.00
02:28:05 AM    3   98.50    0.00    1.50    0.00    0.00    0.00    0.00    0.00    0.00    0.00
02:28:05 AM    4   98.00    0.00    1.50    0.00    0.00    0.00    0.00    0.00    0.00    0.50
02:28:05 AM    5   99.50    0.00    0.50    0.00    0.00    0.00    0.00    0.00    0.00    0.00
02:28:05 AM    6   98.49    0.00    1.51    0.00    0.00    0.00    0.00    0.00    0.00    0.00
02:28:05 AM    7   98.51    0.00    1.00    0.00    0.00    0.00    0.00    0.00    0.00    0.50
02:28:05 AM    8   99.00    0.00    0.50    0.00    0.00    0.00    0.00    0.00    0.00    0.50
02:28:05 AM    9   99.00    0.00    0.50    0.50    0.00    0.00    0.00    0.00    0.00    0.00
02:28:05 AM   10   98.99    0.00    1.01    0.00    0.00    0.00    0.00    0.00    0.00    0.00
02:28:05 AM   11   99.50    0.00    0.50    0.00    0.00    0.00    0.00    0.00    0.00    0.00
02:28:05 AM   12   98.50    0.00    1.00    0.00    0.00    0.00    0.00    0.00    0.00    0.50
02:28:05 AM   13   99.50    0.00    0.00    0.50    0.00    0.00    0.00    0.00    0.00    0.00
02:28:05 AM   14   99.00    0.00    0.50    0.00    0.00    0.00    0.00    0.00    0.00    0.50
02:28:05 AM   15   99.49    0.00    0.51    0.00    0.00    0.00    0.00    0.00    0.00    0.00
```

cpu をユーザー領域でほぼ100%使えている

#### type 3

##### buffer 0

```
root@ubuntu-16:~# ./bin/sche-cpu 3 100 0
2017/09/01 02:29:39 work3
```

vmstat 2

```
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
 r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa st
 9  7      0 24140804  16892 406200    0    0     4     2  295   24  9  5 83  3  0
10  7      0 24140416  16892 406200    0    0     0     0 305856 752543 22 40 12 26  0
15  3      0 24140416  16892 406200    0    0     0     0 319541 732084 21 42  4 33  0
 8  9      0 24140416  16892 406200    0    0     0     0 321637 726798 22 41  1 35  0
 7 10      0 24140416  16892 406200    0    0     0     0 320025 724534 21 42  1 36  0
15  2      0 24140416  16892 406200    0    0     0     0 315660 716282 21 42  1 35  0
 9  7      0 24140448  16892 406200    0    0     0     0 316983 719222 21 42  1 35  0
13  4      0 24140448  16892 406200    0    0     0     0 311600 708722 22 43  2 34  0
13  4      0 24140448  16892 406200    0    0     0     0 315817 716971 22 42  1 34  0
```

mpstat -P ALL 2

```
root@ubuntu-16:~# mpstat -P ALL 2
Linux 4.4.0-87-generic (ubuntu-16) 	09/01/2017 	_x86_64_	(16 CPU)

02:31:05 AM  CPU    %usr   %nice    %sys %iowait    %irq   %soft  %steal  %guest  %gnice   %idle
02:31:07 AM  all   22.11    0.00   41.76   34.67    0.00    0.00    0.00    0.00    0.00    1.46
02:31:07 AM    0   23.50    0.00   42.00   33.00    0.00    0.00    0.00    0.00    0.00    1.50
02:31:07 AM    1   20.92    0.00   43.37   34.18    0.00    0.00    0.00    0.00    0.00    1.53
02:31:07 AM    2   25.53    0.00   39.89   33.51    0.00    0.00    0.00    0.00    0.00    1.06
02:31:07 AM    3   23.44    0.00   39.58   35.42    0.00    0.00    0.00    0.00    0.00    1.56
02:31:07 AM    4   22.56    0.00   41.03   34.87    0.00    0.00    0.00    0.00    0.00    1.54
02:31:07 AM    5   20.10    0.00   42.27   36.08    0.00    0.00    0.00    0.00    0.00    1.55
02:31:07 AM    6   25.39    0.00   40.41   32.64    0.00    0.00    0.00    0.00    0.00    1.55
02:31:07 AM    7   23.32    0.00   40.93   34.20    0.00    0.00    0.00    0.00    0.00    1.55
02:31:07 AM    8   25.26    0.00   41.05   32.63    0.00    0.00    0.00    0.00    0.00    1.05
02:31:07 AM    9   24.74    0.00   41.58   32.63    0.00    0.00    0.00    0.00    0.00    1.05
02:31:07 AM   10   18.37    0.00   43.88   36.22    0.00    0.00    0.00    0.00    0.00    1.53
02:31:07 AM   11   19.69    0.00   42.49   36.27    0.00    0.00    0.00    0.00    0.00    1.55
02:31:07 AM   12   18.46    0.00   44.10   35.90    0.00    0.00    0.00    0.00    0.00    1.54
02:31:07 AM   13   19.69    0.00   42.49   36.27    0.00    0.00    0.00    0.00    0.00    1.55
02:31:07 AM   14   20.21    0.00   40.93   36.79    0.00    0.00    0.00    0.00    0.00    2.07
02:31:07 AM   15   22.29    0.00   41.71   34.29    0.00    0.00    0.00    0.00    0.00    1.71
```

##### buffer 1000

```
root@ubuntu-16:~# ./bin/sche-cpu 3 100 1000
2017/09/01 02:32:20 work3
```

vmstat 2

```
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
 r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa st
 5 13      0 24140112  16916 406176    0    0     3     2  377  375  9  6 81  4  0
 1  0      0 24139972  16916 406176    0    0     0     0 326650 710439 16 43  1 40  0
 8 10      0 24140004  16916 406176    0    0     0     0 327646 710342 18 41  1 40  0
12  6      0 24140004  16916 406176    0    0     0     0 326953 709041 17 43  1 39  0
14  4      0 24140004  16916 406176    0    0     0     0 326212 708030 17 42  1 40  0
 7  9      0 24140004  16916 406176    0    0     0     0 326783 709785 17 42  1 40  0
```

mpstat -P ALL 2

```
root@ubuntu-16:~# mpstat -P ALL 2
Linux 4.4.0-87-generic (ubuntu-16) 	09/01/2017 	_x86_64_	(16 CPU)

02:33:13 AM  CPU    %usr   %nice    %sys %iowait    %irq   %soft  %steal  %guest  %gnice   %idle
02:33:15 AM  all   17.54    0.00   42.01   39.58    0.00    0.00    0.00    0.00    0.00    0.88
02:33:15 AM    0   19.79    0.00   41.15   38.54    0.00    0.00    0.00    0.00    0.00    0.52
02:33:15 AM    1   16.15    0.00   43.75   39.06    0.00    0.00    0.00    0.00    0.00    1.04
02:33:15 AM    2   18.13    0.00   43.01   37.82    0.00    0.00    0.00    0.00    0.00    1.04
02:33:15 AM    3   15.51    0.00   42.25   41.18    0.00    0.00    0.00    0.00    0.00    1.07
02:33:15 AM    4   14.66    0.00   43.46   40.84    0.00    0.00    0.00    0.00    0.00    1.05
02:33:15 AM    5   15.31    0.00   43.88   39.80    0.00    0.00    0.00    0.00    0.00    1.02
02:33:15 AM    6   13.83    0.00   45.74   39.36    0.00    0.00    0.00    0.00    0.00    1.06
02:33:15 AM    7   18.23    0.00   41.15   39.58    0.00    0.00    0.00    0.00    0.00    1.04
02:33:15 AM    8   21.50    0.00   41.00   37.00    0.00    0.00    0.00    0.00    0.00    0.50
02:33:15 AM    9   20.32    0.00   39.57   39.57    0.00    0.00    0.00    0.00    0.00    0.53
02:33:15 AM   10   17.62    0.00   40.93   40.41    0.00    0.00    0.00    0.00    0.00    1.04
02:33:15 AM   11   17.01    0.00   41.24   40.72    0.00    0.00    0.00    0.00    0.00    1.03
02:33:15 AM   12   18.95    0.00   38.95   41.05    0.00    0.00    0.00    0.00    0.00    1.05
02:33:15 AM   13   15.69    0.00   44.61   38.73    0.00    0.00    0.00    0.00    0.00    0.98
02:33:15 AM   14   18.27    0.00   41.12   39.59    0.00    0.00    0.00    0.00    0.00    1.02
02:33:15 AM   15   19.68    0.00   41.49   37.77    0.00    0.00    0.00    0.00    0.00    1.06
```

### 4 Core

#### type 1

```
root@ubuntu-2:~# ./bin/sche-cpu 1 100 0
2017/09/01 02:39:04 work1
```

vmstat 2

```
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
 r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa st
 4  0      0 5699060  12580 333144    0    0    16     6  247   32  4  2 94  0  0
 4  0      0 5699092  12588 333148    0    0     0     6 1113  238 100  0  0  0  0
 4  0      0 5699092  12588 333148    0    0     0     0 1109  229 100  0  0  0  0
```

```
root@ubuntu-4:~# mpstat -P ALL 2
Linux 4.4.0-87-generic (ubuntu-4) 	09/01/2017 	_x86_64_	(4 CPU)

02:40:36 AM  CPU    %usr   %nice    %sys %iowait    %irq   %soft  %steal  %guest  %gnice   %idle
02:40:38 AM  all  100.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00
02:40:38 AM    0  100.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00
02:40:38 AM    1  100.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00
02:40:38 AM    2   99.50    0.00    0.50    0.00    0.00    0.00    0.00    0.00    0.00    0.00
02:40:38 AM    3  100.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00
```

#### type 2

##### buffer 0

```
root@ubuntu-4:~# ./bin/sche-cpu 2 100 0
2017/09/01 02:41:11 work2
```

vmstat 2

```
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
 r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa st
 3  0      0 5649152  16716 379536    0    0    18     9  253  116  6  2 92  0  0
 4  0      0 5649136  16716 379456    0    0     0     0 5292 148444 70 26  3  1  0
 4  0      0 5649136  16716 379456    0    0     0     0 5767 149276 69 27  3  1  0
```

mpstat -P ALL 2

```
root@ubuntu-4:~# mpstat -P ALL 2
Linux 4.4.0-87-generic (ubuntu-4) 	09/01/2017 	_x86_64_	(4 CPU)

02:43:25 AM  CPU    %usr   %nice    %sys %iowait    %irq   %soft  %steal  %guest  %gnice   %idle
02:43:27 AM  all   70.03    0.00   26.23    1.03    0.00    0.00    0.00    0.00    0.00    2.71
02:43:27 AM    0   70.83    0.00   25.52    1.04    0.00    0.00    0.00    0.00    0.00    2.60
02:43:27 AM    1   71.58    0.00   25.79    1.05    0.00    0.00    0.00    0.00    0.00    1.58
02:43:27 AM    2   67.17    0.00   28.79    1.01    0.00    0.00    0.00    0.00    0.00    3.03
02:43:27 AM    3   71.50    0.00   24.87    0.52    0.00    0.00    0.00    0.00    0.00    3.11
```

##### buffer 1000

```
root@ubuntu-4:~# ./bin/sche-cpu 2 100 1000
2017/09/01 02:44:19 work2
```

vmstat 2

```
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
 r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa st
 4  0      0 5649072  16716 379456    0    0    17     9  348 1822  9  3 88  0  0
 4  0      0 5649056  16716 379456    0    0     0     0 1117  276 100  0  0  0  0
 4  0      0 5649056  16716 379456    0    0     0     0 1110  244 100  0  0  0  0
```

mpstat -P ALL 2

```
root@ubuntu-4:~# mpstat -P ALL 2
Linux 4.4.0-87-generic (ubuntu-4) 	09/01/2017 	_x86_64_	(4 CPU)

02:45:04 AM  CPU    %usr   %nice    %sys %iowait    %irq   %soft  %steal  %guest  %gnice   %idle
02:45:06 AM  all  100.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00
02:45:06 AM    0  100.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00
02:45:06 AM    1  100.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00
02:45:06 AM    2  100.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00
02:45:06 AM    3  100.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00    0.00
```

#### type 3

##### buffer 0

```
root@ubuntu-4:~# ./bin/sche-cpu 3 100 0
2017/09/01 02:45:53 work3
```

vmstat 2

```
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
 r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa st
 4  0      0 5648860  16740 379468    0    0    17     9  346 1793 11  3 86  0  0
 4  0      0 5648844  16740 379468    0    0     0     0 2497 62552 83 15  2  0  0
 4  0      0 5648844  16740 379468    0    0     0     2 2239 60402 84 14  2  0  0
 4  0      0 5648844  16740 379468    0    0     0     0 2508 62482 84 14  2  0  0
```

mpstat -P ALL 2

```
root@ubuntu-4:~# mpstat -P ALL 2
Linux 4.4.0-87-generic (ubuntu-4) 	09/01/2017 	_x86_64_	(4 CPU)

02:46:36 AM  CPU    %usr   %nice    %sys %iowait    %irq   %soft  %steal  %guest  %gnice   %idle
02:46:38 AM  all   84.14    0.00   13.20    0.38    0.00    0.00    0.00    0.00    0.00    2.28
02:46:38 AM    0   85.35    0.00   11.11    0.51    0.00    0.00    0.00    0.00    0.00    3.03
02:46:38 AM    1   85.79    0.00   10.15    0.51    0.00    0.00    0.00    0.00    0.00    3.55
02:46:38 AM    2   82.00    0.00   16.00    0.50    0.00    0.00    0.00    0.00    0.00    1.50
02:46:38 AM    3   82.23    0.00   15.23    0.51    0.00    0.00    0.00    0.00    0.00    2.03
```

##### buffer 1000

```
root@ubuntu-4:~# ./bin/sche-cpu 3 100 1000
2017/09/01 02:47:28 work3
```

vmstat 2

```
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
 r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa st
 4  0      0 5647572  16748 379468    0    0    16     8  361 2116 13  3 84  0  0
 4  0      0 5647432  16748 379468    0    0     0     0 5949 98031 74 21  4  1  0
 4  0      0 5647432  16748 379468    0    0     0     0 6300 99671 73 24  2  1  0
 4  0      0 5647432  16748 379468    0    0     0     0 6226 98814 71 26  2  1  0
```

mpstat -P ALL 2

```
root@ubuntu-4:~# mpstat -P ALL 2
Linux 4.4.0-87-generic (ubuntu-4) 	09/01/2017 	_x86_64_	(4 CPU)

02:48:28 AM  CPU    %usr   %nice    %sys %iowait    %irq   %soft  %steal  %guest  %gnice   %idle
02:48:30 AM  all   77.26    0.00   20.08    1.02    0.00    0.00    0.00    0.00    0.00    1.65
02:48:30 AM    0   77.32    0.00   20.62    1.03    0.00    0.00    0.00    0.00    0.00    1.03
02:48:30 AM    1   77.32    0.00   20.10    1.55    0.00    0.00    0.00    0.00    0.00    1.03
02:48:30 AM    2   77.39    0.00   19.60    1.01    0.00    0.00    0.00    0.00    0.00    2.01
02:48:30 AM    3   77.16    0.00   20.30    0.51    0.00    0.00    0.00    0.00    0.00    2.03
```