-
Notifications
You must be signed in to change notification settings - Fork 3
/
index.html
236 lines (224 loc) · 16.7 KB
/
index.html
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
<!doctype html>
<html lang="en">
<head>
<!-- Required meta tags -->
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
<link rel="shortcut icon" href="favicon.ico">
<!-- Bootstrap CSS -->
<link href="https://cdn.jsdelivr.net/npm/[email protected]/dist/css/bootstrap.min.css" rel="stylesheet"
integrity="sha384-1BmE4kWBq78iYhFldvKuhfTAU6auU8tT94WrHftjDbrCEXSU1oBoqyl2QvZ6jIW3" crossorigin="anonymous">
<!-- Usage monitoring -->
<!-- <script type="text/javascript">
!function(T,l,y){var S=T.location,u="script",k="instrumentationKey",D="ingestionendpoint",C="disableExceptionTracking",E="ai.device.",I="toLowerCase",b="crossOrigin",w="POST",e="appInsightsSDK",t=y.name||"appInsights";(y.name||T[e])&&(T[e]=t);var n=T[t]||function(d){var g=!1,f=!1,m={initialize:!0,queue:[],sv:"4",version:2,config:d};function v(e,t){var n={},a="Browser";return n[E+"id"]=a[I](),n[E+"type"]=a,n["ai.operation.name"]=S&&S.pathname||"_unknown_",n["ai.internal.sdkVersion"]="javascript:snippet_"+(m.sv||m.version),{time:function(){var e=new Date;function t(e){var t=""+e;return 1===t.length&&(t="0"+t),t}return e.getUTCFullYear()+"-"+t(1+e.getUTCMonth())+"-"+t(e.getUTCDate())+"T"+t(e.getUTCHours())+":"+t(e.getUTCMinutes())+":"+t(e.getUTCSeconds())+"."+((e.getUTCMilliseconds()/1e3).toFixed(3)+"").slice(2,5)+"Z"}(),iKey:e,name:"Microsoft.ApplicationInsights."+e.replace(/-/g,"")+"."+t,sampleRate:100,tags:n,data:{baseData:{ver:2}}}}var h=d.url||y.src;if(h){function a(e){var t,n,a,i,r,o,s,c,p,l,u;g=!0,m.queue=[],f||(f=!0,t=h,s=function(){var e={},t=d.connectionString;if(t)for(var n=t.split(";"),a=0;a<n.length;a++){var i=n[a].split("=");2===i.length&&(e[i[0][I]()]=i[1])}if(!e[D]){var r=e.endpointsuffix,o=r?e.location:null;e[D]="https://"+(o?o+".":"")+"dc."+(r||"services.visualstudio.com")}return e}(),c=s[k]||d[k]||"",p=s[D],l=p?p+"/v2/track":config.endpointUrl,(u=[]).push((n="SDK LOAD Failure: Failed to load Application Insights SDK script (See stack for details)",a=t,i=l,(o=(r=v(c,"Exception")).data).baseType="ExceptionData",o.baseData.exceptions=[{typeName:"SDKLoadFailed",message:n.replace(/\./g,"-"),hasFullStack:!1,stack:n+"\nSnippet failed to load ["+a+"] -- Telemetry is disabled\nHelp Link: https://go.microsoft.com/fwlink/?linkid=2128109\nHost: "+(S&&S.pathname||"_unknown_")+"\nEndpoint: "+i,parsedStack:[]}],r)),u.push(function(e,t,n,a){var i=v(c,"Message"),r=i.data;r.baseType="MessageData";var o=r.baseData;return o.message='AI (Internal): 99 message:"'+("SDK LOAD Failure: Failed to load Application Insights SDK script (See stack for details) ("+n+")").replace(/\"/g,"")+'"',o.properties={endpoint:a},i}(0,0,t,l)),function(e,t){if(JSON){var n=T.fetch;if(n&&!y.useXhr)n(t,{method:w,body:JSON.stringify(e),mode:"cors"});else if(XMLHttpRequest){var a=new XMLHttpRequest;a.open(w,t),a.setRequestHeader("Content-type","application/json"),a.send(JSON.stringify(e))}}}(u,l))}function i(e,t){f||setTimeout(function(){!t&&m.core||a()},500)}var e=function(){var n=l.createElement(u);n.src=h;var e=y[b];return!e&&""!==e||"undefined"==n[b]||(n[b]=e),n.onload=i,n.onerror=a,n.onreadystatechange=function(e,t){"loaded"!==n.readyState&&"complete"!==n.readyState||i(0,t)},n}();y.ld<0?l.getElementsByTagName("head")[0].appendChild(e):setTimeout(function(){l.getElementsByTagName(u)[0].parentNode.appendChild(e)},y.ld||0)}try{m.cookie=l.cookie}catch(p){}function t(e){for(;e.length;)!function(t){m[t]=function(){var e=arguments;g||m.queue.push(function(){m[t].apply(m,e)})}}(e.pop())}var n="track",r="TrackPage",o="TrackEvent";t([n+"Event",n+"PageView",n+"Exception",n+"Trace",n+"DependencyData",n+"Metric",n+"PageViewPerformance","start"+r,"stop"+r,"start"+o,"stop"+o,"addTelemetryInitializer","setAuthenticatedUserContext","clearAuthenticatedUserContext","flush"]),m.SeverityLevel={Verbose:0,Information:1,Warning:2,Error:3,Critical:4};var s=(d.extensionConfig||{}).ApplicationInsightsAnalytics||{};if(!0!==d[C]&&!0!==s[C]){method="onerror",t(["_"+method]);var c=T[method];T[method]=function(e,t,n,a,i){var r=c&&c(e,t,n,a,i);return!0!==r&&m["_"+method]({message:e,url:t,lineNumber:n,columnNumber:a,error:i}),r},d.autoExceptionInstrumented=!0}return m}(y.cfg);(T[t]=n).queue&&0===n.queue.length&&n.trackPageView({})}(window,document,{
src: "https://az416426.vo.msecnd.net/scripts/b/ai.2.min.js", // The SDK URL Source
//name: "appInsights", // Global SDK Instance name defaults to "appInsights" when not supplied
//ld: 0, // Defines the load delay (in ms) before attempting to load the sdk. -1 = block page load and add to head. (default) = 0ms load after timeout,
//useXhr: 1, // Use XHR instead of fetch to report failures (if available),
//crossOrigin: "anonymous", // When supplied this will add the provided value as the cross origin attribute on the script tag
cfg: { // Application Insights Configuration
instrumentationKey: "8f84391c-82e5-4ef1-bf89-3e15ae7d10fc"
/* ...Other Configuration Options... */
}});
</script> -->
<title>CVS for GCP Calculator</title>
<script src="calculator.js"></script>
<link rel="stylesheet" href="calculator.css">
</head>
<body onload="getResults()">
<script src="https://cdn.jsdelivr.net/npm/[email protected]/dist/js/bootstrap.bundle.min.js"
integrity="sha384-ka7Sk0Gln4gmtz2MlQnikT1wXgYsOg+OMhuP+IlRH9sENBO0LRn5q+8nbTov4+1p"
crossorigin="anonymous"></script>
<div class="container">
<div class="card">
<div class="card-header">
<img src="cvsicon.svg" height="40">
<span class="h6 ms-2">CVS for GCP Calculator</span>
</div>
<div class="card-body">
<small id="volumewarning" class="form-text text-muted">CVS-Performance: Volume size is between 1024GiB
and 100TiB. CVS: Pool size is between 1024GiB and 200TiB.</small>
<div class="input-group mb-3">
<span class="my-1 input-group-text">Size</span>
<input oninput="getResults()" type="text" class="my-1 mr-sm-1 form-control" placeholder="" value="1"
aria-label="Size" aria-describedby="Size" id="capinput"></input>
<div class="btn-group my-1 mr-sm-1" role="group" aria-label="units">
<input onclick="getResults()" type="radio" class="btn-check" name="units" id="GiB" value="1024"
autocomplete="off">
<label class="btn btn-outline-primary" for="GiB">GiB</label>
<input onclick="getResults()" type="radio" class="btn-check" name="units" id="TiB" value="1"
autocomplete="off" checked>
<label class="btn btn-outline-primary" for="TiB">TiB</label>
</div>
</div>
<small id="iomix" class="form-text text-muted">Read / Write ratio of workload</small>
<div class="d-flex justify-content-between">
<label for="ms" id="readtext"></label>
<label for="ms" id="writetext"></label>
</div>
<input type="range" class="form-range" min="0" max="100" step="10" value="0" id="ms" onchange="getResults()">
<div id="tableout">
<table class='table-bordered table table-sm table-hover'>
<thead class='table-primary'>
<tr>
<th class="align-top">Standard-SW</th>
<th>Standard<br><small class="text-muted">(128MiB/s per TiB)</small></th>
<th>Zone Redundant<br><small class="text-muted">(128MiB/s per TiB)</small></th>
</tr>
</thead>
<tr>
<td>Throughput<small>(MiB/s)</small></td>
<td id="tput_swstandard_cell"></td>
<td id="tput_swstandardredundant_cell"></td>
</tr>
<tr class="d-none">
<td id="swiosizecell_64">IOPS <small>(64k Sequential)</small></td>
<td id="iops_swstandard_cell_64"></td>
<td id="iops_swstandardredundant_cell_64"></td>
</tr>
<tr class="d-none">
<td id="swiosizecell_8">IOPS <small>(8k Random)</small></td>
<td id="iops_swstandard_cell_8"></td>
<td id="iops_swstandardredundant_cell_8"></td>
</tr>
<tr>
<td id="sw_table_unit">Pool Size <small>(GiB)</small></td>
<td id="size_swstandard_cell"></td>
<td id="size_swstandardredundant_cell"></td>
</tr>
<tr class='table-success'>
<td>Pool Cost <small>(USD/month)</small></td>
<td id="cost_swstandard_cell"></td>
<td id="cost_swstandardredundant_cell"></td>
</tr>
</table>
<table class='table-bordered table table-sm table-hover'>
<thead class='table-primary'>
<tr>
<th class="align-top">CVS-Performance</th>
<th>Standard<br><small class="text-muted">(16MiB/s per TiB)</small></th>
<th>Premium<br><small class="text-muted">(64MiB/s per TiB)</small></th>
<th>Extreme<br><small class="text-muted">(128MiB/s per TiB)</small></th>
</tr>
</thead>
<tr>
<td>Throughput <small>(MiB/s)</small></td>
<td id="tput_standard_cell"></td>
<td id="tput_premium_cell"></td>
<td id="tput_extreme_cell"></td>
</tr>
<tr class="d-none">
<td id="iosizecell_64">IOPS <small>(64k Sequential)</small></td>
<td id="iops_standard_cell_64"></td>
<td id="iops_premium_cell_64"></td>
<td id="iops_extreme_cell_64"></td>
</tr>
<tr class="d-none">
<td id="iosizecell_4">IOPS <small>(4k Random)</small></td>
<td id="iops_standard_cell_4"></td>
<td id="iops_premium_cell_4"></td>
<td id="iops_extreme_cell_4"></td>
</tr>
<tr>
<td id="table_unit">Volume Size <small>(GiB)</small></td>
<td id="size_standard_cell"></td>
<td id="size_premium_cell"></td>
<td id="size_extreme_cell"></td>
</tr>
<tr class='table-success'>
<td>Volume Cost <small>(USD/month)</small></td>
<td id="cost_standard_cell"></td>
<td id="cost_premium_cell"></td>
<td id="cost_extreme_cell"></td>
</tr>
</table>
<small id="crrwarning" class="form-text text-muted">Specify percent daily change rate (1 - 100) to
calculate replication costs (typically 1-5%).</small>
<div class="input-group mb-3">
<div class="input-group-prepend">
<span class="my-1 input-group-text">Change Rate</span>
</div>
<input oninput="getResults()" type="text" class="my-1 mr-sm-1 form-control" placeholder=""
value="0" aria-label="Change Rate" aria-describedby="Change Rate" id="changerate"></input>
<label class="my-1 input-group-text" for="Change Rate">% Daily</label>
</div>
<table class='table-bordered table table-sm table-hover' id='replicationcost'>
<thead class='table-primary'>
<tr>
<th class="align-top">Replication Frequency</th>
<th>10 minutes<br><small class="text-muted">(0.17USD/GiB per month)</small></th>
<th>hourly<br><small class="text-muted">(0.15USD/GiB per month)</small></th>
<th>daily<br><small class="text-muted">(0.14USD/GiB per month)</small></th>
</tr>
</thead>
<tr>
<td>Initial Transfer Cost <small>(USD)</small></td>
<td id="init_10min_cell"></td>
<td id="init_hourly_cell"></td>
<td id="init_daily_cell"></td>
</tr>
<tr>
<td>Subsequent Months <small>(USD/month)</small></td>
<td id="inc_10min_cell"></td>
<td id="inc_hourly_cell"></td>
<td id="inc_daily_cell"></td>
</tr>
<tr>
<td>Replication Cost First Month <small>(USD/month)</small></td>
<td id="month1_10min_cell"></td>
<td id="month1_hourly_cell"></td>
<td id="month1_daily_cell"></td>
</tr>
</table>
<table class='table-bordered table table-sm table-hover' id="destinationvolume">
<thead class='table-primary'>
<tr>
<th class="align-top">CVS-Performance<br>Destination Volume</th>
<th>Standard<br><small class="text-muted">(16MiB/s per TiB)</small></th>
<th>Premium<br><small class="text-muted">(64MiB/s per TiB)</small></th>
<th>Extreme<br><small class="text-muted">(128MiB/s per TiB)</small></th>
</tr>
</thead>
<tr>
<td id="dest_table_unit">Volume Size <small>(GiB)</small></td>
<td id="dest_size_standard_cell"></td>
<td id="dest_size_premium_cell"></td>
<td id="dest_size_extreme_cell"></td>
</tr>
<tr>
<td>Volume Cost <small>(USD/month)</small></td>
<td id="dest_cost_standard_cell"></td>
<td id="dest_cost_premium_cell"></td>
<td id="dest_cost_extreme_cell"></td>
</tr>
</table>
</div>
</div>
<div class="card-footer">
<small class="text-muted">monthly costs are based on a 730 hour billing month</small>
<br>
<small class="text-muted">calculator is for estimation purposes only. no guarantees</small>
<br>
<small class="text-muted">performance numbers are upper limits</small>
<br>
<small class="text-muted">throughput is based on 64KiB block size</small>
<br>
<small class="text-muted">source: <a
href="https://cloud.google.com/architecture/partners/netapp-cloud-volumes/service-levels"
target="_blank">Service Levels</a>, <a
href="https://cloud.google.com/architecture/partners/netapp-cloud-volumes/costs"
target="_blank">Pricing</a>, <a
href="https://cloud.netapp.com/blog/introduction-to-cloud-volumes-service-for-gcp"
target="_blank">Performance</a>
</small>
</div>
</div>
<div class="text-end">
<small class="text-muted">©Copyright 2021 <a href="https://github.com/seanluce"
target="_blank">@seanluce</a>
, 2022 <a href="https://github.com/okrause"
target="_blank">@okrause</a> </small>
</div>
</div>
</body>
</html>