CONTENTO: An open simulator for storage and content management services in mobile edge computing
We strongly recommend reading the corresponding publication to get a deeper insight of the scope CONTENTO was intended to cover.
CONTENTO is a simulator designed to process workloads consisting of pull and push content requests in edge environments and measure the performance of the network in terms of generated traffic and transfer rates.
The way CONTENTO handles traffic is based on what is defined in a processing pipeline, whose stages include data pre-processing, event detection, event handling, and actions on content and storage. Edge Applications (apps) can customize this pipeline using elements already available in our code or by extending classes to adjust to specific requirements.
At the moment, we provide elements to detect content popularity (HighPopularityEvent detection), and actions to apply on content, such as cache (store) and push (to neighbour edge servers). The input workload handled by CONTENTO can consist on the following elements, all of them a type of event:
- Mobility Event (Handover event): To symbolize how mobile device move across base stations and edge servers. Users of CONTENTO should only specify the list of mobility events or use the already included RandomWayPoint-based mobility generator. There is no need to handle the handover of UEs and their current transmissions, everything is already handled by CONTENTO.
- Pull Request Events: To represent regular file downloads by moving UEs. The request must have a reference to the file to be downloaded.
- Pull Data Request Event: To represent the requests for data produced by UEs, for example, sensors connected to base stations. The requesting host can be the cloud (to represent scenarios on which external systems ask the cloud for data generated by a UE) or another UE in the network (to represent scenarios on which UEs request content to other UEs within the network. Nevertheless, D2D communication is not supported).
- Push Data Request Event: To represent IoT scenarios on which UEs (such as sensors) are autonomously producing data and uploading it to edge servers. Such data is associated with a processing, which can be customized by adjusting the processing pipeline according to app’s requirements.
The definition of Apps is simple, as there is a mechanism to simply specify each of the components of the processing pipeline. We also provide different ways to specify how the overall storage for the app should be distributed. In particular, we define:
- Flexible and fully distributed: the app can use any amount of storage at any edge server.
- Fixed and fully distributed: the app can use storage across all of the edge servers, but there is a local limit in each of them.
- Flexible and partially distributed: the app can use any amount of storage but only at specific edge servers.
- Fixed and partially distributed: the app can use storage across specific edge servers, but there is a local limit in each of them.
For the case, the app is not deployed at an edge server where data is being received, it can be also specified how to deal with such incoming data:
- Discard data: no processing is performed.
- Send to closest processing unit: this means that depending on link condition, the data would be sent to a neighbour edge server or the cloud (destination is selected according to estimated data arrival time).
- Send to the cloud: the data is immediately offloaded and processed at the cloud.
We provide access to CONTENTO’s source code in this web page. We strongly recommend analysing the examples described in Contento (Cavstor) > launcher > src > ExperimentLauncher.java to get a practical idea of how to quickly generate workloads (including both random mobility and requests). More complex examples can be studied in Contento (Cavstor) > launcher > src > experiments. Particularly interesting is ContentPreAllocationLauncher.java, as it demonstrates how to define custom workloads and create a simple mobility-aware prefetching scenario.
CONTENTO uses the Cloning and CoreBonnmotion libraries. They are already embedded in the provided source code for convenience. Note that this is an IntelliJ-based project.