Hello all, before commenting, here there are the numbers:

*** Testing OpenWhisk Classic Python ***
Running 1m test @ http://localhost:8080/run
  1 threads and 1 connections
  Thread Stats   Avg      Stdev     Max   +/- Stdev
    Latency    49.91ms    2.33ms  60.23ms   79.28%
    Req/Sec    19.87      2.58    30.00     93.59%
  1202 requests in 1.00m, 148.01KB read
Requests/sec:     20.03
Transfer/sec:      2.47KB

*** Testing ActionLoop Python ***
Running 1m test @ http://localhost:8080/run
  1 threads and 1 connections
  Thread Stats   Avg      Stdev     Max   +/- Stdev
    Latency    11.77ms  673.30us  37.85ms   93.85%
    Req/Sec    85.14      5.56    90.00     84.25%
  5101 requests in 1.00m, 632.64KB read
Requests/sec:     84.95
Transfer/sec:     10.54KB

What is this?

For those who are new to the list, I recap a bit.  I am the author of the 
runtime for Go. 
Because Go is a compiled language, I implemented a different approach than the 
other languages.
Other runtimes are build in the target language, they implement the runtime an 
and load the code in a way "language dependent"
In the  Go runtime, your action is a full featured standalone executable, and 
it communicates with the proxy via pipes and I/O.

The runtime evolved in a compete infrastructure to implement actions in ANY 
programming language that can read input and write output line by line and 
parse JSON. It was designed for compiled programming language (Go, but also 
C/C++, Rust, Haskell, Nim) but there is nothing preventing to use it with 
scripted languages: Python for example.

Building a runtime using the current infrastructure, is extremely easy: you 
just need a Dockerfile, a "compiler" and a launcher. I already built the 
support for Go, Swift, an experiment using Scala and now I created one for 
Python. It took me 2 hours today to build the runtime. Working a bit on it. it 
could even became easier. There is now a "compiler" script, it could be just a 
"json" descriptor...

Then I decided to benchmark the result. I created a very simple "main.py" (just 
the classic "hello") and I used the "wrk" tool to benchmark the "raw" http 
performance, executing one single thread with one connection. The result is 
what you can see before. The current runtime can perform, using Docker on my 
Mac, 1202 requests in one minute, while the runtime built with ActionLoop can 
perform 5101 requests in one minute.

I am not entirely surprised because the current runtime uses a Python based 
HTTP support, while the ActionLoop is entirely native code and it communicate 
the action over (internally optimized) I/O. 

Code is here: 
https://github.com/sciabarracom/incubator-openwhisk-runtime-actionloop

So, is it worth to use this as an "official" way to write runtimes? In such a 
case I can document all the procedure... There was some discussion of using it 
as the "dockerskeleton v2". Not sure if the name is suitable, also the concept 
is a bit different although it is very generic. I would like more something 
like "runtime-sdk" or something like this. Let me know your thoughts.

-- 
  Michele Sciabarra
  mich...@sciabarra.com

Reply via email to