작업자 스레드의 명명 규칙

작업자 스레드의 명명 규칙

나는 작업자 스레드에 대해 읽기 시작했습니다. 이전 작업자 스레드는 작업자 풀로 대체됩니다.

$ 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_.

가능한 모든 작업 대기열 이름 목록을 얻으려면 기본적으로 Linux 커널 소스 코드를 grep해야 합니다. 예를 들면 다음과 같습니다.

$ 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문자는 CPU 번호(CPU 선호도가 없는 kworker의 경우)가 아닌 풀 ID를 나타내며 H좋은 음수 값을 나타냅니다.

또한보십시오작업 대기열 이름이 통신 접미사로 끝나는 방식.

관련 정보