Evaluating Compute Pricing in Response to Increased Demand on the Internet Computer Protocol

Authors: @Manu @bjoernek

TL;DR

A recent significant increase in compute demand has maxed out capacities on several subnets, leading to increased message processing latency. In alignment with a recently approved motion, this forum post provides a detailed review of compute pricing to ensure that subnet revenues adequately reflect operational costs.

We evaluated various usage scenarios including handling multiple messages from many canisters, processing maximum instructions, and managing canister overhead. The analysis suggests the following pricing adjustments:

  • Increase the message base fee from 590K to 5M cycles.
  • Increase the instruction fee from 0.4 to 1 cycle.
  • Increase the canister installation fee from 0.1 to 0.5 trillion cycles.

The estimated impact on selected applications suggests a total cost increase ranging from 15% to 70% based on the proposed new pricing, aligning with the increase proposed in the motion proposal.

Background

In recent weeks, a significant increase in the demand for computation on the Internet Computer Protocol has been observed. This growth, although very positive, has also highlighted several challenges. The maximum compute capacities have been reached in several subnets, resulting in canisters being delayed due to the need to wait for available compute resources, thereby increasing the latency of message processing. For more background information on this topic see here.

The focus of this post is on the review of compute pricing in the context of the observed high demand patterns. This is aligned with a community motion proposal that was recently approved.

The applied guiding principle is that the protocol should ensure that the pricing for subnet usage accurately reflects its operational costs. If revenue generated from a subnet aligns with its operational costs, additional subnets can be deployed to handle increased load. The eventual goal is that every reasonably loaded subnet burns more cycles than rewards allocated to node providers, such that every subnet helps offset the NNS voting rewards. Note that pricing should be reviewed periodically to account for future changes in protocol efficiency or varying operational costs.

Analysis of Usage Scenarios and Pricing Implications

We evaluate various usage scenarios to understand the generated revenue and recommend pricing adjustments that accurately offset subnet operational costs.

Subnet costs consist of node rewards, which vary depending on the hardware used and the geographic location of the nodes. Currently, the average reward per node is approximately 1,500 XDR per month. For a subnet comprising 13 nodes, this translates to monthly operational costs of 19.5K XDR, or 7.42 billion cycles per second.

Based on recent usage patterns and capacity constraints, we have identified three scenarios for detailed analysis:

  1. Multi-Message Many Canisters: A subnet handles numerous small messages from various canisters.
  2. Maximum Number of Instructions: A subnet processes the maximum number of instructions.
  3. Canister Limit: A subnet reaches the maximum number of canisters it can support, focusing on the overhead induced by high canister volumes.

Scenario: Multi-Message Many Canisters

Analysis:
Starting every distinct canister creates overhead. The base overhead is 2M instructions per message. The canister-specific overhead is 8M instructions for each new canister executed in a round. This results in a total overhead of 10M instructions per distinct canister message. Given a thread limit of 2 billion instructions, a single thread can process 200 messages. With four threads, this capacity is 800 messages per round. Anticipated short-term improvements to the execution protocol could potentially increase the capacity to 1500 messages.

Revenue:
In the current pricing model, the execution cost per message is calculated based on a base fee of 590,000 cycles plus an instruction fee of 0.4 cycles per instruction. Given the assumed low instruction count per message in this scenario, the current revenue is approximately 0.47 billion cycles per second (590K cycles Ă— 800 messages). With the anticipated increase in capacity, potential revenue could rise to 0.89 billion cycles per second (590K cycles Ă— 1,500 messages).

Conclusion:
To align revenue with operational costs under this scenario, the base fee for message execution needs to increase by a factor of approximately 8.4 (calculated as 7.42 billion cycles in costs divided by 0.89 billion in potential revenue). This suggests increasing the base fee from 590,000 cycles to around 5 million cycles.

Scenario Maximum Number of Instructions

Analysis:
A subnet on the IC is currently running on 4 threads, each of which is capable of processing 2 billion instructions per second.

Revenue:
Under the current pricing scheme, processing one instruction costs 0.4 cycles. Therefore, at full capacity, the subnet spends 3.2 billion cycles per second (0.4 cycles per instruction Ă— 8 billion instructions).

Conclusion:
To cover the subnet costs of 7.4 billion cycles per second, increasing the fee from 0.4 cycles per instruction to 0.925 cycles per instruction would be necessary (calculated as 7.4 billion total subnet costs divided by 8 billion instructions processed). For ease of billing, it is recommended to adjust the fee to 1.0 cycle per instruction.

Scenario Canister Limit

Analysis:
Subnets experience significant load when hosting a large number of canisters, even if these canisters are idle. To manage this load, a cap of 120,000 canisters per subnet has been implemented. Future protocol modifications aim to reduce the load from idle canisters. We analyze how a high number of canisters impacts subnet performance and adjust canister installation fees accordingly, to ensure they cover the full cost of canister loads.

To estimate the slowdown caused by many canisters, our focus is on subnets with low instruction loads but significant canister counts (more than 50,000). Data from October 24, 2024, shows:

  • Subnets with ~50,000 canisters (e.g., o3ow2 and qdvhd) have a finalization rate of around 1.8, indicating execution round times of approximately 500ms.
  • Subnets with ~90,000 canisters (e.g., eq6en and 2fq7c) display a finalization rate of around 1.1, indicating execution round times of 900ms.

Since none of these subnets process a very large number of instructions, the time spent in execution rounds can mostly be attributed to per-canister overhead.

Revenue:
The additional overhead for handling 40,000 more canisters (from 50k to 90k) is roughly 400ms. At the current subnet limit of 120,000 canisters, the overhead increases to 1200ms, more than doubling the typical execution round time of 1000ms to 2200ms. This equates to 55% of processing time being consumed by overhead, translating to 4.07 billion cycles per second (55% of the total 7.42 billion cycles per second). This results in a cost of approximately 34,000 cycles per canister per second.

Conclusion:
We propose incorporating the overhead that a canister incurs into the canister creation fee. Assuming a time period of 6 months, this adjustment would translate to a cost of 0.53 trillion cycles per canister. After rounding, we suggest a fee of 0.5 trillion cycles per canister. DFINITY anticipates protocol improvements that would significantly reduce the canister overhead, and if those improvements indeed take place, we recommend revisiting the canister creation fee.

Impact on Example Applications

Using the example presets defined in the ICP Pricing Calculator, we estimate the financial impact in USD of the proposed changes over a one-year period for both installation and usage.

Based on the previous analysis, we assume the following adjustments to pricing:

  • Message Base Fee: Increases from 590K cycles to 5M cycles.
  • Instruction Fee: Increases from 0.4 cycles to 1 cycle per instruction.
  • Canister Installation Fee: Increases from 0.1 trillion cycles to 0.5 trillion cycles.

For the scenarios considered, we observe an overall cost increase ranging from 0% to 70% based on the proposed new pricing. This range is consistent with the motion proposal previously approved by the community. Please note that the biggest relative change of 70% for dapp #1b is primarily due to an increase in one-off costs.

Suggested Next Steps

Discuss the suggested pricing adjustments on the forum. Afterwards submit proposals for the suggested price changes.

16 Likes

Curious (and too lazy to look it up): is a message fee charged for heartbeats? (Since they’re not, in some sense, messages.) Because a lot of the high load we’ve seen did come from heartbeats and it seems counterproductive to charge more for everything but heartbeats.

1 Like

Yes, there is a charge. It does not matter for charging whether the (message) execution is triggered by a heartbeat, timer or a user.

4 Likes

Great idea! The proposed changes keep costs reasonable and still lower than any other blockchain. My question is, beyond improving overall performance, are there other positive effects—such as a potential impact on inflation? If so, how might these changes influence inflation, and is there an estimate for this impact?

You also mentioned that node rewards might increase. Could you clarify the net ICP burn balance in this scenario, considering more cycles are needed, but node rewards would also increase? For simplicity, let’s assume a stable ICP price in the example.

Thank you very much!

4 Likes

Yes. Increased cycles cost means a subnet burns more cycles with the same load, so it becomes easier for a subnet to burn more cycles than it “costs” in NP rewards and therefore reduce inflation / add to deflation. This is important for the overall tokenomics: The idea is that every somewhat loaded subnet adds to deflation and helps offset the NNS voting rewards. A lot more background and analysis is given in this great post by @bjoernek.

What does this refer to? I actually think that the node provider rewards are expected to go down when the Gen 1 NPs reach the 48 month mark (see this topic for more info) and performance-based node provider rewards (topic).

3 Likes

What needs to be considered in this proposal are all spare nodes that are still being paid for and are needed as replacements in cases when existing nodes fail or malfunction.

We should not consider the standard subnet cost as being based on 13 nodes. Currently, for example, there are 1,469 nodes, of which 568 are within subnets. This means the pricing should account for 2.6 times more nodes.

If we assume an average cost of 1,500 XDR per node and multiply it by 1,469 nodes, the monthly network cost is 2,203,500 XDR ($2,974,725). To achieve a deflationary effect, cycle usage should offset governance rewards, which constitute the main cost of the network, whereas node rewards represent only a small percentage of the total cost.

Ideally, at 50% capacity, ICP would experience 0% inflation, meaning all node and governance rewards would be fully offset by burning mechanism. Determining the percentage that is realistically achievable is something we still need to explore.

The spreadsheet below details the monthly calculation of ICP (cycles) that need to be burned, based on usage and the current ICP price.

6 Likes

Good proposal! While ICP remains cheaper than other blockchains, the increase in compute pricing could reduce its competitiveness compared to other platforms with similar goals of enabling full-stack on-chain applications and offering infinite scalability. Notably, Skale has already reached out, claiming to be more affordable and scalable, and Walrus (Sui) has the potential to capture some of this market as well.

2 Likes

Thank you @FranHefner for the great question on the impact on the total burn rate!

Based on my calculations outlined below, the burn rate would increase by approximately 42.6 billion cycles per second.

Here is breakdown of my calculation:

Message Base Fee:
According to the IC dashboard, there were, on average, 3000 update calls per second over the last year. Multiplying 3000 update calls by the increased base message fee of 4.41 million cycles results in an added burn of 13.2 billion cycles per second.

Instruction Fee:
The dashboard shows an average of 40,000 MIEPs (Million Instructions Executed Per Second) last year. Current levels are around 190,000 MIEPs; however, this includes message canister overhead and could result in an overestimation. Multiplying 40,000 MIEPs by the increased instruction cost of 0.6 cycles leads to an additional burn of 24 billion cycles per second.

Canister Installation Fee:
As per the dashboard, last year, 424,000 canisters were installed, equivalent to 0.0134 canisters per second. Multiplying this rate by the increased fee of 0.4 trillion cycles results in a burn of 5.4 billion cycles per second.

3 Likes

Thank you, @Ajki for your feedback and analysis!

I agree with your point that the cycles’ burn rate should ultimately balance out node rewards and contribute to offsetting governance rewards. Achieving this balance involves considering several factors: the number of nodes (including spare ones), subnet capacities (which will increase with future protocol efficiencies), and the development of burn demand over time, etc. (Compare also the more detailed discussion here to which you also contributed).

The scope of this particular forum post is narrower, focusing specifically on suggested price changes intended to address recent capacity issues. Therefore, the analysis reviews very specific burn scenarios that align with recent demand patterns where subnets experienced maximum load.

2 Likes

The fee adjustments together with the future ability to migrate your canister (with retained canister id and data) to a subnet with lower load will greatly improve the current situation.

Have you also considered the possibility of letting there be different pricing structures on different subnets?

For instance, setting a significantly higher canister installation fee on a subnet would reduce the risk of BOB mining canisters being deployed there. For another project, such as KongSwap, paying $100 to deploy their primary swap canister would not be an issue, as they have a revenue model that would quickly offset this cost.

At the other end of the spectrum, you could imagine cheaper subnets with fewer nodes for non-critical use cases.

This is similar to how people think about Ethereum L1/L2/L3 chains. The Ethereum mainnet is expensive and slow but provides strong guarantees, while L2 chains are cheaper and faster but with weaker guarantees.

8 Likes

Thank you for the feedback @kristofer !

Given that this thread focuses on short-term changes related to the recent capacity issues, a more complex pricing structure has not been considered. Having different price levels on different subnets is an interesting idea, but would require a deeper review and discussion. One key question seems to be: What are the advantages & disadvantages of having different price levels vs enhancements with respect to load balancing, which appear in the outlook section of this scalability post. Furthermore, what precisely would an developer get in return for higher costs? I think it would make sense to look into potential further pricing enhancements as part of the work on load balancing.

1 Like

Increased deployment cost would decrease the likelihood of the subnet filling up with noisy neighbours (as someone put it). If the cost is high to deploy a BOB miner, you would most likely choose a cheaper subnet since the ROI is … unclear. For the KongSwap canister the ROI calculation looks different. Deploy once, earn lots of revenue over the coming years. Then yeah, you could definitely pay more for deployment to be in a slightly quieter subnet.

But as you say. This is a conversation for another time or thread.

2 Likes

Could be interesting to add (pls correct if wrong):
When you make a call, cycles are reserved not only for the outgoing message but also for the potential maximum-sized response. Once the actual response is received, any excess cycles that were reserved but not used for the response are refunded to the calling canister.
The caller pays for both the outgoing message and the response, with any unused cycles for the response being refunded.
The response message does not incur a separate base fee. Instead, the initial base fee for the call covers both the request and the response.

In other words, a canister that just responds to calls without making any, is not affected by the base message fee pricing change, only the instructions fee change and canister installation fee change.

Increasing the canister installation fee by 400% would have a significant impact on Juno—and any infrastructure projects that spin up canisters—so I would be opposed to it for strictly financial reasons.

5 Likes

The almost 10x of message costs is a huge change for utility like dapps that many of us are working on but not yet released. I’m a bit biased that these will ultimately make up 99% of IC activity and that the items listed in the analysis will be a small corner of the IC. This massive increase greatly reduces the possibility of these many-small-message-and-small-processing type utilities and autonomous agents.

It would be nice to have some more thought and options around how to keep the widest possible set of use cases available as we are still searching for product market fit.

I’m also concerned that ANY RAISING of prices will lead to the logical conclusion that the IC is not the place for immutable software as any currently blackholed canisters that have canister costs hardcoded or built-in cyclenomics are about to critically break. Given Moores law, cycle costs should only ever go down. And if they were not well calibrated before, let’s make damn sure they are now and there is basically 0% of increases in the future so that devs can reduce the complexity in their assumptions.

7 Likes

That is exactly how message fees are implemented.

2 Likes

Not arguing whether the fee increase is reasonable or not. But I will point out that the fee per byte is 1k cycles. So 5M cycles is equivalent to 5 KB of payload. A 2 MB payload is another almost 3 orders of magnitude more expensive.

Also, if one were to look at the incremental overhead of 5 KB of extra payload vs. one more message to route and account for and callback to track, it still seems to me like the latter is significantly higher. So it should cost at least as much.

Again, agree with the premise. But again, I will point out that given the current cycle fees I don’t think that a subnet can break even on costs. Maybe if it uses all 700 GB of state; all 4 CPU cores, with 3 of them reserved as compute allocation; and a whole lot of huge canister messages going back and forth. I’m not actually sure about the numbers, but last time I checked they were orders of magnitude below what you would need the average subnet to burn in order to break even.

In a vacuum, I would personally go back and reassess all fees and adjust them so it’s realistic to expect the average subnet to burn enough cycles to cover its running costs; plus a reasonable overhead (say 50%) to cover governance rewards once we have thousands and thousands.of subnets. Otherwise, as you say, every price adjustment to cover this or that (on the path to sustainable pricing) will keep breaking this or that, annoying these people or the other; and run into resistance and maybe get rejected. (Then later on, if it turns out subnets burn way too many cycles, we can go back and adjust down what turn out to be the more excessive fees. That would be a lot easier than edging them up 50% at a time until we get to the necessary 100x or whatever.)

1 Like

Let’s maybe look at concrete numbers. I can now have a canister that every minute runs a small task, and with the increased base fee from this proposal, this would cost 2.6T cycles per year in base fees (31556952 seconds per year * 1/60 calls per second * 5M cycles base fee per message = 2.6T cycles). I don’t think that is prohibitively expensive.

2 Likes

I think the idea we now followed to come with this proposal is aligned with your idea: as you can see from the examples in the proposal, if you fully use the compute capacity of a subnet (either with many small messages or with big computations), the subnet should burn more cycles than NPs get. This is if you purely use compute, but the load on a subnet can use multiple dimensions (eg, compute and consensus bandwidth), so that would allow the subnet to pay for itself if both resources are only 50% used. Now with future optimizations, we can likely still further improve how much load a subnet can handle, which again will make it easier to be economically viable without increasing cycles prices, such that every subnet is now expected to be deflationary at moderate usage and help offset the NNS rewards.

1 Like

In that case, it’s perfect.

I will point out though that while I was at Google in a previous life (and I hope they don’t send their lawyers after me, since this was 15 or so years ago) they made a huge concerted effort to increase fleet utilization from what was likely 20%. And when they finally got to 40%+ there was big celebration and the effort was declared successful. Also keep in mind that this was for the most part a collaborative effort between internal teams, as opposed to what the IC is trying to do (bin packing randomly behaved, competing workloads).

Just something to keep in mind.

1 Like