Difference between revisions of "Comparing Canister Cycles vs Performance Counter"
From Internet Computer Wiki
m |
m |
||
| Line 2: | Line 2: | ||
== Setup == | == Setup == | ||
| − | |||
# The ''User'' sends an 1KiB ''Ingress Message'' to ''Canister A'' | # The ''User'' sends an 1KiB ''Ingress Message'' to ''Canister A'' | ||
# The ''Canister A'' calls ''Canister B'' with an 2KiB ''Update Call'' | # The ''Canister A'' calls ''Canister B'' with an 2KiB ''Update Call'' | ||
| − | # The ''Canister B'' | + | # The ''Canister B'' responds to ''Canister A'' with an 300-byte reply |
| − | # The ''Canister A'' | + | # The ''Canister A'' responds to ''User'' with an 500-byte reply |
== Example Cycles Flow == | == Example Cycles Flow == | ||
| Line 41: | Line 40: | ||
|style=text-align:left| 8. ''Canister B'' executes 100M WASM instructions || <code>995'857M</code> || <code>N/A</code><sup>1)</sup> || <code>997'999M</code> || +100M<br><code>=100M</code><br>(5B limit) | |style=text-align:left| 8. ''Canister B'' executes 100M WASM instructions || <code>995'857M</code> || <code>N/A</code><sup>1)</sup> || <code>997'999M</code> || +100M<br><code>=100M</code><br>(5B limit) | ||
|- | |- | ||
| − | |style=text-align:left| 9. ''Canister B'' sends 300-byte | + | |style=text-align:left| 9. ''Canister B'' sends 300-byte reply to ''Canister A'' || <code>995'857M</code> || <code>N/A</code><sup>1)</sup> || <code>997'999M</code> || +2*21<br>+300<br><code>≈100M</code><br>(5B limit) |
|- | |- | ||
|style=text-align:left| 10. ''Canister B'' finishes execution <sup>4)</sup> || <code>995'857M</code> || <code>N/A</code><sup>1)</sup> || +(5B-100M)*4/10<br><code>≈999'959M</code> || <code>N/A</code><sup>1)</sup> | |style=text-align:left| 10. ''Canister B'' finishes execution <sup>4)</sup> || <code>995'857M</code> || <code>N/A</code><sup>1)</sup> || +(5B-100M)*4/10<br><code>≈999'959M</code> || <code>N/A</code><sup>1)</sup> | ||
|- | |- | ||
| − | |style=text-align:left| 11. ''Canister A'' receives a | + | |style=text-align:left| 11. ''Canister A'' receives a reply from ''Canister B'' <sup>5)</sup> || +(2MiB-300)*1K<br><code>≈997'953M</code> || <code>N/A</code><sup>1)</sup> || <code>999'959M</code> || <code>N/A</code><sup>1)</sup> |
|- | |- | ||
|style=text-align:left| 12. ''Canister A'' starts reply callback execution <sup>6)</sup> || <code>997'953M</code> || <code>0</code><br>(5B limit) || <code>999'959M</code> || <code>N/A</code><sup>1)</sup> | |style=text-align:left| 12. ''Canister A'' starts reply callback execution <sup>6)</sup> || <code>997'953M</code> || <code>0</code><br>(5B limit) || <code>999'959M</code> || <code>N/A</code><sup>1)</sup> | ||
| Line 65: | Line 64: | ||
#; 260'000 : for the inter-canister call | #; 260'000 : for the inter-canister call | ||
#; 2KiB * 1'000 : for byte transmission | #; 2KiB * 1'000 : for byte transmission | ||
| − | #; 5B/10*4 : for 5B instructions limit to process the | + | #; 5B/10*4 : for 5B instructions limit to process the reply |
| − | #; 2MiB * 1K : for the maximum | + | #; 2MiB * 1K : for the maximum reply size |
# The Canister gets a refund for the unused Instructions. | # The Canister gets a refund for the unused Instructions. | ||
| − | # The Canister gets a refund for the unused | + | # The Canister gets a refund for the unused reply bytes. |
# The Canister has already been charged for the reply callback. | # The Canister has already been charged for the reply callback. | ||
Revision as of 12:52, 24 May 2022
This example clarifies the charges in terms of Canister Cycles (i.e. ic0.canister_cycle_balance()) and WASM Instructions (i.e. ic0.performance_counter()).
Setup
- The User sends an 1KiB Ingress Message to Canister A
- The Canister A calls Canister B with an 2KiB Update Call
- The Canister B responds to Canister A with an 300-byte reply
- The Canister A responds to User with an 500-byte reply
Example Cycles Flow
Naming conventions:
1K == 1'0001KiB == 1'024 bytes1M == 1'000'0001MiB == 1'048'576 bytes1B == 1'000'000'0001T == 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*21 +2KiB ≈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 reply to Canister A | 995'857M |
N/A1) |
997'999M |
+2*21 +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 reply 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*21 +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: | ~87M Cyclesfor ~200M WASM Instructions Executed + messaging |
~41M Cyclesfor ~100M WASM Instructions Executed + messaging |
Notes:
- The Performance Counter is available only during execution, so it's marked as
N/Awhen the execution has not started yet. - 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.
- 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 reply
- 2MiB * 1K
- for the maximum reply size
- The Canister gets a refund for the unused Instructions.
- The Canister gets a refund for the unused reply bytes.
- The Canister has already been charged for the reply callback.