summaryrefslogtreecommitdiffstats
path: root/src/seastar/scripts/seastar-cpu-map.sh
diff options
context:
space:
mode:
Diffstat (limited to 'src/seastar/scripts/seastar-cpu-map.sh')
-rwxr-xr-xsrc/seastar/scripts/seastar-cpu-map.sh54
1 files changed, 54 insertions, 0 deletions
diff --git a/src/seastar/scripts/seastar-cpu-map.sh b/src/seastar/scripts/seastar-cpu-map.sh
new file mode 100755
index 000000000..e6cc41efa
--- /dev/null
+++ b/src/seastar/scripts/seastar-cpu-map.sh
@@ -0,0 +1,54 @@
+#!/bin/bash
+# !
+# ! Usage: ./seastar-cpu-map.sh -p <process_PID> -n <process_Name> -s (optional) <shard>
+# !
+# ! List CPU affinity for a particular running process
+# ! providing a map of threads -> shard, for any seastar apps.
+# ! Ex.: ./seastar-cpu-map.sh -n scylla
+# ! ./seastar-cpu-map.sh -n scylla -s 0
+# ! ./seastar-cpu-map.sh -p 34
+# ! ./seastar-cpu-map.sh -p 32 -s 12
+
+usage() {
+ cat $0 | grep ^"# !" | cut -d"!" -f2-
+}
+
+while getopts 'p:n:s:' option; do
+ case "$option" in
+ p) PID=$OPTARG
+ ;;
+ n) PID=`pgrep --newest --exact $OPTARG`
+ ;;
+ s) SHARD=$OPTARG
+ ;;
+ :) printf "missing argument for -%s\n" "$OPTARG" >&2
+ usage >&2
+ exit 1
+ ;;
+ \?) printf "illegal option: -%s\n" "$OPTARG" >&2
+ usage >&2
+ exit 1
+ ;;
+ esac
+done
+
+if [ $# -eq 0 ]; then usage >&2; exit 1; fi
+
+if [ -e "/proc/$PID/task" ]; then
+ # get list of threads for given PID
+ THREADS=`ls /proc/$PID/task`
+ for i in $THREADS; do
+ # get shards from threads
+ # there were three options here to get the shard number:
+ # reactor-xx, syscall-xx and timer-xx
+ # syscall was preferred because reactor as a special case (reactor-0 is called scylla)
+ SYSCALL=`grep syscall /proc/$i/comm | cut -d"-" -f2`
+ if [ -n "$SYSCALL" ] && [ "$SYSCALL" = "$SHARD" ]; then
+ echo -e "shard: $SYSCALL, cpu:$(taskset -c -p $i | cut -d":" -f2)"
+ elif [ -n "$SYSCALL" ] && [ -z "$SHARD" ]; then
+ echo -e "shard: $SYSCALL, cpu:$(taskset -c -p $i | cut -d":" -f2)"
+ fi
+ done
+else
+ echo "Process does not exist"
+fi