I'm building a RESTful API using Akka and Spray. I'm using the Typesafe Akka Cluster Sample project...
(http://www.typesafe.com/activator/template/akka-sample-cluster-scala)
as a reference. I have a cluster which uses a pool of routees and cluster aware routing. The interface to the API is through a spray frontend which creates an actor (ClusterClient) that acts as a frontend to the cluster and monitors cluster activity (new nodes, downed nodes etc...). When a request comes in to a spray route I delegate the work to a Cluster backend worker via the cluster aware router.
My hope/goal here is that I can increase performance in the system by adding more back-end worker nodes and routees as needed. I may also add more frontend (spray) nodes that will be accessed via a Load Balancer. I'm trying to build something performant and scalable.
This all works fine. The worker actors at the moment just return a string for testing.
Before I go any further I wanted to get an idea of current cluster performance by stress testing the application. So I am using apache bench to do some quick tests.
All the testing is being done on my local development machine (QuadCore Macbook Pro with 16gb RAM). The application is running on spray-can. The frontend (spray) and backend nodes are being kicked off on seperate JVM's on the same machine by using different ports.
The strange thing is performance seems to degrade when I add more backend nodes to the cluster. Here are my tests and results. I ran each test about 10 times to get better average...
One Backend Node
ab -l -n 1000 -c 100 http://localhost:3050/api
Requests per second [#/sec] (mean): 4708.25, 5086.11, 4341.52, 5850.76, 4403.33, 5046.78, 4151.84, 5686.24, 3399.38, 4466.26, 3755.98, 5619.18, 5187.96
Average: 4745 requests per second
Two Backend Nodes
ab -l -n 1000 -c 100 http://localhost:3050/api
Requests per second [#/sec] (mean): 3381.75, 4108.51, 2969.41, 3732.29, 3804.48, 3644.12, 2516.05, 2968.17, 3308.01, 3378.69, 4049.71, 3738.21, 4068.84
Average: 3512 requests per second
Three Backend Nodes
ab -l -n 1000 -c 100 http://localhost:3050/api
Requests per second [#/sec] (mean): 2756.49, 2516.77, 2535.34, 2464.37, 2887.51, 2421.98, 2794.03, 2633.36, 2735.74, 3021.81, 2612.39, 3052.53, 3714.88
Average: 2780 requests per second
Is this expected? i.e. Am I wrong in thinking that I should be getting more performance by adding more backend/worker nodes? Based on the figures above, the more nodes I add to the cluster the worse the performance will become. Is this possibly an issue to do with running the tests on the same machine?
Thanks