Como obter (do terminal) o número total de threads (por processo e total para todos os processos)

32

Tentei pesquisar no Google, mas não consigo encontrá-lo. Estou à procura de:

  1. número de threads no processo X

  2. número total de threads em execução atualmente

NoSenseEtAl
fonte

Respostas:

53

Para obter o número de threads para um determinado pid:

ps -o nlwp <pid>

Para obter a soma de todos os threads em execução no sistema:

ps -eo nlwp | tail -n +2 | awk '{ num_threads += $1 } END { print num_threads }'
jcollado
fonte
11
ps -o nlwp <pid>retorna NLWP :), o que isso significa?
Siddharth
2
@Siddharth NLWP significa Number of LightWeight Processes, que é o número de threads.
Jcollado # 7/13
Você pode suprimir o "NLWP" com "h" (ocultar cabeçalhos); ou seja:ps h -o nlwp $pid
bufh
7

Para encontrar o número de threads executando um único processo, você pode olhar /proc/<pid>/status. Ele deve listar o número de threads como um dos campos.

anaken78
fonte
3

Estou baseando esta resposta ao redor ps axms. psé uma ótima ferramenta para listar o que está sendo executado.

Se você deseja filtrar isso por um processo, tente algo como isto:

echo $(( `ps axms | grep firefox | wc -l`  - 1))

Subtraímos 1 porque grep será exibido nessa lista.

Para todos os threads em geral, isso deve funcionar:

echo $(( `ps axms | wc -l`  - 1))

Subtraímos um desta vez porque há uma linha de cabeçalho.

Oli
fonte
Isso é impreciso, pois relata um encadeamento extra por processo
Score_Under 29/01
1

Para obter o número total de threads (pequenas partes de um processo em execução simultaneamente) de um, você pode usar o comando ps -o nlwp <pid>Funciona o tempo todo. Mas se você preferir tentar vê-lo através de um arquivo. você provavelmente deve olhar para os arquivos que foram criados para todo e qualquer processo do sistema. Lá você pode obter os detalhes finais do processo. Para todo e qualquer processo, há uma pasta criada /proc/<pid>lá, você pode ver todos os outros detalhes também.

Laksith
fonte
1

No Linux especificamente, aqui está uma maneira de fazê-lo por processo:

#!/bin/sh
while read name val; do
    if [ "$name" = Threads: ]; then
        printf %s\\n "$val"
        return
    fi
done < /proc/"$1"/status

Em seguida, você pode invocar esse script com um PID como argumento e ele relatará o número de threads pertencentes a esse processo.

Para obter a contagem de threads para todo o sistema, basta:

#!/bin/sh
count() {
    printf %s\\n "$#"
}
count /proc/[0-9]*/task/[0-9]*

Essas abordagens podem parecer um pouco pouco ortodoxas, pois dependem muito dos recursos de shell, mas, em troca, são mais rápidas do que as abordagens correspondentes pse awkbaseadas em minha máquina (embora também não criem threads extras próprios para pipes). Lembre-se de que o shell lançado para executar esses scripts terá um thread próprio (ou mais, se você estiver usando uma implementação estranha).

Score_Under
fonte