Domanda

C'è un modo per vedere quanti contesto cambia ogni thread genera? (Sia dentro che fuori, se possibile) Sia in X / s, o per farlo funzionare e dare i dati aggregati dopo qualche tempo. (Sia su Linux o su Windows)

Ho trovato solo strumenti che danno il numero-context switching aggregato per tutto il sistema operativo o per processo.

Il mio programma fa interruttori molti di contesto (50k / s), probabilmente un sacco non è necessario, ma non sono sicuro da dove iniziare a ottimizzare, in cui fanno la maggior parte di coloro che accada.

È stato utile?

Soluzione

sui recenti sistemi GNU / Linux si può usare SystemTap per raccogliere i dati desiderati in ciascuna chiamata a sched_switch (). L'esempio schedtimes.stp è probabilmente un buon punto di partenza: http://sourceware.org /systemtap/examples/keyword-index.html#SCHEDULER

Altri suggerimenti

Linux

ho scritto un piccolo script per vedere i dettagli di uno specifico thread del processo. Con l'esecuzione di questo script è possibile vedere contesto passare pure.

if [ "$#" -ne 2 ]; then
    echo "INVALID ARGUMENT ERROR: Please use ./see_thread.sh processName threadNumber"
    exit
fi
ls /proc/`pgrep $1`/task | head -n$2 | tail -n+$2>temp
cat /proc/`pgrep $1`/task/`cat temp`/sched

Spero che questo vi aiuterà.

Ho uno script bash che calcola contesto volontario e non volontario interruttori fatta da un filo durante un determinato periodo di tempo. Non sono sicuro se questo servirà il vostro scopo, ma vi posterò comunque.

Questo script è un loop su tutti i thread di un processo e la registrazione "voluntary_ctxt_switches" & "nonvoluntary_ctxt_switches" da /proc/< process-id>/task/< thread-id>/status. Quello che faccio è generalmente registrare questi contatori all'inizio di una corsa prestazioni e registrare di nuovo alla fine della corsa e quindi calcolare la differenza come interruttori totale vol & non-vol CTX durante la corsa prestazioni.

pid=`ps -ef | grep <process name> | grep $USER | grep -v grep | awk '{print $2}'`
echo "ThreadId;Vol_Ctx_Switch;Invol_Ctx_Switch"
for tid in `ps -L --pid ${pid}  | awk '{print $2}'`
do
    if [ -f /proc/$pid/task/$tid/status ]
    then
        vol=`cat /proc/$pid/task/$tid/status | grep voluntary_ctxt_switches | grep -v nonvoluntary_ctxt_switches | awk '{print $NF}'`
        non_vol=`cat /proc/$pid/task/$tid/status | grep nonvoluntary_ctxt_switches | awk '{print $NF}'`
    fi
    echo "$tid;$vol;$non_vol"
done

Script è po 'pesante, nel mio processo di caso ha circa 2500 le discussioni. Tempo totale di raccogliere interruttori CTX è di circa 10 secondi.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top