Post on 16-Oct-2020
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