私はワーカースレッドについて読み始めました。以前のワーカースレッドはワーカープールに置き換えられます。
$ 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
良いことを示します。
また見てくださいジョブキュー名が通信サフィックスで終わる方法。