核心小技巧——強制設定程序執行核 select_task_rq
阿新 • • 發佈:2019-01-05
故障定位過程中,業務程序沒有做核繫結,導致每次都是通過負載均衡動態選擇執行核,
導致很多時候業務程序出現在核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; } }
完美解決需求,故障定位效率更高了。