## 7 Performance Analysis: Reliability and Scalability
### Experiment Results
#### 7.2.1 Performance in Terms of System Reliability and Scalability  
Figures 13 and 14 show different metrics captured for performance evaluation in case the real IoT sensor node device were to be sending data. In the section on CPU usage, the average performance results showed that the maximum usage was 2.25 while the minimum usage was 0.25. This was considered a benchmark against which to measure if any increase in the load could affect CPU usage.  
The evaluation showed that, due to the use of microservices, there was no single core overload. The graph showed that all works were distributed among the available 4 cores used in this testing, with an average of around 40% (0.4). The engagement of all cores implied an increase in system throughput.  
On the graph of throughput, the dominant operation was the reception as the data were being sent from the sensor node to the platform. The observed maximum value of the reception was 46,000 bytes per second. It showed a minimum of around zero at some specific period. The presence of some points with zero throughputs could depend on the sensor node device set to send data at an interval of 5 s. The maximum memory usage in this configuration was around 4600 megabytes, while the minimum was around 4200 megabytes. This implied that the average usage of 4400 megabytes of memory.  
\begin{table}
\begin{tabular}{l c c} \hline \hline
**Specifications** & **Test Runner** & **Deployment Server** \\ \hline CPU & 4.5 GHz Intel Core TM (4 cores) & 4.5 GHz Intel Core TM (4 cores) \\ \hline Memory & 8 GB DDR3 & 8 GB DDR3 \\ \hline Storage & 500 GB HDD & 500 GB HHD \\ \hline OS & Linux x86\_64 & Ubuntu 20.04 LTS \\ \hline \multirow{4}{*}{Installed Softwares} & Docker Swarm, MQTT & Docker Swarm, MQTT, Microservices, NGINX, PostgreSQL 10.3, Redis, cAddivisor, Prometheus, Grafana & Prometheus, Grafana \\ \hline \hline \end{tabular}
\end{table}
Table 4: Specifications of environments used for performance analysis.  
Figure 14: Resource usage for memory and throughput with normal sensor node setup.  
Figure 13: CPU resource behavior with normal sensor node setup.  
Figures 15 and 16 depict the observations of the system behavior after applying the generated IoT sensor requests. In predicting the platform scalability, 10,000 IoT sensor requests were generated. In these graphs, there was a considerable increase in CPU usage with an average of (0.75) 75%. The memory usage maximum was around 4800 megabytes while the minimum used was around 4400 megabytes. This implied an average of 4600 megabytes of memory. In this experiment, the throughput graph showed a maximum of around 50,000 bytes/second with a minimum of around zero, generating an average of 25,000 bytes/second.  
Figures 17 and 18 show the considerable increases, especially in CPU core usage, with the generation of 1,000,000 requests. The average usage of all CPU cores was around (0.8) 80%. The maximum memory of 5000 megabytes and the minimum of 4500 megabytes of RAM were consumed. The average memory usage as around 4750 megabytes. The maximum throughput measured was equal to 60,000 bytes per second, with an average of 30,000 bytes per second.  
Figure 15: CPU resources with 10,000 generated sensor requests.  
Figure 16: Resource usage for memory and throughput with 10,000 generated sensor requests.  
Figure 17: CPU resource with 1,000,000 generated sensor requests.