工作线程的命名约定

工作线程的命名约定

我开始阅读有关工作线程的内容。旧的旧工作线程被工作池替换。

$ ps -ef | grep 'kworker' 
root          6      2  0 04:41 ?        00:00:00 [kworker/0:0H-kb]
root         20      2  0 04:41 ?        00:00:00 [kworker/1:0H-kb]
root         26      2  0 04:41 ?        00:00:00 [kworker/2:0H]
root         31      2  0 04:41 ?        00:00:00 [kworker/3:0-mm_]
root         32      2  0 04:41 ?        00:00:00 [kworker/3:0H-kb]
root         38      2  0 04:41 ?        00:00:00 [kworker/4:0H-kb]
root         44      2  0 04:41 ?        00:00:00 [kworker/5:0H-kb]
root         71      2  0 04:41 ?        00:00:00 [kworker/5:1-mm_]
root         76      2  0 04:41 ?        00:00:00 [kworker/u257:0-]
root        391      2  0 04:41 ?        00:00:02 [kworker/0:1H-kb]
root        394      2  0 04:41 ?        00:00:01 [kworker/2:1H-kb]
root        395      2  0 04:41 ?        00:00:00 [kworker/5:1H-kb]
root        415      2  0 04:41 ?        00:00:03 [kworker/3:1H-kb]
root        416      2  0 04:41 ?        00:00:00 [kworker/4:1H-kb]
root        418      2  0 04:41 ?        00:00:00 [kworker/1:1H-kb]
root        869      2  0 04:41 ?        00:00:00 [kworker/u257:1-]
root       9632      2  0 05:49 ?        00:00:00 [kworker/2:0-mm_]
root       9684      2  0 06:00 ?        00:00:00 [kworker/0:0-eve]
root       9685      2  0 06:00 ?        00:00:00 [kworker/1:0-eve]
root       9809      2  0 06:07 ?        00:00:00 [kworker/5:2-cgr]
root       9885      2  0 06:17 ?        00:00:00 [kworker/4:0-eve]
root       9915      2  0 06:32 ?        00:00:00 [kworker/3:1-cgr]
root       9937      2  0 06:47 ?        00:00:00 [kworker/2:1-cgr]
root       9970      2  0 07:14 ?        00:00:00 [kworker/u256:2-]
root       9990      2  0 07:31 ?        00:00:00 [kworker/u256:1-]
root      10010      2  0 07:32 ?        00:00:00 [kworker/0:2-eve]
root      10011      2  0 07:32 ?        00:00:00 [kworker/1:1-eve]
root      14977      2  0 07:37 ?        00:00:00 [kworker/4:2-eve]
root      17905      2  0 07:42 ?        00:00:00 [kworker/u256:0-]

任何人都可以提供 kworker/... 命名约定的文档...例如 [kworker/u256:2-] 中的 u256:2- 是什么

答案1

语法是:kworker/%u:%d%s (cpu, id, priority)
不知道u,看起来它指定了未绑定的CPU

https://www.kernel.org/doc/Documentation/kernel-per-CPU-kthreads.txt
如何解释 kworker 线程名称?

答案2

kworker 任务名称对其 CPU 亲和性(如果有)、id、其友好性(如果有)以及工作队列名称或描述进行编码。由于通信字段的大小相对较小,大多数工作队列名称通常会被截断。

例如,kworker 通讯字段

kworker/6:11-mm_

表示 ID 为 11 的 CPU 6 的 kworker 内核线程执行名称以 开头的工作队列mm_

要获取所有可能的工作队列名称的列表,基本上必须 grep linux 内核源代码,例如:

$ grep 'alloc_workqueue("[^"]\+"' . -ro  | grep '"mm'
./drivers/mmc/core/block.c:alloc_workqueue("mmc_complete"
./drivers/mmc/host/omap.c:alloc_workqueue("mmc_omap"
./drivers/staging/greybus/sdio.c:alloc_workqueue("mmc-%s"
./mm/vmstat.c:alloc_workqueue("mm_percpu_wq"

所以我们在这里处理mm_percpu_wq工作队列。


另请参阅 kworker 任务如何被建造:

    if (pool->cpu >= 0)
        snprintf(id_buf, sizeof(id_buf), "%d:%d%s", pool->cpu, id,
             pool->attrs->nice < 0  ? "H" : "");
    else
        snprintf(id_buf, sizeof(id_buf), "u%d:%d", pool->id, id);

    worker->task = kthread_create_on_node(worker_thread, worker, pool->node,
                          "kworker/%s", id_buf);

因此,该u字符表示池 ID 而不是 CPU 编号(对于没有 CPU 亲和性的 kworkers),并H表示负的好值。

另请参阅工作队列名称如何以通讯后缀结尾

相关内容