1. 程式人生 > >核心小技巧——強制設定程序執行核 select_task_rq

核心小技巧——強制設定程序執行核 select_task_rq

故障定位過程中,業務程序沒有做核繫結,導致每次都是通過負載均衡動態選擇執行核,

導致很多時候業務程序出現在核0上死迴圈(系統態),串列埠都沒反應。

由於是第三方負責啟動,無法通過taskset命令指定核號啟動。不過我們知道執行程序的ELF名字,因此想到是否可以通過核心強制設定程序執行核號。

關鍵函式select_task_rq(),通過對比程序名字強制設定核號。

/*
 * The caller (fork, wakeup) owns p->pi_lock, ->cpus_allowed is stable.
 */
static inline
int select_task_rq(struct task_struct *p, int cpu, int sd_flags, int wake_flags)
{
	if (p->nr_cpus_allowed > 1)
		cpu = p->sched_class->select_task_rq(p, cpu, sd_flags, wake_flags);

	/*
	 * In order not to call set_task_cpu() on a blocking task we need
	 * to rely on ttwu() to place the task on a valid ->cpus_allowed
	 * cpu.
	 *
	 * Since this is common to all placement strategies, this lives here.
	 *
	 * [ this allows ->select_task() to simply return task_cpu(p) and
	 *   not worry about this generic constraint ]
	 */
	if (unlikely(!cpumask_test_cpu(cpu, tsk_cpus_allowed(p)) ||
		     !cpu_online(cpu)))
		cpu = select_fallback_rq(task_cpu(p), p);
    /* 通過程序名字強制設定執行核 */
    if(!strcmp(p->comm, "Proc_Name")){
        return 7;
    }else{
	    return cpu;
    }    
}

完美解決需求,故障定位效率更高了。