isolcpus的学习与了解

isolcpus,学习,了解 · 浏览次数 : 274

小编点评

**isolcpus功能简介** isolcpus功能用于在SMP均衡调度算法中将一个或多个CPU孤立出来。同时可通过亲和性设置将进程置于 “孤立CPU”运行,isolcpus后面所跟的 CPU参数,可设置孤立0~最大CPU个数-1个CPU。 **性能提升** * 降低调度器的性能 * 减少其他任务可以运行的cpu资源 **注意事项** * 不建议孤立/隔离0-1号CPU,因为它们一半是网卡中断以及各种中断使用。 * 仅建议孤立一个numa节点的靠后面计数的CPU核心,给像是redis或者是nginx这样的高CPU的应用使用。 **使用说明** 1. 在grub中修改启动设置,添加 `isolcpus=6,7`。 2. 重启机器。 3. 使用 `taskset -c 1-4` 等命令绑定CPU。 4. 测试结果差异不大,可能需要多次测试才能看到提升。 **其他设置** * 使用 `taskset -c 7 ./redis-server redis.conf` 等命令对服务器进行绑定。 * 使用 `./redis-benchmark -h 127.0.0.1 -p 6379 -c 1000 -n 100000 ping` 等命令测试服务器的性能。

正文

isolcpus的学习与了解


前言

最近一直跟同事说要进行CPU的bind 
bind到具体的core
当时还一直装B, 说这样能够提高性能.
但是今天起床早上查看资料时发现,其实是先设置隔离的. 
让操作系统的scheduler不往这些CPU上面执行调度
再使用taskset的方式执行绑定才可以. 

知识简介

isolcpus功能存在已久,Kernel v2.6.11(2005年)那时内核就已经存在了isolcpus功能。
根据kernel-parameters.txt 上的解释,”isolcpus功能用于在SMP均衡调度算法中将一个或多个CPU
孤立出来。同时可通过亲和性设置将进程置于 “孤立CPU”运行,isolcpus后面所跟的cpu参数,
可设置孤立0~最大CPU个数-1个cpu。这种方法是推荐使用的孤立cpu的方式,
与手动设置每个任务的亲和性相比,后一种方式降低了调度器的性能”。

isolcpus带来的好处是有效地提高了孤立cpu上任务运行的实时性。
该功能在保证孤立cpu上任务的运行,同时减少了其他任务可以运行的cpu资源,
所以需要使用前对cpu资源进行规划
From: https://blog.csdn.net/weixin_39094034/article/details/122104295

原理分析

现阶段CPU的技术发展,在同一个NUMA节点内部有多个CPU的Core
这里CPU为了性能, 每一个CPU都有独享的L1和L2的cache. 更重要他有自己的TLB还有寄存器
因为cc高速缓存一致性的要求, 一般多核共享L3, 很多高端CPU还有一些off-CPU的L4的SRAM的cache

所以能够将这个核心 避免被调度使用, 仅使用目标进程的话性能是最好的
这样他的TLB, 他的寄存器几乎切换就会很少. 上线文和中断也会变少. 

但是这里还有一个注意事项. 不建议孤立/隔离0-1号CPU, 他们一半是网卡中断以及各种中断使用.
所以建议可以孤立一个numa节点的靠后面计数的CPU核心,给像是redis或者是nginx这样的高CPU的应用使用. 

所以这里主要是两个工具命令 isolcpus 隔离孤立CPU taskse他手动将进程绑定到具体的CPU核心

具体命令的使用

需要使用grub修改启动设置,将几个CPU停止调度.
其实测试比较难, 因为机器压力比较小, 估计效果不明显. 
注意如下操作非常危险. 要做好机器宕机的准备, 建议自己务必多测试,尤其是标点符号一个字符都不能错.
以我这边的 OpenEuler22.03举例进行说明
vim /boot/grub2/grub.cfg
可以查找 vmlinuz 的关键词. 注意一般至少有两行, 一行是标准启动,一行是救援启动. 建议只需要改标准的,不要改rescue的. 
在 rhgb quiet 附近添加上: isolcpus=6,7
注意不能用连接符, 只能用英文逗号, 设置完保存,然后重启. 
为了测试验证,可以先进行孤立CPU之前测试一把,再重新测试一把. 

手工绑定CPU可以使用 taskset -c 1-4 进行绑定, 这里可以用 范围符号(-) 或者是枚举(,)

需要说明, 必须机器压力大的情况下才更有效果,如果压力不大并且机器专用的话,效果不明显.

简单测试-isolcpus之前

测试命令 针对redis的ping测试
 ./redis-benchmark -h 127.0.0.1 -p 6379 -c 1000 -n 100000 ping
 不做任何绑定 多次测试的结果为:
56850.48 

对server 进行绑定内核 7 
taskset -c 7 ./redis-server redis.conf
测试脚本为:
taskset -c 6 ./redis-benchmark -h 127.0.0.1 -p 6379 -c 1000 -n 100000 ping
58173.36
# 感觉误差就够了.. 这个破玩意真不准. 每次测试能插10%
# 我用虚拟机感觉不太靠谱. 只是感觉大概有 4%左右的提升.
# 不过我突发奇想, client和server在一起会怎么样...
taskset -c 7 ./redis-benchmark -h 127.0.0.1 -p 6379 -c 1000 -n 100000 ping
33978.93
# 这个差距就明显了..
# 为了准确我重启一下再验证.
# 重启压力最小时的确能搞 2000TPS左右. 准备进行一些其他设置. 

简单测试-孤立CPU之后

对server 进行绑定内核 7 
taskset -c 7 ./redis-server redis.conf
测试脚本为:
taskset -c 6 ./redis-benchmark -h 127.0.0.1 -p 6379 -c 1000 -n 100000 ping
结果差异不大 !-_-!
56116.72  甚至还下降了....
又是虚拟机,有没啥压力, 所以测试结果不具备说服性...
我感觉压力大 并且是物理机 多种应用 网络复杂比较大时效果应该是可以的. 

与isolcpus的学习与了解相似的内容: