ape:anannota*onlanguageand% …ochipara/presentations/icse2014.pdf · netact" or 3g 4g....
TRANSCRIPT
APE: An Annota*on Language and Middleware for Energy-‐Efficient Mobile Applica*on Development
Nima Nikzad, Octav Chipara†, and William G. Griswold
[email protected] Dept. of Computer Science and Engineering, UC San Diego
Dept. of Computer Science, University of Iowa†
Growth of Con*nuously-‐Running Mobile Applica*ons
• Runs in background, out of user’s sight • Periodic workloads • OIen delay-‐tolerant • e.g., health monitoring, sports and news feeds, social networking
2
How can we run many CRM applica3ons while minimizing impact on ba:ery life?
Low-‐ and Applica*on-‐level Op*miza*ons are Both Needed
• Low-‐level Op2miza2ons can only do so much
• DVFS, Nckless kernels, radio scheduling, batched writes to flash, etc…
• Applica2on-‐level Op2miza2ons are necessary • Workload shaping, filtering, piggy-‐backing radio transmission, etc… • Take advantage of applica2on specific behavior
3
Thread uploadThread = new Thread(new Runnable() { while(true) { try { Thread.sleep(1200000); // Sleep 20 min. } catch(InterruptedException e) { attemptUpload(); } }); uploadThread.start();
Case Study: Naïve Upload in Ci*Sense
4
CO, NO2, O3
Alerts, Maps
Small Transmissions à Big Impact
5
t
Power
6 sec.
12 sec.
1 W
10 mW
t
Power
Piggybacking is Effec*ve for Amor*zing Cost of Communica*on
6
1 W
10 mW
Thread uploadThread = new Thread(new Runnable() { while(true) { Intent batt = context.registerReceiver(null, new IntentFilter(Intent.ACTION_BATTERY_CHANGED)); int lvl = batt.getIntExtra(BatteryManager.EXTRA_LEVEL, -‐1); int scl = batt.getIntExtra(BatteryManager.EXTRA_SCALE, -‐1); float batteryPct = lvl / (float) scl; try { if(batteryPct > 70) { Thread.sleep(1200000); } else { Thread.sleep(3600000); } } catch(InterruptedException e) { attemptUpload(); } }); uploadThread.start(); TelephonyManager teleManager = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE); TransListener transListener = new TransListener(); teleManager.listen(transListener, PhoneStateListener.LISTEN_DATA_ACTIVITY); private class TransListener extends PhoneStateListener { public void onDataActivity(int act) { if(act == TelephonyManager.DATA_ACTIVITY_IN || act == TelephonyManager.DATA_ACTIVITY_OUT || act == TelephonyManager.DATA_ACTIVITY_INOUT) { uploadThread.interrupt(); } } }
Code is Quickly Complicated by Power-‐Management Policy
7
Thread uploadThread = new Thread(new Runnable() { while(true) { try { Thread.sleep(1200000); } catch(InterruptedException e) { attemptUpload(); } }); uploadThread.start();
Thread uploadThread = new Thread(new Runnable() { while(true) { try { Thread.sleep(1200000); } catch(InterruptedException e) { attemptUpload(); } }); uploadThread.start(); TelephonyManager teleManager = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE); TransListener transListener = new TransListener(); teleManager.listen(transListener, PhoneStateListener.LISTEN_DATA_ACTIVITY); private class TransListener extends PhoneStateListener { public void onDataActivity(int act) { if(act == TelephonyManager.DATA_ACTIVITY_IN || act == TelephonyManager.DATA_ACTIVITY_OUT || act == TelephonyManager.DATA_ACTIVITY_INOUT) { uploadThread.interrupt(); } } }
Building Energy-‐Efficient Apps is Not Simple!
• Code for power-‐management tends to be complex • Highly applicaNon specific
• Trade-‐off: Energy vs Timeliness and/or Accuracy • Thread management, event and state change handling
• OpNmizaNons should be postponed unNl applicaNon requirements are set • Use cases and ‘acceptable’ delay may change over Nme • But… Retrofiengà Time + Bugs
8
What Do Energy-‐Management Policies Typically Look like?
• We examined the latest research, best-‐pracNce guides, documentaNon, and open-‐source projects • Android Best PracNce Guide, AT&T Research, [Wang09], [Nath12], [Nikzad12], [Musolesi10], Cyanogen Project
• Common thread: Timing and Device State!
• “Wait unNl _______ before execuNng _______”
9
APE is a Declara*ve Annota*on Language and Run*me for Policies
10
Thread uploadThread = new Thread(new Runnable() { while(true) { Intent batt = context.registerReceiver(null, new IntentFilter(Intent.ACTION_BATTERY_CHANGED)); int lvl = batt.getIntExtra(BatteryManager.EXTRA_LEVEL, -‐1); int scl = batt.getIntExtra(BatteryManager.EXTRA_SCALE, -‐1); float batteryPct = lvl / (float) scl; try { if(batteryPct > 70) { Thread.sleep(120000); } else { Thread.sleep(360000); } } catch(InterruptedException e) { attemptUpload(); } }); uploadThread.start(); TelephonyManager teleManager = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE); TransListener transListener = new TransListener(); teleManager.listen(transListener, PhoneStateListener.LISTEN_DATA_ACTIVITY); private class TransListener extends PhoneStateListener { public void onDataActivity(int act) { if(act == TelephonyManager.DATA_ACTIVITY_IN || act == TelephonyManager.DATA_ACTIVITY_OUT || act == TelephonyManager.DATA_ACTIVITY_INOUT) { uploadThread.interrupt(); } } }
Thread uploadThread = new Thread(new Runnable() { while(true) { @APE_If(“Battery.Level > 70%”) @APE_WaitUntil(“Network.Active”, MaxDelay=1200) @APE_Else() @APE_WaitUntil(“Network.Active”, MaxDelay=3600) attemptUpload(); } }); uploadThread.start();
Rest of this Talk
11
cG ≥ 20 min : true
start
true : Net.Activity
while(true) { @APE_WaitUntil(“Net.Active”, MaxDelay=1200) uploadSensorData(); }
OR
WiFi AND
OR NetAct
3G 4G
The APE Policy Model EffecNvely Modeling Policies Using Timed Automata • Clarify semanNcs
• Drive design of language and runNme
12
Many Policies Can Be Expressed Using Simple Timed Automata
13
Wait up to 20 minutes for cellular network ac5vity
cG ≥ 20 min : true
start
true : Net.Activity
P = ({(Accel.Move, ∞), (GPS.Drive, 30 sec)}, ∞)
More Complicated Policies Can Fall Back to Earlier States
Wait for movement using the accelerometer, then wait up to thirty seconds for driving to be detected
14
true : Accel.Move
cAcc ≥ 30 sec : true
true : GPS.Drive start
Many Policies Can Be Expressed Using Very Simple Timed Automata
Wait up to 20 minutes for cellular network ac5vity
15
P = ({(Net.Active, ∞)}, 20 min)
cG ≥ 20 min : true
start
true : Net.Activity
The APE Annota*on Language RepresenNng Power-‐management Policies as AnnotaNons • Expressing simple Nmed automata using text
16
while(true) { @APE_WaitUntil(“Net.Active”, MaxDelay=1200 PreWait=“log(‘Started waiting for activity…’)”, PostWait=“log(‘Activity detected!’)”) uploadSensorData(); }
while(true) { @APE_WaitUntil(“Net.Active”, MaxDelay=1200) uploadSensorData(); }
APE_WaitUn*l: Wait For Desired Device State
17
P = ({(Net.Active, ∞)}, 20 min)
Wait up to 20 minutes for cellular network ac5vity
APE_WaitUn*l: Wait For Desired Device State
18
P = ({(Accel.Move, ∞), (GPS.Drive, 30 sec)}, ∞)
while(true) { @APE_WaitUntil(“({accMove()},inf), ({gpsDrive()},30)”, MaxDelay=inf) downloadDriveData(); }
Wait for movement using the accelerometer, then wait up to thirty seconds for driving to be detected
Other APE Constructs • if-‐else constructs
• CreaNng new terms and saving policies
19
while(true) { @APE_If(“Battery.Level > 70%”) @APE_WaitUntil(“Net.Active”, MaxDelay=1800) @APE_Else() @APE_WaitUntil(“WiFi.Connected”, MaxDelay=3600) uploadSensorData(); }
@APE_DefineTerm(“MyTerm”, “Battery.Charging AND (WiFi.Connected OR Cell.4G)”)
@APE_DefinePolicy(“MyPolicy”, “(Display.Off,inf),(MyTerm,10)”)
The APE Middleware Service RunNme Hardware Monitoring on Behalf of Client Apps • Minimizing overhead associated with monitoring
20
Annota*ons are Processed at Compile-‐*me into Run*me Requests
21
APE Annotated Source
Source Including Generated
APE Requests
APE AnnotaNon Preprocessor
Clients Start Up the APE Service and Send Requests at Run*me
22
Client Process A
Android System
Bind me to the APE Service APE Service
Client Process B
Bind me to the APE Service
WaitUnNl(1)
A.1: Net.AcNve
B.1: …
A.1: Net.AcNve
Register “Net.AcNve” as 1
APE Service
A.1: Net.AcNve
B.1: …
APE Returns Control to the Calling Thread Once the Request is Sa*sfied
23
Android System
Client Process A
Client Process B
Tell me about changes in cellular state
Data outgoing on cellular radio
Return WaitUnNl(1)
Boolean Expressions Are Transformed into Expression Trees
24
WiFi.Connected OR Network.AcNve AND (Cell.3G OR Cell.4G) OR
WiFi AND
OR NetAct
3G 4G
APE Service
The APE Service Performs Device State Monitoring on Behalf of Clients
25
OR
WiFi AND
OR NetAct
3G 4G
Network State Monitor
Android System
F
F F
F F
F F
F F T F
T
T
T
T
T
T
Evalua*on A Case Study of OpNmizing a CRM ApplicaNon Using APE • How complicated are policies in pracNce?
• What are the potenNal benefits and overhead?
26
Thread uploadThread = new Thread(new Runnable() { while(true) { Intent batt = context.registerReceiver(null, new IntentFilter(Intent.ACTION_BATTERY_CHANGED)); int lvl = batt.getIntExtra(BatteryManager.EXTRA_LEVEL, -‐1); int scl = batt.getIntExtra(BatteryManager.EXTRA_SCALE, -‐1); float batteryPct = lvl / (float) scl; try { if(batteryPct > 70) { Thread.sleep(1200000); } else { Thread.sleep(3600000); } } catch(InterruptedException e) { attemptUpload(); } }); uploadThread.start(); TelephonyManager teleManager = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE); TransListener transListener = new TransListener(); teleManager.listen(transListener, PhoneStateListener.LISTEN_DATA_ACTIVITY); private class TransListener extends PhoneStateListener { public void onDataActivity(int act) { if(act == TelephonyManager.DATA_ACTIVITY_IN || act == TelephonyManager.DATA_ACTIVITY_OUT || act == TelephonyManager.DATA_ACTIVITY_INOUT) { uploadThread.interrupt(); } } }
Thread uploadThread = new Thread(new Runnable() { while(true) { @APE_If(“Battery.Level > 70%”) @APE_WaitUntil(“Network.Active”, MaxDelay=1200) @APE_Else() @APE_WaitUntil(“Network.Active”, MaxDelay=3600) attemptUpload(); } }); uploadThread.start();
Case Study: Ci*Sense
27
Thread uploadThread = new Thread(new Runnable() { while(true) { @APE_If(“Battery.Level > 70%”) @APE_WaitUntil(“WiFi.Connected OR Network.Active AND (Cell.3G OR Cell.4G)”, MaxDelay=1200) @APE_Else() @APE_WaitUntil(“WiFi.Connected OR Network.Active AND (Cell.3G OR Cell.4G)”, MaxDelay=3600) attemptUpload(); } }; uploadThread.start();
Four APE annota2ons versus 45 lines of Java (thread suspension/waking, new class for handling callbacks, registering for callbacks)
Device Power ConsumpNon
Background Apps Can Repeatedly Wake Resources
28
Six applicaNon instances with no piggybacking
The Simplest of Policies Can Have a Big Impact on Power-‐Consump*on
29
Six applicaNon instances with @APE_WaitUntil(“Net.Active”, MaxDelay=120)
Device Power ConsumpNon
0
100
200
300
400
500
600
0 1 2 3 4 5
Increase in Pow
er Con
sump2
on (m
W)
Number of Addi2onal Applica2ons
APE Apps Non-‐APE Apps
Increase in power consumpNon aIer first instance
The Simplest of Policies Can Have a Big Impact on Power-‐Consump*on
30
Increase of 13.49 mw (1.6%)
Increase of 551.06 mw (63.7%)
Overhead of Execu*ng Each WaitUn*l Call vs Hand-‐coded
31
0
5
10
15
20
25
1 3 7 15 31 63 127 191 255 383 511
Time to Resolve (m
s)
State Expression Length
Overhead of IPC measured to be 1.71 ms
Longest Expression from CiNSense
Limita*ons and Future Work
• Assumes developer is already aware of opportuniNes for energy savings • Under Development: AutomaNcally idenNfying costly operaNons and suggesNng safe, effecNve policies
• User study to properly evaluate APE’s ease-‐of-‐use and sufficient expressibility of language
32
Conclusion • Use of 2ming is widely applicable for power-‐management in mobile applicaNons
• A simple annota2on language and run2me can make this technique conveniently accessible to programmers
• Timed automata provide a seman2c model that informs the design of language and runNme
• APE significantly eases the implementa2on of policies in CiNSense and achieves drama2c power-‐savings
33
Acknowledgement • This work was supported by the NaNonal Science FoundaNon and the Roy J. Carver Charitable Trust
34
William Griswold UC San Diego
Octav Chipara Univ. of Iowa
Conclusion • Use of 2ming is widely applicable for power-‐management in mobile applicaNons
• A simple annota2on language and run2me can make this technique conveniently accessible to programmers
• Timed automata provide a seman2c model that informs the design of language and runNme
• APE significantly eases the implementa2on of policies in CiNSense and achieves drama2c power-‐savings
35
DON’T USE -‐ Anima*on back up
36
t
Power
DON’T USE -‐ Anima*on back up
37
t
Power
38
t
Power
Challenge: Managing Energy-‐Consump*on in CRM Apps
39
• Timing plays a significant role in energy-‐consumpNon
• Waking the CPU • Transmieng data • Powering the display
Limited ba:ery!
t
Power
Transmit as much as possible at this Nme!
CO, N
O2, O3
Alerts, Maps
Thread uploadThread = new Thread(new Runnable() { while(true) { try { Thread.sleep(120000); } catch(InterruptedException e) { attemptUpload(); } }; uploadThread.start();
Case Study: Ci*Sense
40
Thread uploadThread = new Thread(new Runnable() { while(true) { @APE_If(“Battery.Level > 70%”) @APE_WaitUntil(“Network.Active”, MaxDelay=1200) @APE_Else() @APE_WaitUntil(“Network.Active”, MaxDelay=3600) attemptUpload(); } }; uploadThread.start();
Thread uploadThread = new Thread(new Runnable() { while(true) { Intent batt = context.registerReceiver(null, new IntentFilter(Intent.ACTION_BATTERY_CHANGED)); int lvl = batt.getIntExtra(BatteryManager.EXTRA_LEVEL, -‐1); int scl = batt.getIntExtra(BatteryManager.EXTRA_SCALE, -‐1); float batteryPct = lvl / (float) scl; try { if(batteryPct > 70) { Thread.sleep(120000); } else { Thread.sleep(360000); } } catch(InterruptedException e) { attemptUpload(); } }; uploadThread.start();
Thread uploadThread = new Thread(new Runnable() { while(true) { Intent batt = context.registerReceiver(null, new IntentFilter(Intent.ACTION_BATTERY_CHANGED)); int lvl = batt.getIntExtra(BatteryManager.EXTRA_LEVEL, -‐1); int scl = batt.getIntExtra(BatteryManager.EXTRA_SCALE, -‐1); float batteryPct = lvl / (float) scl; try { if(batteryPct > 70) { Thread.sleep(120000); } else { Thread.sleep(360000); } } catch(InterruptedException e) { attemptUpload(); } }; uploadThread.start(); TelephonyManager teleManager = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE); TransListener transListener = new TransListener(); teleManager.listen(transListener, PhoneStateListener.LISTEN_DATA_ACTIVITY); private class TransListener extends PhoneStateListener { public void onDataActivity(int act) { if(act == TelephonyManager.DATA_ACTIVITY_IN || act == TelephonyManager.DATA_ACTIVITY_OUT || act == TelephonyManager.DATA_ACTIVITY_INOUT) { uploadThread.interrupt(); } } }
Thread uploadThread = new Thread(new Runnable() { while(true) { Intent batt = context.registerReceiver(null, new IntentFilter(Intent.ACTION_BATTERY_CHANGED)); int lvl = batt.getIntExtra(BatteryManager.EXTRA_LEVEL, -‐1); int scl = batt.getIntExtra(BatteryManager.EXTRA_SCALE, -‐1); float batteryPct = lvl / (float) scl; try { if(batteryPct > 70) { Thread.sleep(120000); } else { Thread.sleep(360000); } } catch(InterruptedException e) { attemptUpload(); } }; uploadThread.start();
Thread uploadThread = new Thread(new Runnable() { while(true) { Intent batt = context.registerReceiver(null, new IntentFilter(Intent.ACTION_BATTERY_CHANGED)); int lvl = batt.getIntExtra(BatteryManager.EXTRA_LEVEL, -‐1); int scl = batt.getIntExtra(BatteryManager.EXTRA_SCALE, -‐1); float batteryPct = lvl / (float) scl; try { if(batteryPct > 70) { Thread.sleep(120000); } else { Thread.sleep(360000); } } catch(InterruptedException e) { attemptUpload(); } }; uploadThread.start(); TelephonyManager teleManager = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE); TransListener transListener = new TransListener(); teleManager.listen(transListener, PhoneStateListener.LISTEN_DATA_ACTIVITY); private class TransListener extends PhoneStateListener { public void onDataActivity(int act) { if(act == TelephonyManager.DATA_ACTIVITY_IN || act == TelephonyManager.DATA_ACTIVITY_OUT || act == TelephonyManager.DATA_ACTIVITY_INOUT) { uploadThread.interrupt(); } } }
CO, N
O2, O3
Alerts, Maps
Thread uploadThread = new Thread(new Runnable() { while(true) { try { Thread.sleep(120000); } catch(InterruptedException e) { attemptUpload(); } }; uploadThread.start();
Case Study: Ci*Sense
41
Thread uploadThread = new Thread(new Runnable() { while(true) { @APE_If(“Battery.Level > 70%”) @APE_WaitUntil(“Network.Active”, MaxDelay=1200) @APE_Else() @APE_WaitUntil(“Network.Active”, MaxDelay=3600) attemptUpload(); } }; uploadThread.start();
APE: Annotated Programming for Energy-‐Efficiency
• A small and declara2ve annota2on language with a lightweight middleware run2me for Android • Demarcate power-‐hungry code using annotaNons • ExecuNon deferred unNl device enters state that minimizes cost of operaNon
• Abstract away details of event/state monitoring
• Abstract model based on 2med automata • Guides design of language and middleware
42
Outline • IntroducNon • Approaches to Energy-‐Management • APE: Annotated Programming for Energy-‐efficiency • Policy Model • AnnotaNon Language • RunNme Service
• EvaluaNon • Case Study: CiNSense • Overhead and Power Savings
• Conclusion
43
The APE Policy Model • Restricted form of 5med automata:
• Σ is a finite set of events • 𝑆 is a finite set of states • 𝑠0∈𝑆 is the start state • 𝑆𝐹⊆𝑆 is a set of accepNng states • 𝐶 is a finite set of clocks, and • 𝐸 is a transiNon funcNon
44
𝑇𝐴=(Σ, 𝑆, 𝑠0, 𝑆𝐹, 𝐶, 𝐸)
Alur, Rajeev, and David L. Dill. "A theory of Nmed automata." Theore5cal computer science 126.2 (1994): 183-‐235.
Typical Automata Can Be Expressed Textually
• 𝜎i is a Boolean expression consisNng of events and states • 𝑡i is a constraint on how long to wait for 𝜎i to be true • 𝑡𝑀𝑎𝑥𝐷𝑒𝑙𝑎𝑦 is an upper bound on the delay of O
• Linear, concise nature is easy to express in wriNng • Drove design of annotaNon language
45
𝑃=({(𝜎1,𝑡1), (𝜎2,𝑡2)…(𝜎𝑛,𝑡𝑛)},𝑡𝑀𝑎𝑥𝐷𝑒𝑙𝑎𝑦)
A Policy is a Sequence of Boolean Expressions and Timing Constraints • Defer the execuNon of an operaNon O unNl a finite sequence of states holds:
• 𝜎i is a Boolean expression consisNng of events and states
• 𝑡i is a constraint on how long to wait for 𝜎i to be true • 𝑡𝑀𝑎𝑥𝐷𝑒𝑙𝑎𝑦 is an upper bound on the delay of O
• If 𝜎𝑖 is saNsfied before 𝑡𝑖, begin monitoring for 𝜎𝑖+1 • Else, begin monitoring for 𝜎𝑖-‐1 again • Execute O once 𝜎𝑛 is saNsfied or 𝑡𝑀𝑎𝑥𝐷𝑒𝑙𝑎𝑦 has passed
46
𝑃=({(𝜎1,𝑡1), (𝜎2,𝑡2)…(𝜎𝑛,𝑡𝑛)},𝑡𝑀𝑎𝑥𝐷𝑒𝑙𝑎𝑦)
Simplified Model: Limits Power for Conciseness
• Wait for driving to be detected a@er 30 seconds of con5nuous accelerometer movement
47
Not expressible in our model!
Allow for dynamic selecNon of policies at runNme
APE_If, APE_ElseIf, APE_Else: Condi*onals for Policy Selec*on
48
while(true) { @APE_If(“Battery.Level > 70%”) @APE_WaitUntil(“Net.Active”, MaxDelay=1800) @APE_Else() @APE_WaitUntil(“WiFi.Connected”, MaxDelay=3600) uploadSensorData(); }
@APE_WaitUntil(“MyPolicy, ({dataReady()},30)”, MaxDelay=3600) @APE_WaitUntil(“MyPolicy(inf,60), ({dataReady()},30)”, MaxDelay=3600)
APE_DefineTerm, APE_DefinePolicy: Enabling Reuse
49
@APE_DefineTerm(“MyTerm”, “Battery.Charging AND (WiFi.Connected OR Cell.4G)”)
@APE_WaitUntil(“{requestPending()} AND MyTerm”, MaxDelay=3600) @APE_DefinePolicy(“MyPolicy”, “(Display.Off,inf),(MyTerm,10)”)
while(true) { APEService.wait_until(1, 1800); uploadSensorData(); }
while(true) { @APE_WaitUntil(“WiFi.Connected”, MaxDelay=1800) uploadSensorData(); }
void onCreate(Bundle savedInstanceState) { super(savedInstanceState); … }
void onCreate(Bundle savedInstanceState) { super(savedInstanceState); APEService.register_expr(1, “WiFi.Connected”); … }
Annota*ons are Processed at Compile-‐*me into Run*me Requests
50
APE Run2me Service
The APE Service Performs Device State Monitoring on Behalf of Clients
51
Client App A
Android APIs
Client App B Client App C
Conclusion • A small and declara2ve annota2on language with a lightweight middleware run2me for Android • Demarcate power-‐hungry code using annotaNons • ExecuNon deferred unNl device enters state that minimizes cost of operaNon
• Abstract away details of event/state monitoring
• Manage trade-‐off between 2ming and energy
• In a case study, a policy implemented with only six annota2ons dras2cally improved efficiency • 86% reducNon in lines of power-‐management code
52
Two Categories of Approaches to Energy-‐Management
• Low-‐level Op2miza2ons: DVFS, Nckless kernels, radio scheduling, batched writes to flash, etc… • Implemented in kernel, driver, or firmware • Responsibility of the device and OS vendors
• System-‐level Op2miza2ons: workload shaping, filtering, piggy-‐backing radio transmission, etc… • Implemented at applicaNon level • Responsibility of the applica2on developers
53