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

5533

被折叠的 条评论
为什么被折叠?



