2. October 2023 By Yelle Lieder
Guidelines for ecologically sustainable software architectures
Some might say that the program code determines whether or not software is sustainable. This leads to a host of recommendations for action and manifestos for sustainable software or programming. Coding is only one of many tasks involved in software engineering. In reality, the impact of the decision regarding sustainability made at the source code level is often rather minor compared to other aspects of software engineering. In this blog post, I will provide recommendations on how sustainability can be established at the structural and conceptual level.
What makes a software architecture sustainable?
Sustainable software architectures minimise the environmental impact through the reduced use of resources. Second-order effects include a reduction in the amount of emissions generated from power consumption and a reduction in the amount of hardware required. In addition to preventing greenhouse gas emissions, a sustainable software architecture also helps reduce the water footprint of IT systems and leads to less e-waste being generated. Less electricity is consumed overall, and when it is used, it is sourced wherever possible from renewables. In addition, less hardware is used and that hardware is optimally utilised. Measures focused on these goals have a positive effect on costs, which, however, should not be overstated, and also lead to an increase in software performance and resilience. The architecture describes a system’s structure, components and their interfaces, meaning it provides a rather abstract view of how the system works. A sustainable architecture ensures that this abstract view of a system takes environmental sustainability into account from the outset.
Monitoring and benchmarking the sustainability of software
Sustainable software architectures regularly monitor their impact on the environment from the start. Benchmarking is a fundamental part of the architecture and must be done on a continuous basis in order to be robust and reproducible. The benchmarks are used to monitor and manage the environmental impact over time and over several releases, for example. It is necessary to monitor and document the environmental impact of a system from the start in order to make reliable statements regarding environmental life cycle costs and avoid greenwashing. For software architecture to be sustainable, it has to incorporate continuous monitoring of its impact on the environment. You can learn about several tools in my blog post on ‘Testing the sustainability of software – how do you test sustainability as a quality feature of software?’.
Asynchronous processes for carbon aware software
Sustainable software architectures separate all processes that are not time-critical so that they can be run asynchronously. The separation of non-time-critical processes, such as training models, charging EVs or generating reports, is necessary in order to align the execution of workloads with the availability of renewable energy.
In this context, separation means uncoupling the trigger so that execution can be orchestrated not only by the system itself, but also by a library or an external API. By consuming electricity when it is primarily generated from renewable sources, it is possible to reduce the footprint of applications by ten per cent or more. This can also lead to a reduction in peak loads in the digital infrastructure and hence the overall demand for hardware. Additional economic incentives are created for the expansion of renewables as well. In many cases, excess renewable energy capacities simply go unused on sunny or windy days. If a greater portion of these were to be consumed in the future by software-driven processes that are not time-critical, energy producers would be able to generate more revenue. A workload is well separated if its execution can also be geographically independent from the rest of the system. Sustainable architectures make this possible by identifying and separating non-time-critical processes right from the start.
Managed services for higher efficiency and utilisation rates
Sustainable software architectures employ managed services such as cloud-native solutions, which are run on an ultra-efficient infrastructure with high utilisation rates. Operating a highly specialised application that is optimally tailored to the underlying hardware promises efficiency gains. Based on the load profile of commonly used IT hardware, it is important to maintain high utilisation rates since this hardware uses a disproportionately large amount of electricity at low utilisation rates. If a large number of workloads are concentrated at a small number of centralised data centres, it may be possible to achieve significantly higher utilisation rates overall. Sustainable software architectures therefore take into account that underutilised on-premises infrastructures, unlike managed services infrastructures, are not utilised by anyone else.
Sustainable scaling made possible by elasticity and modularity
Sustainable software architectures are modular and provide elasticity at runtime. The idle load of individual software components can be reduced and unused resources freed up by optimising scaling behaviour or even switching off individual services. By doing so, it is possible to align the load of the infrastructure with the demands of the software and also reduce the overall hardware requirements. For example, unused services can be switched off outside core business hours or at the weekend. Because they are modular, sustainable architectures support the plug-in paradigm. They also allow users to make decisions on sustainability on their own and disable functions that they do not need.
Network efficiency as the key to achieving a sustainable balance between bandwidth and computing power
Sustainable software architectures strike a balance between the transfer load and computational efficiency. Therefore, when making the decision on where to perform computations, the efficiency of the target hardware as well as the transfer load required to get the data to the location where the computations will be carried out are both taken into consideration. In many cases, offloading computations, from client devices such as smartphones to servers in cloud data centres, for example, is a good option. That is because the servers only consume a fraction of the energy when carrying out the same computation because they are more energy efficiency. However, if consumption of power generated in order to transfer the data is higher than the potential savings while the calculation is being performed, it might make sense to perform the calculations as close as possible to the location where the data is stored, even if the existing hardware is less efficient. This is often the case, for example, when video is transferred and processed. Good, sustainable architectures take these conflicting goals into account.
Batch I/O for reduced data transfer overhead
Sustainable software architectures bundle input and output operations to reduce the overhead per operation. Setting up connections for data transmission costs a non-trivial amount of resources in most use cases. The TCP slow-start algorithm as well as the data load of http headers make bundling data prior to transfer more sustainable. Here is why: overhead in this specific context means wasteful use of the data load and unnecessary energy consumption without generating any additional value from a functional or qualitative perspective. This applies not only to the transfer of data between physically separated systems or access to databases. Local memory operations also have a significant overhead, which is reduced per bit written or read if it is transferred as part of a larger batch. Sustainable architectures incorporate this into the definition of interfaces and interactions between components.
Using sustainable storage rules to reduce memory utilisation
Sustainable software architectures only store what is essential for the use case. They compress data and are not stateful. What data is stored, where and under which circumstance it is stored as well as the maximum retention period must be specified in advance in the architecture definition. This includes making a distinction between hot and cold storage, depending on how frequently the data is retrieved. Mechanisms used to compress data before it is transferred or stored have to be provided for as well. However, one does need to consider possible conflicting goals. While the transfer and storage load is lower due to compression, compression and decompression also require computing power. When using compression, one needs to consider that the savings achieved during transmission or storage will not be offset by compression and decompression alone. The statefulness of components also plays an important role when it comes to data performance. When components store the state at runtime, this is usually done in memory. However, since memory consumes a lot of energy, sustainable architectures stipulate stateless components. Through these measures, sustainable architectures reduce the total number of physical storage devices needed, minimise the transferred data load and reserve computing operations for the cleaning and preparation of data.
Sustainable software architecture guidelines at adesso
Sustainable software architectures include monitoring and benchmarking, asynchronous processes, managed services, elasticity and modularity, network efficiency, batch I/O and reduced memory utilisation. There are also certain softer criteria that are not explicitly specified here, for example, for communicating the importance of sustainability to customers and partners and for the selection of technology. You can learn more about strategies for selecting sustainable technologies in this blog post. The aim of these guidelines is to provide a basic framework for what makes software architectures more sustainable. They were developed in close cooperation with the adesso software architecture community, will be included in future adesso software architecture training seminars and reflect our attitude and commitment to sustainable software. My gratitude goes out to the many colleagues for their contribution here. By the way, we are now working on further recommendations for action on sustainability in the software development process for other roles involved.
You can find more exciting topics from the adesso world in our blog articles published so far.