ThingsMigrate - Home | UBC Blogsblogs.ubc.ca/karthik/files/2018/07/ThingsMigrate_ecoop...Migration...

Post on 16-Oct-2020

1 views 0 download

transcript

ThingsMigratePlatform-independent and stateful migration of JavaScript programs

Julien Gascon-SamsonKumseok JungShivanshu GoyalArmin Rezaiean-AselKarthik Pattabiraman

World of computing in 2018

2

World of computing in 2018

Internet of Things

3

World of computing in 2018

Internet of ThingsWeb of Things

4

World of computing in 2018

Internet of ThingsWeb of ThingsIndustry 4.0

5

World of computing in 2018

Internet of ThingsWeb of ThingsIndustry 4.0

Cloud-edge

6

World of computing in 2018

Internet of ThingsWeb of ThingsIndustry 4.0

Cloud-edge

Massive Computer Network

7

World of computing in 2018

8

Cloud

World of computing in 2018

9

Cloud IoT

World of computing in 2018

10

IoTSingle Machine Cloud Cluster

Home Network

Corporate Network

Homogeneous Heterogeneous

World of computing in 2018

11

Cloud

World of computing in 2018

12

Cloud

World of computing in 2018

13

Cloud-Edge

World of computing in 2018

14

$ 5.00

10 KB / frame→ 12,960,000 frames / month (5fps)→ 129.6 GB / month→ $6.48 / month ($50/TB)→ $77.76 / year ~ Raspberry Pi

10 MB / request→ 30 request / month→ 3.6 GB / year→ $2.16 / year

$ 70.00

Motivation

15

● General Purpose “Edge”→ Run stateful applications

Distributed Computing

Motivation

16

● General Purpose “Edge”→ Run stateful applications→ Need to migrate

Scheduling Security

Fault Tolerance

Migration

Distributed Computing

Motivation

17

● General Purpose “Edge”→ Run stateful applications→ Need to migrate

● Heterogeneous system● Resource-constrained

→ Cannot do low-level migration

Scheduling Security

Fault Tolerance

Migration

Distributed Computing in IoT

Motivation

18

● General Purpose “Edge”→ Run stateful applications→ Need to migrate

● Heterogeneous system● Resource-constrained

→ Cannot do low-level migration

Scheduling Security

Fault Tolerance

Platform-Independent Migration

Motivation

19

Low-level Migration

● Program counter● Registers● Memory pages

Motivation

20

Low-level Migration

● Program counter● Registers● Memory pages

High-level Migration

● Stack● Variables● Functions

Motivation

21

Low-level Migration

● Program counter● Registers● Memory pages

Platform-dependent

High-level Migration

● Stack● Variables● Functions

Platform-independent

Motivation

22

One language to rule them all

Motivation

23

One language to rule them all

JavaScript

Motivation

24

One language to rule them all

JavaScript

Douglas Crockford

Motivation

25

One language to rule them all

JavaScript● Event-driven● High-level● Largest user-base

Motivation

26

One language to rule them all

JavaScript● Event-driven● High-level● Largest user-base

Actor

actor.on(‘add’, addData)

actor.on(‘update’, updateData)

actor.on(‘search’, searchData)

Behaviour.js

‘update’ ‘search’

Motivation

27

One language to rule them all

JavaScript● Event-driven● High-level● Largest user-base

Actor

actor.on(‘add’, addData)

actor.on(‘update’, updateData)

actor.on(‘search’, searchData)

Behaviour.jsreturn updateData()

return searchData()

Motivation

28

One language to rule them all

JavaScript● Event-driven● High-level● Largest user-base

Actor

actor.on(‘add’, addData)

actor.on(‘update’, updateData)

actor.on(‘search’, searchData)

Behaviour.js

Motivation

29

One language to rule them all

JavaScript● Event-driven● High-level● Largest user-base

JavaScript Application

Module Module Module

C++ Library

Operating System

Drivers

Machine

Motivation

30

One language to rule them all

JavaScript● Event-driven● High-level● Largest user-base

#1

Related Work

31

Lo et al.WWW2013

● Browser to browser

● External Java Server

● One-time migration

Related Work

32

Lo et al.WWW2013

● Browser to browser

● External Java Server

● One-time migration

Kwon et al.WWW2017

● Browser to browser

● Modified VM

Related Work

33

Lo et al.WWW2013

● Browser to browser

● External Java Server

● One-time migration

Kwon et al.WWW2017

● Browser to browser

● Modified VM

ThingsMigrate (this)ECOOP2018

● VM to VM

● Only JavaScript

● Multi-hop migration

⨉ ∞

JavaScript process

Main Challenges

34

source: developer.mozilla.org

JavaScript process

Main Challenges

35

source: developer.mozilla.org

Main Challenges

36

1. Closures2. Events

function PiggyBank(){

var balance = 0

var deposit = function(amount){

balance += amount

}

return deposit

}

var bank = PiggyBank()

setInterval(

function putMoney(){

bank(100)

}, 1000)

Main Challenges

37

1. Closures2. Events

function PiggyBank(){

var balance = 0

var deposit = function(amount){

balance += amount

}

return deposit

}

var bank = PiggyBank()

setInterval(

function putMoney(){

bank(100)

}, 1000)

Given a JavaScript program:

1. Instrumentation - Modify code so we can capture state

Approach

38

foo.js foo.instrumented.js

Given a JavaScript program:

1. Instrumentation - Modify code so we can capture state2. Serialization - Serialize state into a snapshot

Approach

39

foo.js foo.instrumented.js foo.snapshot.json

Given a JavaScript program:

1. Instrumentation - Modify code so we can capture state2. Serialization - Serialize state into a snapshot3. Restoration - Generate code from snapshot

Approach

40

foo.js foo.instrumented.js foo.snapshot.json foo.restored.js

Approach

41

Given a JavaScript program:

1. Instrumentation - Modify code so we can capture state2. Serialization - Serialize state into a snapshot3. Restoration - Generate code from snapshot

foo.js foo.instrumented.js foo.snapshot.json foo.restored.js

program = restore(snapshot(program))

Implementation - Instrumentation

42

function PiggyBank(){

var balance = 0

var deposit = function(amount){

balance += amount

}

return deposit

}

var bank = PiggyBank()

setInterval(

function putMoney(){

bank(100)

}, 1000)

Instrumentation Serialization Restoration

Implementation - Instrumentation

43

var root = new Scope()

function PiggyBank(){

var balance = 0

var deposit = function(amount){

balance += amount

}

return deposit

}

var bank = PiggyBank()

setInterval(

function putMoney(){

bank(100)

}, 1000)

rootid: ‘root’

Instrumentation Serialization Restoration

Implementation - Instrumentation

44

var root = new Scope()

function PiggyBank(){

var scope_0 = new Scope(root)

var balance = 0

var deposit = function(amount){

balance += amount

}

return deposit

}

var bank = PiggyBank()

setInterval(

function putMoney(){

bank(100)

}, 1000)

rootid: ‘root’

scope_0id: ‘PiggyBank/0’

Instrumentation Serialization Restoration

Implementation - Instrumentation

45

var root = new Scope()

function PiggyBank(){

var scope_0 = new Scope(root)

var balance = 0

var deposit = function(amount){

var scope_0_0 = new Scope(scope_0)

balance += amount

}

return deposit

}

var bank = PiggyBank()

setInterval(

function putMoney(){

bank(100)

}, 1000)

rootid: ‘root’

scope_0id: ‘PiggyBank/0’

Instrumentation Serialization Restoration

Implementation - Instrumentation

46

var root = new Scope()

function PiggyBank(){

var scope_0 = new Scope(root)

var balance = 0

var deposit = function(amount){

var scope_0_0 = new Scope(scope_0)

balance += amount

}

return deposit

}

var bank = PiggyBank()

setInterval(

function putMoney(){

var scope_1 = new Scope(root)

bank(100)

}, 1000)

rootid: ‘root’

scope_0id: ‘PiggyBank/0’

Instrumentation Serialization Restoration

Implementation - Instrumentation

47

var root = new Scope()

function PiggyBank(){

var scope_0 = new Scope(root)

var balance = 0

var deposit = function(amount){

var scope_0_0 = new Scope(scope_0)

balance += amount

}

return deposit

}

var bank = PiggyBank()

setInterval(

function putMoney(){

var scope_1 = new Scope(root)

bank(100)

}, 1000)

rootid: ‘root’

scope_0id: ‘PiggyBank/0’

Instrumentation Serialization Restoration

Implementation - Instrumentation

48

var root = new Scope()

function PiggyBank(){

var scope_0 = new Scope(root)

var balance = 0

var deposit = function(amount){

var scope_0_0 = new Scope(scope_0)

balance += amount

}

return deposit

}

/* truncated */

rootid: ‘root’

scope_0id: ‘PiggyBank/0’

Instrumentation Serialization Restoration

Implementation - Instrumentation

49

var root = new Scope()

function PiggyBank(){

var scope_0 = new Scope(root)

var balance = 0

var deposit = function(amount){

var scope_0_0 = new Scope(scope_0)

balance += amount

}

return deposit

}

/* truncated */

rootid: ‘root’

scope_0id: ‘PiggyBank/0’

Instrumentation Serialization Restoration

Implementation - Instrumentation

50

var root = new Scope()

function PiggyBank(){

var scope_0 = new Scope(root)

var balance = 0

scope_0.vars.balance = balance

var deposit = function(amount){

var scope_0_0 = new Scope(scope_0)

balance += amount

}

return deposit

}

/* truncated */

rootid: ‘root’

scope_0id: ‘PiggyBank/0’

balancevalue: 0

Instrumentation Serialization Restoration

Implementation - Instrumentation

51

var root = new Scope()

function PiggyBank(){

var scope_0 = new Scope(root)

var balance = 0

scope_0.vars.balance = balance

var deposit = function(amount){

var scope_0_0 = new Scope(scope_0)

balance += amount

scope_0.vars.balance = balance

}

return deposit

}

/* truncated */

rootid: ‘root’

scope_0id: ‘PiggyBank/0’

balancevalue: 0

Instrumentation Serialization Restoration

Implementation - Instrumentation

52

var root = new Scope()

function PiggyBank(){

var scope_0 = new Scope(root)

var balance = 0

scope_0.vars.balance = balance

var deposit = function(amount){

var scope_0_0 = new Scope(scope_0)

balance += amount

scope_0.vars.balance = balance

}

scope_0.addFunction(deposit)

return deposit

}

/* truncated */

rootid: ‘root’

scope_0id: ‘PiggyBank/0’

balancevalue: 0

depositvalue: /* code */

Instrumentation Serialization Restoration

Implementation - Instrumentation

53

var root = new Scope()

function PiggyBank(){

var scope_0 = new Scope(root)

var balance = 0

scope_0.vars.balance = balance

var deposit = function(amount){

var scope_0_0 = new Scope(scope_0)

balance += amount

scope_0.vars.balance = balance

}

scope_0.addFunction(deposit)

return deposit

}

root.addFunction(PiggyBank)

/* truncated */

rootid: ‘root’

scope_0id: ‘PiggyBank/0’

balancevalue: 0

depositvalue: /* code */

PiggyBankvalue: /* code */

Instrumentation Serialization Restoration

Implementation - Instrumentation

54

var root = new Scope()

function PiggyBank(){

/* truncated */

}

root.addFunction(PiggyBank)

/* truncated */

rootid: ‘root’

scope_0id: ‘PiggyBank/0’

balancevalue: 0

depositvalue: /* code */

PiggyBankvalue: /* code */

Instrumentation Serialization Restoration

Implementation - Instrumentation

55

var root = new Scope()

function PiggyBank(){

/* truncated */

}

root.addFunction(PiggyBank)

var bank = PiggyBank()

setInterval(

function putMoney(){

var scope_1 = new Scope(root)

bank(100)

}, 1000)

rootid: ‘root’

scope_0id: ‘PiggyBank/0’

balancevalue: 0

depositvalue: /* code */

PiggyBankvalue: /* code */

Instrumentation Serialization Restoration

Implementation - Instrumentation

56

var root = new Scope()

function PiggyBank(){

/* truncated */

}

root.addFunction(PiggyBank)

var bank = PiggyBank()

setInterval(

root.addFunction(function putMoney(){

var scope_1 = new Scope(root)

bank(100)

}), 1000)

rootid: ‘root’

scope_0id: ‘PiggyBank/0’

balancevalue: 0

depositvalue: /* code */

PiggyBankvalue: /* code */

putMoneyvalue: /* code */

Instrumentation Serialization Restoration

Implementation - Instrumentation

57

var root = new Scope()

function PiggyBank(){

/* truncated */

}

root.addFunction(PiggyBank)

var bank = PiggyBank()

root.vars.bank = bank

setInterval(

root.addFunction(function putMoney(){

var scope_1 = new Scope(root)

bank(100)

}), 1000)

rootid: ‘root’

scope_0id: ‘PiggyBank/0’

balancevalue: 0

depositvalue: /* code */

bankvalue: deposit

PiggyBankvalue: /* code */

putMoneyvalue: /* code */

Instrumentation Serialization Restoration

Implementation - Instrumentation

58

var root = new Scope()

function PiggyBank(){

/* truncated */

}

root.addFunction(PiggyBank)

var bank = PiggyBank()

root.vars.bank = bank

setInterval(

root.addFunction(function putMoney(){

var scope_1 = new Scope(root)

bank(100)

}), 1000)

rootid: ‘root’

scope_0id: ‘PiggyBank/0’

balancevalue: 0

depositvalue: /* code */

bankvalue: deposit

PiggyBankvalue: /* code */

putMoneyvalue: /* code */

Instrumentation Serialization Restoration

Implementation - Instrumentation

59

var root = new Scope()

function PiggyBank(){

/* truncated */

}

root.addFunction(PiggyBank)

var bank = PiggyBank()

root.vars.bank = bank

setInterval(

root.addFunction(function putMoney(){

var scope_1 = new Scope(root)

bank(100)

}), 1000)

Instrumentation Serialization Restoration

Implementation - Instrumentation

60

var root = new Scope()

function PiggyBank(){

/* truncated */

}

root.addFunction(PiggyBank)

var bank = PiggyBank()

root.vars.bank = bank

things.setInterval(

root.addFunction(function putMoney(){

var scope_1 = new Scope(root)

bank(100)

}), 1000)

putMoneydelay: 1000

putMoneydelay: 1000

putMoneydelay: 500

Instrumentation Serialization Restoration

Implementation - Instrumentation

61

var root = new Scope()

function PiggyBank(){

/* truncated */

}

root.addFunction(PiggyBank)

var bank = PiggyBank()

root.vars.bank = bank

things.setInterval(

root.addFunction(function putMoney(){

var scope_1 = new Scope(root)

bank(100)

}), 1000)

putMoneydelay: 1000

putMoneydelay: 1000

putMoneydelay: 500

Instrumentation Serialization Restoration

Implementation - Instrumentation

62

var root = new Scope()

function PiggyBank(){

/* truncated */

}

root.addFunction(PiggyBank)

var bank = PiggyBank()

root.vars.bank = bank

things.setInterval(

root.addFunction(function putMoney(){

var scope_1 = new Scope(root)

bank(100)

}), 1000)Scope Tree Event Queue

Program

Instrumentation Serialization Restoration

Implementation - Instrumentation

63

var root = new Scope()

function PiggyBank(){

/* truncated */

}

/* truncated */

Scope Tree Event Queue

Program

Instrumentation Serialization Restoration

Implementation - Instrumentation

64

var root = new Scope()

function PiggyBank(){

/* truncated */

}

/* truncated */

Scope Tree Event Queue

Program

Instrumentation Serialization Restoration

Implementation - Instrumentation

65

var pubsub = new Pubsub(‘mqtt://1.2.3.4’)

var root = new Scope()

function PiggyBank(){

/* truncated */

}

/* truncated */

Pubsub

Instrumentation Serialization Restoration

Implementation - Instrumentation

66

var pubsub = new Pubsub(‘mqtt://1.2.3.4’)

pubsub.subscribe(‘snapshot’, function(){

})

var root = new Scope()

function PiggyBank(){

/* truncated */

}

/* truncated */

“snapshot”

Instrumentation Serialization Restoration

Implementation - Instrumentation

67

var pubsub = new Pubsub(‘mqtt://1.2.3.4’)

pubsub.subscribe(‘snapshot’, function(){

var snapshot = root.snapshot()

})

var root = new Scope()

function PiggyBank(){

/* truncated */

}

/* truncated */

snapshot()

Instrumentation Serialization Restoration

Implementation - Instrumentation

68

var pubsub = new Pubsub(‘mqtt://1.2.3.4’)

pubsub.subscribe(‘snapshot’, function(){

var snapshot = root.snapshot()

pubsub.publish(‘snapshots’, snapshot)

})

var root = new Scope()

function PiggyBank(){

/* truncated */

}

/* truncated */

publish

Instrumentation Serialization Restoration

Implementation - Serialization

69

putMoneydelay: 1000

putMoneydelay: 500

putMoneydelay: 1000

rootid: ‘root’

scope_0id: ‘PiggyBank/0’

balancevalue: 200

depositvalue: /* code */

bankvalue: deposit

PiggyBankvalue: /* code */

putMoneyvalue: /* code */

Scope Tree Event Queue

Instrumentation Serialization Restoration

Implementation - Serialization

70

putMoneydelay: 1000

putMoneydelay: 1000

putMoneydelay: 1000

rootid: ‘root’

scope_0id: ‘PiggyBank/0’

balancevalue: 0

Scope Tree Event Queue

1

2

3

0var bank = PiggyBank()

Instrumentation Serialization Restoration

Implementation - Serialization

71

putMoneydelay: 1000

putMoneydelay: 1000

putMoneydelay: 1000

rootid: ‘root’

scope_0id: ‘PiggyBank/0’

balancevalue: 100

Scope Tree Event Queue

…scope_1

id: ‘putMoney/0’scope_0_0

id: ‘PiggyBank/0/deposit/0’

1

2

3

0var bank = PiggyBank()

putMoney()

Instrumentation Serialization Restoration

Implementation - Serialization

72

putMoneydelay: 1000

putMoneydelay: 1000

putMoneydelay: 1000

rootid: ‘root’

scope_0id: ‘PiggyBank/0’

balancevalue: 200

Scope Tree Event Queue

…scope_1

id: ‘putMoney/0’scope_0_0

id: ‘PiggyBank/0/deposit/0’

scope_1id: ‘putMoney/1’

scope_0_0id: ‘PiggyBank/0/deposit/1’

1

2

3

0var bank = PiggyBank()

putMoney()

putMoney()

Instrumentation Serialization Restoration

Implementation - Serialization

73

putMoneydelay: 1000

putMoneydelay: 1000

putMoneydelay: 500

rootid: ‘root’

scope_0id: ‘PiggyBank/0’

balancevalue: 200

Scope Tree Event Queue

…scope_1

id: ‘putMoney/0’scope_0_0

id: ‘PiggyBank/0/deposit/0’

scope_1id: ‘putMoney/1’

scope_0_0id: ‘PiggyBank/0/deposit/1’

1

2

3

0var bank = PiggyBank()

putMoney()

putMoney()

root.snapshot()

Instrumentation Serialization Restoration

Implementation - Serialization

74

putMoneydelay: 1000

putMoneydelay: 1000

putMoneydelay: 500

rootid: ‘root’

scope_0id: ‘PiggyBank/0’

balancevalue: 200

Scope Tree Event Queue

…scope_1

id: ‘putMoney/0’scope_0_0

id: ‘PiggyBank/0/deposit/0’

scope_1id: ‘putMoney/1’

scope_0_0id: ‘PiggyBank/0/deposit/1’

1

2

3

0var bank = PiggyBank()

putMoney()

putMoney()

root.snapshot()

Instrumentation Serialization Restoration

Implementation - Serialization

75

putMoneydelay: 500

rootid: ‘root’

scope_0id: ‘PiggyBank/0’

balancevalue: 200

Scope Tree Event Queue

1

2

3

0var bank = PiggyBank()

putMoney()

putMoney()

root.snapshot()

Instrumentation Serialization Restoration

Implementation - Serialization

76

function PiggyBank(){

var balance = 0

var deposit = function(amount){

balance += amount

}

return deposit

}

var bank = PiggyBank()

rootid: ‘root’

scope_0id: ‘PiggyBank/0’

balancevalue: 200

depositvalue: /* code */

bankvalue: deposit

Instrumentation Serialization Restoration

Implementation - Serialization

77

function PiggyBank(){

var balance = 0

var deposit = function(amount){

balance += amount

}

return deposit

}

var bank = PiggyBank()

rootid: ‘root’

scope_0id: ‘PiggyBank/0’

balancevalue: 200

depositvalue: /* code */

bankvalue: deposit

Instrumentation Serialization Restoration

Implementation - Serialization

78

function PiggyBank(){

var balance = 0

var deposit = function(amount){

balance += amount

}

return deposit

}

var bank = PiggyBank()

rootid: ‘root’

scope_0id: ‘PiggyBank/0’

balancevalue: 200

depositvalue: /* code */

bankvalue: deposit

Instrumentation Serialization Restoration

Implementation - Serialization

79

function PiggyBank(){

var balance = 0

var deposit = function(amount){

balance += amount

}

return deposit

}

var bank = PiggyBank()

rootid: ‘root’

scope_0id: ‘PiggyBank/0’

balancevalue: 200

depositvalue: /* code */

bankvalue: deposit

‘root’: { ‘vars’: { ‘bank’: { ‘type’: ‘function-reference’, ‘value’: ‘PiggyBank/0.deposit’ } }}

Instrumentation Serialization Restoration

Implementation - Serialization

‘root’: { ‘vars’: { ‘bank’: { /* truncated */ } }, ‘children’: { ‘PiggyBank/0’: { ‘vars’: { /* truncated */ } } } ‘timers’: { ‘0’: { ‘type’: ‘Interval’, ‘callback’: ‘putMoney’, ‘delay’: 1000, ‘remaining’: 500 }}

80

Instrumentation Serialization Restoration

Implementation - Restoration

81

rootid: ‘root’

scope_0id: ‘PiggyBank/0’

balancevalue: 200

depositvalue: /* code */

bankvalue: deposit

PiggyBankvalue: /* code */

putMoneyvalue: /* code */

Instrumentation Serialization Restoration

Implementation - Restoration

82

var root = new Scope()

rootid: ‘root’

scope_0id: ‘PiggyBank/0’

balancevalue: 200

depositvalue: /* code */

bankvalue: deposit

PiggyBankvalue: /* code */

putMoneyvalue: /* code */

Instrumentation Serialization Restoration

Implementation - Restoration

83

var root = new Scope()

(function PiggyBank_0(){

var scope_0 = new Scope(root)

})()

rootid: ‘root’

scope_0id: ‘PiggyBank/0’

balancevalue: 200

depositvalue: /* code */

bankvalue: deposit

PiggyBankvalue: /* code */

putMoneyvalue: /* code */

Instrumentation Serialization Restoration

Implementation - Restoration

84

var root = new Scope()

(function PiggyBank_0(){

var scope_0 = new Scope(root)

var balance = 200

scope_0.vars.balance = balance

})()

rootid: ‘root’

scope_0id: ‘PiggyBank/0’

balancevalue: 200

depositvalue: /* code */

bankvalue: deposit

PiggyBankvalue: /* code */

putMoneyvalue: /* code */

Instrumentation Serialization Restoration

Implementation - Restoration

85

var root = new Scope()

(function PiggyBank_0(){

var scope_0 = new Scope(root)

var balance = 200

scope_0.vars.balance = balance

var deposit = function(amount){

/* Original code */

}

scope_0.addFunction(deposit)

})()

rootid: ‘root’

scope_0id: ‘PiggyBank/0’

balancevalue: 200

depositvalue: /* code */

bankvalue: deposit

PiggyBankvalue: /* code */

putMoneyvalue: /* code */

Instrumentation Serialization Restoration

Implementation - Restoration

86

var root = new Scope()

(function PiggyBank_0(){

/* truncated */

})()

rootid: ‘root’

scope_0id: ‘PiggyBank/0’

balancevalue: 200

depositvalue: /* code */

bankvalue: deposit

PiggyBankvalue: /* code */

putMoneyvalue: /* code */

Instrumentation Serialization Restoration

Implementation - Restoration

87

var root = new Scope()

(function PiggyBank_0(){

/* truncated */

})()

function PiggyBank(){

/* Original code */

}

root.addFunction(PiggyBank)

rootid: ‘root’

scope_0id: ‘PiggyBank/0’

balancevalue: 200

depositvalue: /* code */

bankvalue: deposit

PiggyBankvalue: /* code */

putMoneyvalue: /* code */

Instrumentation Serialization Restoration

Implementation - Restoration

88

var root = new Scope()

(function PiggyBank_0(){

/* truncated */

})()

function PiggyBank(){

/* Original code */

}

root.addFunction(PiggyBank)

root.addFunction(function putMoney(){

/* Original code */

})

rootid: ‘root’

scope_0id: ‘PiggyBank/0’

balancevalue: 200

depositvalue: /* code */

bankvalue: deposit

PiggyBankvalue: /* code */

putMoneyvalue: /* code */

Instrumentation Serialization Restoration

Implementation - Restoration

89

var root = new Scope()

(function PiggyBank_0(){

/* truncated */

})()

function PiggyBank(){

/* Original code */

}

root.addFunction(PiggyBank)

root.addFunction(function putMoney(){

/* Original code */

})

var bank =

root.getFunction(‘PiggyBank/0.deposit’)

root.vars.bank = bank

rootid: ‘root’

scope_0id: ‘PiggyBank/0’

balancevalue: 200

depositvalue: /* code */

bankvalue: deposit

PiggyBankvalue: /* code */

putMoneyvalue: /* code */

Instrumentation Serialization Restoration

Experiment

90

Pubsub Service

Web Dashboard(Manager)

Worker

Worker

Worker

MQTT

HTTP

Legend

Experiment

91

github.com/karthikp-ubc/ThingsJS

Project available on Github

Results

92

Benchmarks

● Chrome Octane Suite○ NavierStokes - CPU intensive○ Splay - Memory intensive

● Factorial● Regulator

Results

93

Execution Time

cloud pi3 pi0

Results

94

Execution Time

cloud pi3 pi0

+ 5 ~ 40% Execution Time

Results

95

Memory Usage

cloud pi3 pi0

Results

96

Memory Usage

~ 3x Memory Usage

cloud pi3 pi0

Results

97

Multi-hop Behaviour

Results

98

Multi-hop Behaviour

Constant Snapshot Size

We provide a high-level migration framework for JavaScript programs

● Stateful applications● Platform-independent● No VM modification

99

thingsjs.juliengs.com

kumseok@ece.ubc.ca

1. Optimizationa. Memory usageb. CPU usage

2. Fault-tolerancea. Infinite blocking loops/recursionb. Checkpointingc. Real-time state streaming

3. Decentralized scheduling

tl;drFuture Work