Running Factorio on SONM
In this short post, I will test out SONM.
SONM is a decentralized cloud provider. In this case, cloud is just someone else’s computer literally. I read on the website that this is called “fog computing.” In essense, anyone can become a “miner” to run application in exchange for SONM tokens. The technology is enabled by Docker, Yandex Cocaine and its own network discovery module(insomnia) and a blockchain interface. There are two binaries: hub for discovery(presumably one for a computing cluster) and miner to run on each host machine, both written in Go. I’d like to think of SONM as Kubernetes on a blockchain.
To test the project at its current stage, I will deploy a Factorio docker server and judge by the ease of use for both sysadmin and end user.
Installing SONM Toolbelt
Following alpha release the tutorial step by step, I downloaded the 0.2.1 release from Github.
$ ./sonmhub
INFO [10-12|19:26:40] Starting P2P networking
INFO [10-12|19:26:42] UDP listener up self=enode://b1ac08dd98423379ed75a4ea28ea5f4d96896743a8648d7c20880f79378a13ef910e8e2d98c50c01fa2442d7ffd5811a3ce25650f8592aa3ee2ae10970f5b7a4@207.244.97.166:30343
INFO [10-12|19:26:42] Whisper started
2017-10-12T19:26:42.982Z INFO hub/server.go:288 listening for connections from Miners {"address": "[::]:10002"}
2017-10-12T19:26:42.984Z INFO hub/server.go:297 listening for gRPC API connections {"address": "[::]:10001"}
INFO [10-12|19:26:42] RLPx listener up self=enode://b1ac08dd98423379ed75a4ea28ea5f4d96896743a8648d7c20880f79378a13ef910e8e2d98c50c01fa2442d7ffd5811a3ce25650f8592aa3ee2ae10970f5b7a4@207.244.97.166:30343
Then in a separate session,
$ sudo ./sonmminer
2017-10-12T19:27:09.595Z DEBUG miner/builder.go:75 building a miner {"config": {"HubConfig":{"Endpoint":"127.0.0.1:10002","Resources":null},"FirewallConfig":null,"GPUConfig":null,"SSHConfig":null,"LoggingConfig":{"Level":-1}}}
2017-10-12T19:27:09.603Z DEBUG miner/builder.go:83 discovering public IP address ...
2017-10-12T19:27:09.611Z INFO miner/builder.go:109 discovered public IP address {"addr": "207.244.97.166", "nat": "Not behind a NAT"}
2017-10-12T19:27:09.611Z INFO miner/builder.go:140 collected Hardware info {"hardware": {"CPU":[{"cpu":0,"vendorId":"GenuineIntel","family":"6","model":"2","stepping":3,"physicalId":"0","coreId":"0","cores":1,"modelName":"QEMU Virtual CPU version 1.2.1","mhz":2400.082,"cacheSize":4096,"flags":["fpu","de","pse","tsc","msr","pae","mce","cx8","apic","sep","mtrr","pge","mca","cmov","pse36","clflush","mmx","fxsr","sse","sse2","syscall","nx","lm","rep_good","nopl","pni","vmx","cx16","popcnt","hypervisor","lahf_lm"],"microcode":"0x1"}],"Memory":{"total":1040777216,"available":554799104,"used":485978112,"usedPercent":46.69376928405013,"free":53800960,"active":423022592,"inactive":442867712,"wired":0,"buffers":51183616,"cached":404344832,"writeback":0,"dirty":8192,"writebacktmp":0,"shared":10915840,"slab":87986176,"pagetables":5287936,"swapcached":7966720},"GPU":[]}}
2017-10-12T19:27:09.614Z INFO miner/overseer.go:207 subscribe to Docker events {"since": "1507836429"}
2017-10-12T19:27:09.622Z DEBUG miner/server.go:571 Using hub IP from config {"IP": "127.0.0.1:10002"}
2017-10-12T19:27:09.632Z INFO miner/server.go:156 handling Handshake request {"req": ""}
2017-10-12T19:27:09.639Z INFO miner/server.go:415 starting tasks status server
2017-10-12T19:27:09.639Z DEBUG miner/server.go:368 handling tasks status request
2017-10-12T19:27:09.639Z INFO miner/server.go:343 sending result {"info": {}, "statuses": {}}
2017-10-12T19:27:14.627Z INFO miner/server.go:512 yamux.Ping OK {"rtt": "201.763µs"}
I assume that one hub supports a cluster of nearby hosts, similar to the master node on Kubernetes.
Finally, to run a docker container, create a yml file:
$ cat > task.yml <<END
> task:
> container:
> name: dtandersen/factorio:latest
> resources:
> CPU: 1
> RAM: 10240kb
>END
Now we need to figure out the miner on which to run the task:
$ ./sonmcli --addr 127.0.0.1:10001 miner list
Miner: 127.0.0.1:50928 Idle
$ ./sonmcli --addr 127.0.0.1:10001 miner status 127.0.0.1:50928
Miner: "127.0.0.1:50928" (003fe205-af29-4777-aa2c-a70fd50569ab):
Hardware:
CPU0: 1 x QEMU Virtual CPU version 1.2.1
GPU: None
RAM:
Total: 992.6 MB
Used: 463.5 MB
No active tasks
Now we can deploy the task:
$ ./sonmcli --addr 127.0.0.1:10001 task start 127.0.0.1:50320 task.yml
Starting "dtandersen/factorio:latest" on miner 127.0.0.1:50928...
ID 94b59103-0c43-4c1e-bc87-9e06abf39ad5
Endpoint [27015/tcp->207.244.97.166:32772 34197/udp->207.244.97.166:32769]
This command returns when the task is deployed.
We inspect the miner again:
$ ./sonmcli --addr 127.0.0.1:10001 miner status 127.0.0.1:50928
Miner: "127.0.0.1:50928" (003fe205-af29-4777-aa2c-a70fd50569ab):
Hardware:
CPU0: 1 x QEMU Virtual CPU version 1.2.1
GPU: None
RAM:
Total: 992.6 MB
Used: 463.5 MB
Tasks:
1) 94b59103-0c43-4c1e-bc87-9e06abf39ad5
The entire process took less than 3 minutes in wall clock time.
Of course, a system this complex will have lots of edge cases. I hope the SONM team have solutions to these pressing issues with fog computing:
-
Security: user side and miner side
-
Proof of execution
-
Dishonest nodes
-
GPU tasks - SONM will support OpenCL but what about
nvidia-docker
required to run TensorFlow?
SONM marketplace release is scheduled this winter along with a wallet prototype. Here is a diagram of how it works:
I will test these products as they are released.