Wie überprüfe ich unter Linux die CPU-Affinität eines Prozesses und seiner Threads?

9

Wie überprüfe ich unter Linux die CPU-Affinität eines Prozesses und seiner Threads?

JamesThomasMoon1979
quelle
Warum tust du das? Könnten Sie bei einem Multithread-Prozess, bei dem Ihnen die Affinität am tasksetHerzen liegt, cgroups nicht ausführen oder nutzen, damit alle Kinder die Affinitäten respektieren?
ewwhite
@ewwhite Ich mache das, um die Affinität zu überprüfen, nachdem ich sie eingestellt habe. Ich frage nicht, wie oder warum die Affinität eingestellt werden soll.
JamesThomasMoon1979
OI C ... Eigentlich nicht wirklich. Sie haben nicht erklärt, warum Sie nach diesen Informationen suchen.
ewwhite
@ewwhite Das Warum ist zu überprüfen, ob für die Threads eines Programms die erwartete Affinität festgelegt wurde. Dies sind meist unabhängige Verarbeitungsthreads auf einem Multicore-Computer.
JamesThomasMoon1979

Antworten:

11

Es ist ziemlich einfach. Sammeln Sie alle Prozess-IDs und Thread-IDs und rufen Sie das Programm auf taskset. Mögen,

taskset -cp 2
taskset -cp 4
…


Alle nach Prozessnamen drucken

tasksethat das --all-tasksoptionale Argument

taskset --all-tasks -p $(pgrep java)

Bei einigen Prozessen werden --all-tasksanscheinend nicht alle untergeordneten Prozesse gedruckt (in meinen Tests wurden keine untergeordneten Prozesse gedruckt kthreadd, ich bin mir nicht sicher, warum das so ist).

Drucken Sie alles nach Hilfeskript für den Prozessnamen

Hier ist ein kurzes Linux-Shell-Skript zum Drucken der CPU-Affinität für einen Prozess nach Namen und allen untergeordneten Threads.

#!/usr/bin/env bash

set -eu

pname=${1:-kthreadd}  # default to 'kthreadd'
for pid in $(pgrep "${pname}"); do
    echo "PID: ${pid} (${pname})"
    for tid in $(pgrep -P "${pid}" | tr '\n' ' '); do
        taskset -cp "${tid}"
    done
done

Ausgänge

PID: 2 (kthreadd)
pid 4's current affinity list: 0
pid 6's current affinity list: 0
pid 7's current affinity list: 0
pid 8's current affinity list: 0

Getestet auf Ubuntu 12, Bash 4.

JamesThomasMoon1979
quelle