affinity

本文介绍了SylixOS操作系统中关于CPU亲和性的管理工具`affinity`,包括如何显示、设置和清除进程或线程的CPU亲和性。通过设置亲和性,可以确保线程在特定CPU上运行,提高性能,特别是在多核系统中,避免了CPU缓存的无效命中。`affinity`命令的使用方法和其实现原理通过示例进行了详细阐述。

1.affinity 介绍

affinity可以显示或者设置进程或线程调度的CPU集合,用户可以通过这个命令手动绑定线程或者进程到指定CPU运行。

2.命令参数

affinity有三种使用方法,分别是显示当前设置的亲和度配置,设置或者清除设置的亲和度配置。

[root@sylixos:/root]# help affinity 
set / clear process or thread cpu affinity.
affinity 1 0         set process 1 affinity to cpu 0
affinity 1 clear     clear process 1 affinity
affinity [pid | thread id] [cpu id | 'clear']

图 2.1 a f f i n i t y 使 用 方 法 图2.1affinity 使用方法 2.1affinity使

2.1 显示亲和度信息

在shell中使用affinity不加任何参数的情况下,可以显示当前线程或进程调度CPU的信息,同时affinity信息也保存在“/proc/kernel/affinity ”文件中。

[root@sylixos:/root]# affinity 
      NAME         TID    PID  CPU
---------------- ------- ----- ---
t_idle0          4010000     0   0
t_idle1          4010001     0   1
t_itimer         4010002     0   *
t_isrdefer       4010003     0   *
t_except         4010004     0   *
t_log            4010005     0   *
t_power          4010006     0   *
t_hotplug        4010007     0   *
t_reclaim        4010009     0   *
t_compat_xtimer  401000a     0   *
t_tasklet        401000b     0   *
t_wq             401000c     0   *
t_delayed_wq     401000d     0   *
t_net_notifier   401000e     0   *
t_sdhcisdio      401000f     0   *
t_sdhcisdio      4010010     0   *
t_sync           4010011     0   *
t_dcwpipe        4010012     0   *
t_fts_isr        4010013     0   *
t_netjob         4010014     0   *
t_netjob         4010015     0   *
t_netproto       4010016     0   *
t_snmp           4010017     0   *
t_ftpd           4010018     0   *
t_telnetd        4010019     0   *
t_tshell         401001c     0   *

从显示的信息中可以看到,线程的名字(NAME)、线程ID(TID)、进程ID(PID)、调度的CPU(CPU)。着重看下CPU这一栏,看到有三种不同的值,这里解释一下:
t_idle0和t_idle1的调度CPU分别是0和1,这是由于测试我的测试平台是双核(SMP),SylixOS会为调用每个CPU创建一个IDLE线程。使用“_CreateIdleThread”为每一个SMP CPU创建空闲线程时,指定了线程属性选项“LW_OPTION_THREAD_AFFINITY_ALWAYS”,总是锁定一个CPU执行。而“*”代表着线程并未设置锁定CPU运行,也就是线程控制块的成员“TCB_ulCPULock”为False,每一个CPU都有机会调度此线程。

2.2设置亲和度

通过线程ID设置亲和度,t_tshell的线程ID是401001c,执行命令如下:

[root@sylixos:/root]# affinity 401001c 1
affinity set thread 0x401001c to cpu 1 ok.

通过设置t_tshell线程亲和度之后,可以看到CPU显示部分已经变为了1。

[root@sylixos:/root]# affinity 
      NAME         TID    PID  CPU
---------------- ------- ----- ---
t_idle0          4010000     0   0
t_idle1          4010001     0   1
t_itimer         4010002     0   *
t_isrdefer       4010003     0   *
t_except         4010004     0   *
t_log            4010005     0   *
t_power          4010006     0   *
t_hotplug        4010007     0   *
t_reclaim        4010009     0   *
t_compat_xtimer  401000a     0   *
t_tasklet        401000b     0   *
t_wq             401000c     0   *
t_delayed_wq     401000d     0   *
t_net_notifier   401000e     0   *
t_sdhcisdio      401000f     0   *
t_sdhcisdio      4010010     0   *
t_sync           4010011     0   *
t_dcwpipe        4010012     0   *
t_fts_isr        4010013     0   *
t_netjob         4010014     0   *
t_netjob         4010015     0   *
t_netproto       4010016     0   *
t_snmp           4010017     0   *
t_ftpd           4010018     0   *
t_telnetd        4010019     0   *
t_tshell         401001c     0   1

2.3清除亲和度

通过清除t_tshell线程亲和度之后,可以看到CPU显示部分已经变为了*。

[root@sylixos:/root]# affinity 401001c clear
affinity clear thread 0x401001c ok.
[root@sylixos:/root]# affinity
      NAME         TID    PID  CPU
---------------- ------- ----- ---
t_idle0          4010000     0   0
t_idle1          4010001     0   1
t_itimer         4010002     0   *
t_isrdefer       4010003     0   *
t_except         4010004     0   *
t_log            4010005     0   *
t_power          4010006     0   *
t_hotplug        4010007     0   *
t_reclaim        4010009     0   *
t_compat_xtimer  401000a     0   *
t_tasklet        401000b     0   *
t_wq             401000c     0   *
t_delayed_wq     401000d     0   *
t_net_notifier   401000e     0   *
t_sdhcisdio      401000f     0   *
t_sdhcisdio      4010010     0   *
t_sync           4010011     0   *
t_dcwpipe        4010012     0   *
t_fts_isr        4010013     0   *
t_netjob         4010014     0   *
t_netjob         4010015     0   *
t_netproto       4010016     0   *
t_snmp           4010017     0   *
t_ftpd           4010018     0   *
t_telnetd        4010019     0   *
t_tshell         401001c     0   *

3.技术实现

SylixOS实现affinity主要是通过设置线程控制块中的TCB_bCPULock和TCB_ulCPULock进行实现的,具体设置代码可参考_ThreadAffinity.c中的_ThreadSetAffinity()。
在这里插入图片描述
图 3.1 线 程 设 置 亲 和 度 图3.1 线程设置亲和度 3.1线
如果有设置亲和度TCB_bCPULock会变为True,同时使用TCB_ulCPULock记录了锁定执行的CPU索引,这里有一点需要注意,虽然SylixOS使用了亲和性调度CPU集合,但是从代码可以看到只能记录一个绑定的CPU,也就是SylisOS只使用最低有效绑定的CPU,其他忽略处理。

4.总结

CPU的亲和性, 就是进程要在指定的 CPU 上尽量长时间地运行而不被迁移到其他处理器,也称为CPU关联性;再简单的点的描述就将制定的进程或线程绑定到相应的cpu上;在多核运行的机器上,每个CPU本身自己会有缓存,缓存着进程使用的信息,而进程可能会被OS调度到其他CPU上,如此,CPU cache命中率就低了,当绑定CPU后,程序就会一直在指定的cpu跑,不会由操作系统调度到其他CPU上,性能有一定的提高。

5.参考资料

  1. linux进程、线程与cpu的亲和性(affinity).
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值