0
点赞
收藏
分享

微信扫一扫

通过进程绑定来优化多核服务器下双路内存读写局限

尤克乔乔 2024-01-29 阅读 17

绑定第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的对应的包

举报

相关推荐

0 条评论