blob: ebdef210b3b09f160e9763cc621d2509fe841e7d (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
|
#!/bin/bash
set -e
set -x
${0%%-run}-check run
host=$HOST
target=$TARGET
spec=$SPEC
config=$CONFIG
opts="$@"
if [ "$host" != "$target" ]; then
local=false
else
local=true
fi
doservices=true
dofreqscaling=true
dotaskbind=true
donetwork=false
spec=$(cd $spec; pwd)
if ssh $target echo \$USER | grep root; then
sudo=
else
sudo=sudo
fi
if $doservices && \
(ssh $target $sudo initctl list >/dev/null || ssh $target croutonversion >/dev/null 2>&1); then
# Stop all but few services. Note all stopped services in stopped-services
# file to restart them after benchmarks. Network and SSH server are
# handled separately.
sudo_old=$sudo
if ssh $target croutonversion >/dev/null 2>&1; then
# For Crouton chroot back into Chrome OS to stop services.
sudo="$sudo chroot /proc/1/root sudo"
keep="dbus\|boot-services\|shill\|wpasupplicant"
keep="$keep\|tty2"
else
keep="dbus\|ssh\|network"
keep="$keep\|tty1"
fi
rm -f $spec/stopped-services
touch $spec/stopped-services
for s in $(ssh $target $sudo initctl list | grep running | cut -f 1 -d " "); do
echo $s | grep "$keep" && echo KEEPING $s && continue
echo STOPPING $s && ssh $target $sudo stop $s || true
echo $s >> $spec/stopped-services
done
sudo=$sudo_old
fi
# Disable frequency scaling
old_governor=""
if $dofreqscaling; then
old_governor=$(ssh $target cpufreq-info -p | cut -f 3 -d " ")
if [ "x$old_governor" = "x" ] || ! ssh $target $sudo cpufreq-set -g performance; then
old_governor=""
echo FREQUENCY SCALING NOT SUPPORTED
fi
fi
# Bind all existing processes to CPU #0. We then run benchmarks on CPU #1.
if $dotaskbind && \
(ssh $target $sudo taskset -a -p 0x1 1); then
ssh $target "for p in \$(ps ax --format='%p' | tail -n +2); do $sudo taskset -a -p 0x1 \$p 2>&1; done | wc"
else
echo CPU BIND NOT SUPPORTED
fi
# Figure out how to stop/start network.
if $donetwork && \
(ssh $target croutonversion >/dev/null 2>&1); then
network_before="$sudo chroot /proc/1/root /bin/bash -c 'stop shill && stop wpasupplicant' && sleep 2"
network_after="$sudo chroot /proc/1/root /bin/bash -c 'start wpasupplicant && start shill' && $sudo /sbin/iptables -P INPUT ACCEPT"
elif $donetwork && \
(ssh $target "$sudo stop network-interface INTERFACE=lo && $sudo start network-interface INTERFACE=lo"); then
network_before="$sudo stop network-interface INTERFACE=eth0 && sleep 2"
network_after="$sudo start network-interface INTERFACE=eth0"
elif $donetwork && \
(ssh $target "$sudo ifdown lo && $sudo ifup lo"); then
network_before="$sudo ifdown eth0 && sleep 2"
network_after="$sudo ifup eth0"
else
network_before="echo NETWORK CONTROL NOT SUPPORTED"
network_after="echo NETWORK CONTROL NOT SUPPORTED"
fi
if ssh $target "$sudo initctl status ssh" | grep process; then
ssh_before="$sudo stop ssh"
ssh_after="$sudo start ssh"
elif ssh $target croutonversion >/dev/null 2>&1; then
ssh_before="$sudo /etc/init.d/ssh stop"
ssh_after="$sudo /etc/init.d/ssh start"
else
ssh_before="$sudo /etc/init.d/sshd stop"
ssh_after="$sudo /etc/init.d/sshd start"
fi
cmd="true"
cmd="$cmd && $ssh_before"
cmd="$cmd && $network_before"
cmd="$cmd && ps auxf"
cmd="$cmd && (cd $spec && . shrc && runspec -c $config $opts) || true"
cmd="$cmd && $network_after"
cmd="$cmd && $ssh_after"
if $local; then
runspec_log="$spec/runspec.$(date +%Y%m%dT%H%M%S)"
touch $runspec_log
tail -f $runspec_log &
tail_pid=$!
nohup env -i /bin/bash -l -c "$cmd" > $runspec_log 2>&1
kill $tail_pid
else
# Send /the/ command.
ssh -fn $target "nohup /bin/bash -c \"$cmd\" 2>&1 > $spec/runspec.$(date +%Y%m%dT%H%M%S) 2>&1 &"
# Sleep till SSH server on the board is back online.
date
sleep 10
set +x
while ! ssh $target true 2>/dev/null ; do sleep 10; done
set -x
fi
# Undo benchmark environment preparations.
if $dotaskset && \
(ssh $target $sudo taskset -a -p 0xFFFFFFFF 1); then
ssh $target "for p in \$(ps ax --format='%p' | tail -n +2); do $sudo taskset -a -p 0xFFFFFFFF \$p 2>&1; done | wc"
else
echo CPU BIND NOT SUPPORTED
fi
if [ "x$old_governor" != "x" ]; then
ssh $target $sudo cpufreq-set -g $old_governor
fi
if $doservices && \
(ssh $target $sudo initctl list >/dev/null || ssh $target croutonversion >/dev/null 2>&1); then
sudo_old=$sudo
if ssh $target croutonversion >/dev/null 2>&1; then
sudo="$sudo chroot /proc/1/root sudo"
fi
for s in $(cat $spec/stopped-services); do
echo STARTING $s && ssh $target $sudo start $s || true
done
rm -f $spec/stopped-services
sudo=$sudo_old
fi
|