绑定第39核cpu的C++代码:
int idx = 39;cpu_set_t mask;
CPU_ZERO(&mask); CPU_SET(idx, &mask);sched_setaffinity(0, sizeof(cpu_set_t), &mask);
处理函数未绑定cpu的表现:
Concurrency Level: 1
Time taken for tests: 100.094 seconds
Complete requests: 527
Failed requests: 0
Write errors: 0
Total transferred: 2913783 bytes
Total POSTed: 15802095
HTML transferred: 2859502 bytes
Requests per second: 5.27 [#/sec] (mean)
Time per request: 189.932 [ms] (mean)
Time per request: 189.932 [ms] (mean, across all concurrent requests)
Transfer rate: 28.43 [Kbytes/sec] received
154.17 kb/s sent
182.60 kb/s total
在处理函数中绑定cpu的表现:
Concurrency Level: 1
Time taken for tests: 100.044 seconds
Complete requests: 738
Failed requests: 0
Write errors: 0
Total transferred: 4080402 bytes
Total POSTed: 22128930
HTML transferred: 4004388 bytes
Requests per second: 7.38 [#/sec] (mean)
Time per request: 135.561 [ms] (mean)
Time per request: 135.561 [ms] (mean, across all concurrent requests)
Transfer rate: 39.83 [Kbytes/sec] received
216.01 kb/s sent
255.84 kb/s total
------>>>>>>>>2018-01-15
发现在go语言中有个包支持对cpu亲核性的绑定,函数与c++函数基本一致。
安装该go的包的指令为:
Get the golang.org/x/sys/unix library
go get golang.org/x/sys/unix
go的代码实现如下:
先在初始化函数中:
newMask.Zero(); if newMask.Count() != 0 {Logger.Error("CpuZero: didn't zero CPU set: %v", newMask)}
然后在主处理函数中:
runtime.LockOSThread()defer runtime.UnlockOSThread()var idx intfor idx = runtime.NumCPU()-1;newMask.IsSet(idx);idx -= 1{//fmt.Println(newMask.IsSet(idx), idx)}fmt.Println("now set cpu ",idx)newMask.Set(idx);err := unix.SchedSetaffinity(0, &newMask)if err != nil {Logger.Error("SchedSetaffinity: %v", err)}//sched_setaffinity(0, sizeof(cpu_set_t), &mask);defer newMask.Clear(idx)
api使用参考文档: unix Api测试用例示例
绑定8核后的cpu使用情况:
绑定之后的压测结果:机器 cpu:4 memory:8g
Concurrency Level: 8Time taken for tests: 900.016 secondsComplete requests: 36645Failed requests: 0Write errors: 0Total transferred: 99601110 bytesTotal POSTed: 1099010220HTML transferred: 95826675 bytesRequests per second: 40.72 [#/sec] (mean)Time per request: 196.483 [ms] (mean)Time per request: 24.560 [ms] (mean, across all concurrent requests)Transfer rate: 108.07 [Kbytes/sec] received
未绑定CPU的同一台机器的压测结果
Concurrency Level: 8
Time taken for tests: 900.041 seconds
Complete requests: 16589
Failed requests: 0
Write errors: 0
Total transferred: 91720581 bytes
Total POSTed: 497631060
HTML transferred: 90011914 bytes
Requests per second: 18.43 [#/sec] (mean)
Time per request: 434.042 [ms] (mean)
Time per request: 54.255 [ms] (mean, across all concurrent requests)
Transfer rate: 99.52 [Kbytes/sec] received
效率提升明显。
参考文档:
管理处理器的亲和性(affinity)
关于绑定与不绑定CPU的对比
go支持的绑定cpu的对应的包