78
Drowsy Power Management Matthew Lentz James Litton Bobby Bhattacharjee University of Maryland

Drowsy Power Management - University Of Maryland · Event Event Event = Pull data from remote server over WiFi. Power Management States ... Drowsy Power Management Wake up only what

  • Upload
    lephuc

  • View
    214

  • Download
    1

Embed Size (px)

Citation preview

Drowsy Power Management

Matthew Lentz James Litton Bobby BhattacharjeeUniversity of Maryland

Background Energy Consumption

Fetch Remote Data Communicate with Nearby Device(s) Receive Push Notification Sample Sensor(s) . . .

Mobile devices consume energy without human-interaction

Many (periodic) short-lived events executed:

Power Trace with Events

Power Trace with Events

EventEvent

Event = Pull data from remote server over WiFi

Power Management States

Suspend

Off

On

System in low-power state Memory retains contents

Event

Power Management StatesOnOn

Suspend

Off

On

System in low-power state Memory retains contents

Event

Suspend

Power Management StatesOnOn

Suspend

Off

On

System in low-power state Memory retains contents

Event

Suspend

Power Management States

WiFi Controller Power-Save Mode

… …

OnOn

Suspend

Off

On

System in low-power state Memory retains contents

Event

Suspend

Power Trace with EventsOnOn

EventEvent

Suspend

Power Trace with EventsOnOn

EventEvent

What Happens During a Wakeup?

What Happens During a Wakeup?

Interrupt (from RTC Alarm)

Suspend→On

What Happens During a Wakeup?

Interrupt (from RTC Alarm)

What Happens During a Wakeup?

Suspend→On Event

Interrupt (from RTC Alarm)

What Happens During a Wakeup?

Suspend→On Event

Objects held by applications and drivers When all locks released, can enter Suspend

Wakelocks

Interrupt (from RTC Alarm)

What Happens During a Wakeup?

Suspend→On Event

Interrupt (from RTC Alarm)

What Happens During a Wakeup?

Suspend→On Event On→Suspend

Interrupt (from RTC Alarm)

What Happens During a Wakeup?Acquire wakelockFetch update over WiFiSet future wakeup alarmRelease wakelock

Suspend→On Event On→Suspend

Interrupt (from RTC Alarm)

Transitions are InefficientTransitions account for 75% of total energy consumption!

Suspend→On Event On→Suspend

Transitions are InefficientTransitions account for 75% of total energy consumption!

Transitions for Other Events

RTC Alarm (ALM)Bluetooth Connection (BT2)

Push Notification (PSH)Sample Accelerometer (SEN)

85%32%

23%89%

Suspend→On Event On→Suspend

Transitions are InefficientTransitions account for 75% of total energy consumption!

Suspend→On Event On→Suspend

On → Suspend

On → Suspend

Flush filesystem buffers Freeze all tasks Suspend all devices Disable non-boot CPUs Set RAM to self-refresh

1

2

3

4

* Wait for interrupt

5

*

1 2 345

On → Suspend

Flush filesystem buffers Freeze all tasks Suspend all devices Disable non-boot CPUs Set RAM to self-refresh

1

2

3

4

* Wait for interrupt

5

*

1 2 3452 3

2

3

Suspend → On

Suspend → On

Enable CPUs Resume all devices Thaw all tasks

1

2

3

2 31

Suspend → On

Enable CPUs Resume all devices Thaw all tasks

1

2

3

2 31

2

3

2 3

Drowsy Power Management

Wake up only what is necessary

Drowsy Power Management

Wake up only what is necessary

{ }Necessary for Pull Data:

Drowsy Power Management

Wake up only what is necessary

{ }Necessary for Pull Data: Alarm Device WiFi Device

System ServicesApplicationa

Drowsy Power Management

Wake up only what is necessary

{ }Necessary for Pull Data: Alarm Device WiFi Device

System ServicesApplicationa

{ }Unnecessary:USB Device

SD Card Device

Calendar App

Bluetooth Device

Power Regulator Devices

Power Regulators

Input Devices

Battery Monitoring Device

Drowsy Power Management

Construct minimal “wake set” of tasks and devices

Drowsy Power Management

Construct minimal “wake set” of tasks and devices

Smallest set that maintains correct behavior

Drowsy Power Management

Construct minimal “wake set” of tasks and devices

Expand on-demand as event progresses

Smallest set that maintains correct behavior

Drowsy Power Management

Constraint: No modifications to user-space

Construct minimal “wake set” of tasks and devices

Expand on-demand as event progresses

Smallest set that maintains correct behavior

Transitions To/From Drowsy

Suspend

Drowsy

Resume all devices Enable CPUs

3

2

1

Flush filesystem buffers

Disable non-boot CPUs Set RAM to self-refresh

1

2

3

4

5

Freeze all tasks Suspend all devices

Thaw all tasks

Transitions To/From Drowsy

Suspend

Drowsy

Resume all devices Enable CPUs

3

2

1

Flush filesystem buffers

Disable non-boot CPUs Set RAM to self-refresh

1

2

3

4

5

3

2

Freeze all tasks Suspend all devices

Thaw previously running tasks

Transitions To/From Drowsy

Suspend

Drowsy

Resume all devices Enable CPUs

3

2

1

Flush filesystem buffers

Disable non-boot CPUs Set RAM to self-refresh

1

2

3

4

5

3

2

Freeze all tasks Suspend all devices

Thaw previously running tasks

On CPU or Run Queue

Transitions To/From Drowsy

Suspend

Drowsy

Resume all devices Enable CPUs

3

2

1

Flush filesystem buffers

Disable non-boot CPUs Set RAM to self-refresh

1

2

3

4

5

3

2

Freeze all tasks Suspend all devices

Wake Set = { <Prev. Running Tasks> }

Thaw previously running tasks

Transitions To/From Drowsy

Suspend

Drowsy

Resume all devices Enable CPUs

3

2

1

Flush filesystem buffers

Disable non-boot CPUs Set RAM to self-refresh

1

2

3

4

5

3

2

Freeze all tasks Suspend all devices

Thaw previously running tasks

Wake Set = { <Prev. Running Tasks> }

Transitions To/From Drowsy

Suspend

Drowsy

Resume all devices Enable CPUs

3

2

1

Flush filesystem buffers

Disable non-boot CPUs Set RAM to self-refresh

1

2

3

4

5

3

2

Freeze all tasks Suspend all devices

Thaw previously running tasks

Wake Set = { <Prev. Running Tasks> }

Wake Set = { <Prev. Running Tasks>, Task }

Wake Set = { <Prev. Running Tasks>, Task, Device, … }

Transitions To/From Drowsy

Suspend

Drowsy

Resume all devices Enable CPUs

3

2

1

Flush filesystem buffers

Disable non-boot CPUs Set RAM to self-refresh

1

2

3

4

5

3

2

2

3

Freeze tasks in wake set Suspend devices in wake set

Thaw previously running tasks

Wake Set = { <Prev. Running Tasks> }

Wake Set = { <Prev. Running Tasks>, Task }

Wake Set = { <Prev. Running Tasks>, Task, Device, … }

Constructing the Wake Set

Task A

Tim

e

ioctl() command to device

open() named pipe

read() from pipe

Run (I/O)Run (CPU) Run (Device I/O)Task States:

Constructing the Wake SetBlocked

Blocks waiting on condition to be met

Run (I/O)Run (CPU) Run (Device I/O)Task States:

Task A

Tim

e

open() named pipe

read() from pipe

ioctl() command to deviceioctl()

Constructing the Wake Set

Task B Task A

Satisfies

condition

BlockedRun (I/O)Run (CPU) Run (Device I/O)Task States:

Tim

e

write() to pipe

Blocks waiting on condition to be met

open() named pipe

read() from pipe

ioctl() command to deviceioctl()

Constructing the Wake Set

Task B Task A

Satisfies

condition

BlockedRun (I/O)Run (CPU) Run (Device I/O)Task States:

Tim

e

write() to pipe

Blocks waiting on condition to be met

open() named pipe

read() from pipe

Constructing the Wake SetFrozenBlockedRun (I/O)Run (CPU) Run (Device I/O)Task States:

Tim

e

Task B Task A

Suspended

Constructing the Wake SetFrozenBlockedRun (I/O)Run (CPU) Run (Device I/O)Task States:

Tim

e

Task B Task A

Suspended

Transition to Suspend (All wakelocks released)

Constructing the Wake SetFrozenBlockedRun (I/O)Run (CPU) Run (Device I/O)Task States:

Tim

e

Task B Task A

Suspended

Transition to Suspend (All wakelocks released)

Transition to Drowsy

Constructing the Wake Set

Wake Set =

{ Task B, Task A }

{ Task B, Task A, Device }

Task B Task A

Tim

e

FrozenBlockedRun (I/O)Run (CPU) Run (Device I/O)Task States:

Suspended

Constructing the Wake Set

Wake Set =

{ Task B, Task A }

{ Task B, Task A, Device }

Task B Task A

Tim

e

{ Task B }

FrozenBlockedRun (I/O)Run (CPU) Run (Device I/O)Task States:

Suspended

Constructing the Wake Set

Wake Set =

{ Task B, Task A }

{ Task B, Task A, Device }

Task B Task A

Tim

e

{ Task B }

FrozenBlockedRun (I/O)Run (CPU) Run (Device I/O)Task States:

Suspended

Constructing the Wake Set

Wake Set =

{ Task B, Task A }

{ Task B, Task A, Device }

Task B Task A

Tim

e

{ Task B }

FrozenBlockedRun (I/O)Run (CPU) Run (Device I/O)Task States:

Suspended

Drowsy Wake Set: Pull Data

IRQ 48

msm-ssbi.0

IRQ 362 IRQ 479

platform rtc-pm8xxx

/dev/alarm AlarmManager ActivityManager

Benchmark

binder

log_main wlan0

PowerManager

pm8921-coremsmgpio rtc0

alarm

wcnss_wlan.0

mpdecision Worker

Compiler

cpu1

cpu2

cpu3

Binder_1 Binder_1 Binder_2

Binder_3

Binder_4

ServerThread

flush-179:0

flush-0:17

Time (ms)

cpu

0 ms 4 ms 6 ms 26 ms 41 ms 91 ms 98 ms13 ms

DeviceTask Wakeup Chained IRQIRQ

Resume(Thaw Running Tasks)

Suspend(Sync Filesystem Buffers)

IRQ 48

msm-ssbi.0

IRQ 362 IRQ 479

platform rtc-pm8xxx

/dev/alarm AlarmManager ActivityManager

Benchmark

binder

log_main wlan0

PowerManager

pm8921-coremsmgpio rtc0

alarm

wcnss_wlan.0

mpdecision Worker

Compiler

cpu1

cpu2

cpu3

Binder_1 Binder_1 Binder_2

Binder_3

Binder_4

ServerThread

flush-179:0

flush-0:17

Time (ms)

cpu

0 ms 4 ms 6 ms 26 ms 41 ms 91 ms 98 ms13 ms

DeviceTask Wakeup Chained IRQIRQ

Resume(Thaw Running Tasks)

Suspend(Sync Filesystem Buffers)

Drowsy Wake Set: Pull Data

IRQ 48

msm-ssbi.0

IRQ 362 IRQ 479

platform rtc-pm8xxx

/dev/alarm AlarmManager ActivityManager

Benchmark

binder

log_main wlan0

PowerManager

pm8921-coremsmgpio rtc0

alarm

wcnss_wlan.0

mpdecision Worker

Compiler

cpu1

cpu2

cpu3

Binder_1 Binder_1 Binder_2

Binder_3

Binder_4

ServerThread

flush-179:0

flush-0:17

Time (ms)

cpu

0 ms 4 ms 6 ms 26 ms 41 ms 91 ms 98 ms13 ms

DeviceTask Wakeup Chained IRQIRQ

Resume(Thaw Running Tasks)

Suspend(Sync Filesystem Buffers)

IRQ 48

msm-ssbi.0

IRQ 362 IRQ 479

platform rtc-pm8xxx

/dev/alarm AlarmManager ActivityManager

Benchmark

binder

log_main wlan0

PowerManager

pm8921-coremsmgpio rtc0

alarm

wcnss_wlan.0

mpdecision Worker

Compiler

cpu1

cpu2

cpu3

Binder_1 Binder_1 Binder_2

Binder_3

Binder_4

ServerThread

flush-179:0

flush-0:17

Time (ms)

cpu

0 ms 4 ms 6 ms 26 ms 41 ms 91 ms 98 ms13 ms

DeviceTask Wakeup Chained IRQIRQ

Resume(Thaw Running Tasks)

Suspend(Sync Filesystem Buffers)

Drowsy Wake Set: Pull Data

IRQ 48

msm-ssbi.0

IRQ 362 IRQ 479

platform rtc-pm8xxx

/dev/alarm AlarmManager ActivityManager

Benchmark

binder

log_main wlan0

PowerManager

pm8921-coremsmgpio rtc0

alarm

wcnss_wlan.0

mpdecision Worker

Compiler

cpu1

cpu2

cpu3

Binder_1 Binder_1 Binder_2

Binder_3

Binder_4

ServerThread

flush-179:0

flush-0:17

Time (ms)

cpu

0 ms 4 ms 6 ms 26 ms 41 ms 91 ms 98 ms13 ms

DeviceTask Wakeup Chained IRQIRQ

Resume(Thaw Running Tasks)

Suspend(Sync Filesystem Buffers)

IRQ 48

msm-ssbi.0

IRQ 362 IRQ 479

platform rtc-pm8xxx

/dev/alarm AlarmManager ActivityManager

Benchmark

binder

log_main wlan0

PowerManager

pm8921-coremsmgpio rtc0

alarm

wcnss_wlan.0

mpdecision Worker

Compiler

cpu1

cpu2

cpu3

Binder_1 Binder_1 Binder_2

Binder_3

Binder_4

ServerThread

flush-179:0

flush-0:17

Time (ms)

cpu

0 ms 4 ms 6 ms 26 ms 41 ms 91 ms 98 ms13 ms

DeviceTask Wakeup Chained IRQIRQ

Resume(Thaw Running Tasks)

Suspend(Sync Filesystem Buffers)

15 tasks thawed & 16 devices resumed

1.8% 1.9%

Implementation

Implemented Drowsy within Android kernel

Platform: Google Nexus 4 (“Mako”)

SLOC: ~4,600

Version: 4.2.2 (Fork of Linux 3.4)

Instrumenting Android

For determining when to add tasks/devices to wake set

Instrumenting Android

For determining when to add tasks/devices to wake set

Example: file_operations

.open = &drv_open

.read = &drv_read

.write = &drv_write

struct file_operations d_fops:

Example: file_operations

.open = &drv_open

.read = &drv_read

.write

.write_impl = &drv_write= &drowsy_write

struct file_operations d_fops:

Example: file_operations

.open = &drv_open

.read = &drv_read

.write

.write_impl = &drv_write= &drowsy_write

struct file_operations d_fops:

int drowsy_write(File *f, …) Device *d = fileToDevice(f) if(d!state == Suspended)

resumeDevice(d)

f!f_ops.write_impl(f, …)

Evaluation: Benchmarking

Handle I/O Event

Acquire Wakelock

Suspend

Release Wakelock

Suspend

Set a future wakeup alarm Accept incoming Bluetooth connection Fetch weather update (and set alarm) Receive incoming push notification Sample the accelerometer (and set alarm)

ALM BT2 PUL PSH SEN

→On →Drowsy

On→ Drowsy→

Evaluation: Measurement

V Pho

neI Ph

one

IPhone = VShunt / RShunt Time

Evaluation: Measurement

V Pho

neI Ph

one

IPhone = VShunt / RShunt Time

Evaluation: Measurement

V Pho

neI Ph

one

V Pho

toIPhone = VShunt / RShunt Time

Evaluation: MeasurementLED Toggled On

(Software Timestamp)

V Pho

neI Ph

one

V Pho

toIPhone = VShunt / RShunt Time

Improvement: Wakeup Events (1 Core, Powersave)

Plus (1 Core, Powersave) Plus

Improvement: Wakeup Events

Drowsy is 1.5-5x as energy efficient

(1 Core, Powersave) Plus (1 Core, Powersave) Plus

Improvement: Wakeup Events

cpuidle entered deep idle states more often

in the Drowsy state

Drowsy is 1.5-5x as energy efficient

(1 Core, Powersave) Plus (1 Core, Powersave) Plus

Improvement: Wakeup Events (1 Core, Powersave)

Plus (1 Core, Powersave) Plus

Wakeup Cycle: Pull DataAndroid Event

Suspend→OnOn→Suspend

Drowsy Event & Wake Set

Suspend

Drowsy

Drowsy

Suspend

Wakeup Cycle: Pull DataAndroid Event

Suspend→OnOn→Suspend

Drowsy Event & Wake Set

Suspend

Drowsy

Drowsy

Suspend

Wakeup Cycle: Pull DataAndroid

WiFi Tail Energy

Event

Suspend→OnOn→Suspend

Improvement: Battery Life

Improvement: Battery Life

Converges to 0% as the interval increases

Improvement: Battery Life

Converges to 0% as the interval increases

Benefits of Drowsy aggregate across all

applications on device

Summary

Source code is available at:

www.cs.umd.edu/projects/drowsy/

Drowsy wakes up the minimal set of tasks and devicesis 1.5 - 5x as energy efficient for short-lived events

Existing power management not optimized for short-lived events