Comparing Canister Cycles vs Performance Counter

From Internet Computer Wiki
Revision as of 10:52, 24 May 2022 by Andriy.berestovskyy (talk | contribs) (Created page with "This small example clarifies the Canister Cycles balance <code>ic0.canister_cycle_balance()</code> and Performance Counter <code>ic0.performance_counter()</code> for inter-can...")
(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)
Jump to: navigation, search

This small example clarifies the Canister Cycles balance ic0.canister_cycle_balance() and Performance Counter ic0.performance_counter() for inter-canister calls.

Setup

  1. There is a User and two Canisters: Canisters A and Canister B
  2. The User sends an 1KiB Ingress Message to Canister A
  3. The Canister A calls Canister B with an 2KiB Update Call
  4. The Canister B replies to Canister A with an 300-byte response
  5. The Canister A replies to User with an 500-byte response

Example Cycles Flow

Naming conventions:

  • 1K == 1'000
  • 1KiB == 1'024 bytes
  • 1M == 1'000'000
  • 1MiB == 1'048'576 bytes
  • 1B == 1'000'000'000
  • 1T == 1'000'000'000'000
What is Happening Canister A
Cycles Balance
Canister A
Perf Counter
Canister B
Cycles Balance
Canister B
Perf Counter
1. Initial state 1T N/A1) 1T N/A1)
2. Canister A receives 1KiB Ingress Message -1,2M
-1KiB*2K
≈999'996M
N/A1) 1T N/A1)
3. Canister A starts execution 2) -5B/10*4
≈997'996M
0
(5B limit)
1T N/A1)
4. Canister A executes 100M WASM instructions 997'996M +100M
=100M
(5B limit)
1T N/A1)
5. Canister A sends 2KiB call to Canister B 3) -260K
-2KiB*1K
-5B/10*4
-2MiB*1K
≈993'897M
+3*20
+1KiB
≈100M
(5B limit)
1T N/A1)
5. Canister A finishes execution 4) +(5B-100M)*4/10
≈995'857M
N/A1) 1T N/A1)
6. Canister B receives a call from Canister A 995'857M N/A1) -590K
≈999'999M
N/A1)
7. Canister B starts execution 2) 995'857M N/A1) -5B/10*4
≈997'999M
0
(5B limit)
8. Canister B executes 100M WASM instructions 995'857M N/A1) 997'999M +100M
=100M
(5B limit)
9. Canister B sends 300-byte response to Canister A 995'857M N/A1) 997'999M +2*20
+300
≈100M
(5B limit)
10. Canister B finishes execution 4) 995'857M N/A1) +(5B-100M)*4/10
≈999'959M
N/A1)
11. Canister A receives a response from Canister B 5) +(2MiB-300)*1K
≈997'953M
N/A1) 999'959M N/A1)
12. Canister A starts reply callback execution 6) 997'953M 0
(5B limit)
999'959M N/A1)
13. Canister A executes 100M WASM instructions 997'953M +100M
=100M
(5B limit)
999'959M N/A1)
14. Canister A sends 500-byte reply to User 997'953M +2*20
+500
≈100M
(5B limit)
999'959M N/A1)
15. Canister A finishes execution 4) +(5B-100M)*4/10
≈999'913M
N/A1) 999'959M N/A1)
Total Cycles Spent: 87M 41M


Notes:

  1. The Performance Counter is available only during execution, so it's marked as N/A when the execution has not started yet.
  2. At the moment, there is a 5B instructions limit per normal message execution, so the Canister get charged for the maximum amount of Instructions it can potentially execute.
  3. The Canister get charged:
    260'000
    for the inter-canister call
    2KiB * 1'000
    for byte transmission
    5B/10*4
    for 5B instructions limit to process the response
    2MiB * 1K
    for the maximum response size
  4. The Canister gets a refund for the unused Instructions.
  5. The Canister gets a refund for the unused response bytes.
  6. The Canister has already been charged for the reply callback.

References

  1. The Internet Computer Interface Specification
  2. The Internet Computer Computation and Storage Costs
  3. Community Conversations | Charging Canister Cycles