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
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
1001
1002
1003
1004
1005
1006
1007
1008
1009
1010
1011
1012
1013
1014
1015
1016
1017
1018
1019
1020
1021
1022
1023
1024
1025
1026
1027
1028
1029
1030
1031
1032
1033
1034
1035
1036
1037
1038
1039
1040
1041
1042
1043
1044
1045
1046
1047
1048
1049
1050
1051
1052
1053
1054
1055
1056
1057
1058
1059
1060
1061
1062
1063
1064
1065
1066
1067
1068
1069
1070
1071
1072
1073
1074
1075
1076
1077
1078
1079
1080
1081
1082
1083
1084
1085
1086
1087
1088
1089
1090
1091
1092
1093
1094
1095
1096
1097
1098
1099
1100
1101
1102
1103
1104
1105
1106
1107
1108
1109
1110
1111
1112
1113
1114
1115
1116
1117
1118
1119
1120
1121
1122
1123
1124
1125
1126
1127
1128
1129
1130
1131
1132
1133
1134
1135
1136
1137
1138
1139
1140
1141
1142
1143
1144
1145
1146
1147
1148
1149
1150
1151
1152
1153
1154
1155
1156
1157
1158
1159
1160
1161
1162
1163
1164
1165
1166
1167
1168
1169
1170
1171
1172
1173
1174
1175
1176
1177
1178
1179
1180
1181
1182
1183
1184
1185
1186
1187
1188
1189
1190
1191
1192
1193
1194
1195
|
{
"cells": [
{
"cell_type": "code",
"execution_count": 71,
"id": "18170001",
"metadata": {},
"outputs": [],
"source": [
"import numpy as np\n",
"import pandas as pd\n",
"import matplotlib.pyplot as plt\n",
"\n",
"from IPython.display import display, HTML\n",
"\n",
"base_folder = \"../../../../..\""
]
},
{
"cell_type": "markdown",
"id": "422f4d05",
"metadata": {},
"source": [
"## Topologies"
]
},
{
"cell_type": "code",
"execution_count": 72,
"id": "a2d05361",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Topology name: multi\n"
]
},
{
"data": {
"text/html": [
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>ClusterID</th>\n",
" <th>ClusterName</th>\n",
" <th>Cores</th>\n",
" <th>Speed</th>\n",
" <th>Memory</th>\n",
" <th>numberOfHosts</th>\n",
" <th>memoryCapacityPerHost</th>\n",
" <th>coreCountPerHost</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>A01</td>\n",
" <td>A01</td>\n",
" <td>32</td>\n",
" <td>3.20</td>\n",
" <td>2048</td>\n",
" <td>1</td>\n",
" <td>256</td>\n",
" <td>32</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>B01</td>\n",
" <td>B01</td>\n",
" <td>48</td>\n",
" <td>2.93</td>\n",
" <td>1256</td>\n",
" <td>6</td>\n",
" <td>64</td>\n",
" <td>8</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>C01</td>\n",
" <td>C01</td>\n",
" <td>32</td>\n",
" <td>3.20</td>\n",
" <td>2048</td>\n",
" <td>2</td>\n",
" <td>128</td>\n",
" <td>16</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>"
],
"text/plain": [
"<IPython.core.display.HTML object>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"Topology name: single\n"
]
},
{
"data": {
"text/html": [
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>ClusterID</th>\n",
" <th>ClusterName</th>\n",
" <th>Cores</th>\n",
" <th>Speed</th>\n",
" <th>Memory</th>\n",
" <th>numberOfHosts</th>\n",
" <th>memoryCapacityPerHost</th>\n",
" <th>coreCountPerHost</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>A01</td>\n",
" <td>A01</td>\n",
" <td>8</td>\n",
" <td>3.2</td>\n",
" <td>128</td>\n",
" <td>1</td>\n",
" <td>128</td>\n",
" <td>8</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>"
],
"text/plain": [
"<IPython.core.display.HTML object>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"def read_topology(topology_name):\n",
" print(f\"Topology name: {topology_name}\")\n",
" df = pd.read_csv(f\"{base_folder}/resources/env/{topology_name}.txt\", delimiter=\";\")\n",
" display(HTML(df.to_html()))\n",
" \n",
"read_topology(\"multi\")\n",
"read_topology(\"single\")"
]
},
{
"cell_type": "markdown",
"id": "8f4fe54d",
"metadata": {},
"source": [
"## Traces"
]
},
{
"cell_type": "code",
"execution_count": 73,
"id": "fd17d88a",
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>id</th>\n",
" <th>timestamp</th>\n",
" <th>duration</th>\n",
" <th>cpu_count</th>\n",
" <th>cpu_usage</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>276974</th>\n",
" <td>997</td>\n",
" <td>2013-09-11 13:19:58+00:00</td>\n",
" <td>300000</td>\n",
" <td>8</td>\n",
" <td>10524.798812</td>\n",
" </tr>\n",
" <tr>\n",
" <th>276975</th>\n",
" <td>997</td>\n",
" <td>2013-09-11 13:24:58+00:00</td>\n",
" <td>300000</td>\n",
" <td>8</td>\n",
" <td>10761.598785</td>\n",
" </tr>\n",
" <tr>\n",
" <th>276976</th>\n",
" <td>997</td>\n",
" <td>2013-09-11 13:29:58+00:00</td>\n",
" <td>300000</td>\n",
" <td>8</td>\n",
" <td>12289.598612</td>\n",
" </tr>\n",
" <tr>\n",
" <th>276977</th>\n",
" <td>997</td>\n",
" <td>2013-09-11 13:34:58+00:00</td>\n",
" <td>300000</td>\n",
" <td>8</td>\n",
" <td>10044.798866</td>\n",
" </tr>\n",
" <tr>\n",
" <th>276978</th>\n",
" <td>997</td>\n",
" <td>2013-09-11 13:39:58+00:00</td>\n",
" <td>300000</td>\n",
" <td>8</td>\n",
" <td>11751.998673</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" id timestamp duration cpu_count cpu_usage\n",
"276974 997 2013-09-11 13:19:58+00:00 300000 8 10524.798812\n",
"276975 997 2013-09-11 13:24:58+00:00 300000 8 10761.598785\n",
"276976 997 2013-09-11 13:29:58+00:00 300000 8 12289.598612\n",
"276977 997 2013-09-11 13:34:58+00:00 300000 8 10044.798866\n",
"276978 997 2013-09-11 13:39:58+00:00 300000 8 11751.998673"
]
},
"execution_count": 73,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"df_trace = pd.read_parquet(f\"{base_folder}/resources/bitbrains-small/trace/trace.parquet\")\n",
"df_trace.tail()"
]
},
{
"cell_type": "code",
"execution_count": 74,
"id": "264f6ba7",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"50"
]
},
"execution_count": 74,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"len(df_server_single[\"server_id\"].unique())"
]
},
{
"cell_type": "code",
"execution_count": 75,
"id": "346f097f",
"metadata": {
"scrolled": true
},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>id</th>\n",
" <th>start_time</th>\n",
" <th>stop_time</th>\n",
" <th>cpu_count</th>\n",
" <th>cpu_capacity</th>\n",
" <th>mem_capacity</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>1019</td>\n",
" <td>2013-08-12 13:35:46+00:00</td>\n",
" <td>2013-09-11 13:39:58+00:00</td>\n",
" <td>1</td>\n",
" <td>2926.000135</td>\n",
" <td>181352</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>1023</td>\n",
" <td>2013-08-12 13:35:46+00:00</td>\n",
" <td>2013-09-11 13:39:58+00:00</td>\n",
" <td>1</td>\n",
" <td>2925.999560</td>\n",
" <td>260096</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>1026</td>\n",
" <td>2013-08-12 13:35:46+00:00</td>\n",
" <td>2013-09-11 13:39:58+00:00</td>\n",
" <td>1</td>\n",
" <td>2925.999717</td>\n",
" <td>249972</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>1052</td>\n",
" <td>2013-08-29 14:38:12+00:00</td>\n",
" <td>2013-09-05 07:09:07+00:00</td>\n",
" <td>1</td>\n",
" <td>2926.000107</td>\n",
" <td>131245</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>1073</td>\n",
" <td>2013-08-21 11:07:12+00:00</td>\n",
" <td>2013-09-11 13:39:58+00:00</td>\n",
" <td>1</td>\n",
" <td>2599.999649</td>\n",
" <td>179306</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" id start_time stop_time cpu_count \\\n",
"0 1019 2013-08-12 13:35:46+00:00 2013-09-11 13:39:58+00:00 1 \n",
"1 1023 2013-08-12 13:35:46+00:00 2013-09-11 13:39:58+00:00 1 \n",
"2 1026 2013-08-12 13:35:46+00:00 2013-09-11 13:39:58+00:00 1 \n",
"3 1052 2013-08-29 14:38:12+00:00 2013-09-05 07:09:07+00:00 1 \n",
"4 1073 2013-08-21 11:07:12+00:00 2013-09-11 13:39:58+00:00 1 \n",
"\n",
" cpu_capacity mem_capacity \n",
"0 2926.000135 181352 \n",
"1 2925.999560 260096 \n",
"2 2925.999717 249972 \n",
"3 2926.000107 131245 \n",
"4 2599.999649 179306 "
]
},
"execution_count": 75,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"df_meta = pd.read_parquet(f\"{base_folder}/resources/bitbrains-small/trace/meta.parquet\")\n",
"df_meta.head()"
]
},
{
"cell_type": "markdown",
"id": "13bf9fdb",
"metadata": {},
"source": [
"# Lets run this in OpenDC!"
]
},
{
"cell_type": "markdown",
"id": "c9766446",
"metadata": {},
"source": [
"## Resulting Files"
]
},
{
"cell_type": "code",
"execution_count": 76,
"id": "0d400ffd",
"metadata": {},
"outputs": [],
"source": [
"output_folder = f\"{base_folder}/output\"\n",
"workload = \"workload=bitbrains-small\"\n",
"seed = \"seed=0\"\n",
"\n",
"df_host_single = pd.read_parquet(f\"{output_folder}/host/topology=single/{workload}/{seed}/data.parquet\")\n",
"df_host_multi = pd.read_parquet(f\"{output_folder}/host/topology=multi/{workload}/{seed}/data.parquet\")\n",
"\n",
"df_server_single = pd.read_parquet(f\"{output_folder}/server/topology=single/{workload}/{seed}/data.parquet\")\n",
"df_server_multi = pd.read_parquet(f\"{output_folder}/server/topology=multi/{workload}/{seed}/data.parquet\")\n",
"\n",
"df_service_single = pd.read_parquet(f\"{output_folder}/service/topology=single/{workload}/{seed}/data.parquet\")\n",
"df_service_multi = pd.read_parquet(f\"{output_folder}/service/topology=multi/{workload}/{seed}/data.parquet\")\n",
"\n",
"def add_absolute_timestamp(df, start_dt):\n",
" df[\"absolute_timestamp\"] = start_dt + (df[\"timestamp\"] - df[\"timestamp\"].min())\n",
"\n",
"add_absolute_timestamp(df_host_single, df_meta[\"start_time\"].min())\n",
"add_absolute_timestamp(df_host_single, df_meta[\"start_time\"].min())\n",
"\n",
"add_absolute_timestamp(df_server_single, df_meta[\"start_time\"].min())\n",
"add_absolute_timestamp(df_server_multi, df_meta[\"start_time\"].min())\n",
"\n",
"add_absolute_timestamp(df_service_single, df_meta[\"start_time\"].min())\n",
"add_absolute_timestamp(df_service_multi, df_meta[\"start_time\"].min())"
]
},
{
"cell_type": "markdown",
"id": "6d494d6e",
"metadata": {},
"source": [
"### Host"
]
},
{
"cell_type": "code",
"execution_count": 77,
"id": "48a1e1a6",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"['timestamp',\n",
" 'host_id',\n",
" 'cpu_count',\n",
" 'mem_capacity',\n",
" 'guests_terminated',\n",
" 'guests_running',\n",
" 'guests_error',\n",
" 'guests_invalid',\n",
" 'cpu_limit',\n",
" 'cpu_usage',\n",
" 'cpu_demand',\n",
" 'cpu_utilization',\n",
" 'cpu_time_active',\n",
" 'cpu_time_idle',\n",
" 'cpu_time_steal',\n",
" 'cpu_time_lost',\n",
" 'power_total',\n",
" 'uptime',\n",
" 'downtime',\n",
" 'boot_time']"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"number of measurements: 388881\n"
]
}
],
"source": [
"display(list(df_host_multi.columns))\n",
"print(f\"number of measurements: {len(df_host_multi)}\")"
]
},
{
"cell_type": "markdown",
"id": "9eb9be2c",
"metadata": {},
"source": [
"### Server"
]
},
{
"cell_type": "code",
"execution_count": 78,
"id": "57a2b148",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"['timestamp',\n",
" 'server_id',\n",
" 'host_id',\n",
" 'mem_capacity',\n",
" 'cpu_count',\n",
" 'cpu_limit',\n",
" 'cpu_time_active',\n",
" 'cpu_time_idle',\n",
" 'cpu_time_steal',\n",
" 'cpu_time_lost',\n",
" 'uptime',\n",
" 'downtime',\n",
" 'provision_time',\n",
" 'boot_time',\n",
" 'absolute_timestamp']"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"number of measurements: 2040140\n"
]
}
],
"source": [
"display(list(df_server_multi.columns))\n",
"print(f\"number of measurements: {len(df_server_multi)}\")"
]
},
{
"cell_type": "markdown",
"id": "fbe5f439",
"metadata": {},
"source": [
"### Service"
]
},
{
"cell_type": "code",
"execution_count": 79,
"id": "9ef468ed",
"metadata": {
"scrolled": false
},
"outputs": [
{
"data": {
"text/plain": [
"['timestamp',\n",
" 'hosts_up',\n",
" 'hosts_down',\n",
" 'servers_pending',\n",
" 'servers_active',\n",
" 'attempts_success',\n",
" 'attempts_failure',\n",
" 'attempts_error',\n",
" 'absolute_timestamp']"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"number of measurements: 43215\n"
]
}
],
"source": [
"display(list(df_service_single.columns))\n",
"print(f\"number of measurements: {len(df_host_single)}\")"
]
},
{
"cell_type": "markdown",
"id": "09d31c91",
"metadata": {},
"source": [
"## Power Usage"
]
},
{
"cell_type": "code",
"execution_count": 80,
"id": "82f0a24a",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"single topology: 822212243.0180907\n",
"multi topology: 5865297897.085712\n"
]
}
],
"source": [
"print(f\"single topology: {df_host_single.power_total.sum()}\")\n",
"print(f\"multi topology: {df_host_multi.power_total.sum()}\")"
]
},
{
"cell_type": "markdown",
"id": "7ab3357d",
"metadata": {},
"source": [
"## CPU usage"
]
},
{
"cell_type": "code",
"execution_count": 81,
"id": "e94db3a6",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"single topology: 0.7806848856408527\n",
"multi topology: 0.3425064770436447\n"
]
}
],
"source": [
"print(f\"single topology: {df_host_single.cpu_utilization.mean()}\")\n",
"print(f\"multi topology: {df_host_multi.cpu_utilization.mean()}\")"
]
},
{
"cell_type": "markdown",
"id": "e000a260",
"metadata": {},
"source": [
"## CPU utilization"
]
},
{
"cell_type": "code",
"execution_count": 82,
"id": "8d7daa45",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"multi topology: 0.3425064770436447\n",
"single topology: 0.7806848856408527\n"
]
}
],
"source": [
"print(f\"multi topology: {df_host_multi.cpu_utilization.mean()}\")\n",
"print(f\"single topology: {df_host_single.cpu_utilization.mean()}\")"
]
},
{
"cell_type": "markdown",
"id": "ad97741c",
"metadata": {},
"source": [
"## Plotting Results"
]
},
{
"cell_type": "code",
"execution_count": 83,
"id": "5df8f9aa",
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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PPGEIiMjFRYWpnnz5uns2bN68MEH1aNHD1166aVauXKly/EeeughDRo0SEFBQerXr58eeeQR1dfX++jqAABoOW5LmUB5ebluu+02LVq0SLfccotOnTqlN9980/ksoNdee02XXnqp3njjDW3dulVTp07Vtm3b9F//9V966623tGbNGt1zzz0aN26cLr30UklScHCwVq1apd69e2vPnj2aNm2agoOD9Ytf/MKXlwoAwDdi5sYEysvLdfbsWd16662Ki4vT8OHDNX36dHXr1k2S1KNHDy1btkyDBw/WT37yEw0ePFhnzpzRL3/5Sw0cOFCzZs2SzWZz+ZXwOXPmaPTo0YqLi9OECRP0wAMP6M9//rOvLhEAgBZj5sYERowYoeuvv17Dhw9XamqqbrjhBv3gBz9Q9+7dJUlXXHGFy09YREZGatiwYc7XVqtVPXv21PHjx51ta9as0bJly3Tw4EGdPn1aZ8+eVUhIiPcuCgAANzFzYwJWq1WbNm3S3//+dw0dOlTLly/X4MGD9dFHH0mS/P39XfpbLJZm2xobGyVJJSUluv322zV+/Hj97W9/065duzR79mzV1dV554IAAGgDZm5MwmKxaMyYMRozZozmzp2rvn376qWXXnLrWNu2bVPfvn01e/ZsZ9uRI0c8VSoAAO2KcGMCb731loqLi3XDDTcoIiJCb731liorK3X55Zfrvffea/XxBg4cqLKyMq1evVojR47Uhg0b3A5KAAB4G7elTCAkJERvvPGGxo8fr0GDBmnOnDlaunSpvvvd77p1vJtvvln33XefsrKyFB8fr23btumRRx7xcNUAALQPi3Hu+8IXierqaoWGhqqqqqrJAtnPP/9cH330kS677DIFBgb6qEJzYmwBoJNpy5P52+Ep+xf6/P46Zm4AAICpEG4AAICpEG4AAICpEG4AAICpEG6acZGtsfYKxhQA4C2Em68499TeM2fO+LgS8zk3pl9/MjIAAJ7GQ/y+wmq1KiwszPkbS0FBQbJYLD6uqnMzDENnzpzR8ePHFRYWJqvV6uuSAAAmR7j5mqioKEly+RFJtF1YWJhzbAEAaE+Em6+xWCyKjo5WRESE6uvrfV2OKfj7+zNjAwDwGsLNeVitVj6QAQDohFhQDAAATIVwAwAATIVwAwAATIVwAwAATIVwAwAATIVwAwAATIVwAwAATIVwAwAATIVw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W+EmKChIv/3tb7V48WIdPHhQktS/f39dcsklHi0OAACgtdr0EL/y8nKVl5dr4MCBuuSSS2QYhqfqAgAAcItb4ebf//63rr/+eg0aNEjjx49XeXm5JGnq1Kl8DRwAAPiUW+Hmvvvuk7+/v8rKyhQUFORsT0tLU1FRkceKAwAAaC231tz84x//0CuvvKJLL73UpX3gwIE6cuSIRwoDAABwh1szNzU1NS4zNud8+umnCggIaHNRAAAA7nIr3IwdO1Z//OMfna8tFosaGxu1aNEiXXfddR4rDgAAoLXcui21aNEiXX/99XrnnXdUV1enX/ziF3r//ff16aefauvWrZ6uEQAAoMXcmrkZNmyYPvzwQ1199dWaOHGiampqdOutt2rXrl3q37+/p2sEAABosVbP3NTX1+vGG29UQUGBZs+e3R41AQAAuK3VMzf+/v5677332qMWAACANnPrttQdd9yhFStWeLoWAACANnNrQfHZs2dVWFioV199VQkJCU1+Uyo3N9cjxQEAALRWq8LNoUOHFBcXp3/961+66qqrJEkffvihSx+LxeK56gAAAFqpVeFm4MCBKi8v1+uvvy7pi59bWLZsmSIjI9ulOAAAgNZq1Zqbr//q99///nfV1NS0uYj8/HzFxcUpMDBQSUlJ2r59+3n7rlu3TomJiQoLC9Mll1yi+Ph4Pfvss22uAQAAmINbC4rP+XrYcceaNWtkt9uVnZ2tnTt3asSIEUpNTdXx48eb7d+jRw/Nnj1bJSUleu+995SZmanMzEy98sorba4FAAB0fq0KNxaLpcmamrauscnNzdW0adOUmZmpoUOHqqCgQEFBQSosLGy2/7XXXqtbbrlFl19+ufr376+ZM2fqyiuv1JYtW9pUBwAAMIdWrbkxDENTpkxx/jjm559/rp/+9KdNvi21bt26Fh2vrq5OO3bs0KxZs5xtfn5+SklJUUlJSYvqee2111RaWqqFCxc226e2tla1tbXO19XV1S2qDQAAdE6tCjcZGRkur++44442nfzEiRNqaGhosiA5MjJS+/btO+9+VVVViomJUW1traxWq377299q3LhxzfbNycnRY4891qY6AQBA59GqcLNy5cr2qqNVgoODtXv3bp0+fVrFxcWy2+3q16+frr322iZ9Z82aJbvd7nxdXV2t2NhYL1YLAAC8ya2H+HlKeHi4rFarKioq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vPCCcejQIeMf//iH0b9/f+NHP/qRry6hUzh16pSxa9cuY9euXYYkIzc319i1a5dx5MgRwzAM4+GHHzbuvPNOZ/9zXwV/8MEHjb179xr5+fl8FbwjWr58udGnTx/DZrMZo0aNMv75z38637vmmmuMjIwMl/5//vOfjUGDBhk2m8244oorjA0bNni54s6pNePct29fQ1KTLTs72/uFdzKt/fP8VYSblmvtOG/bts1ISkoyAgICjH79+hm/+tWvjLNnz3q56s6nNeNcX19vPProo0b//v2NwMBAIzY21pg+fbrx2Wefeb/wTuT1119v9u/bc2ObkZFhXHPNNU32iY+PN2w2m9GvXz9j5cqV7V6nxTCYfwMAAObBmhsAAGAqhBsAAGAqhBsAAGAqhBsAAGAqhBsAAGAqhBsAAGAqhBsAAGAqhBsAAGAqhBsAphAXF6e8vDzna4vFovXr10uSDh8+LIvFot27d7drDddee63uvffedj0HgG9GuAHgwuFw6Oc//7n69eungIAAxcbGasKECS4/fhcXFyeLxSKLxaJLLrlEV111ldauXet8f8qUKZo0aVKTY2/evFkWi0UnT550u75Vq1YpLCysSfvbb7+tu+++u9l9YmNjVV5ermHDhrl93q8633WsW7dO8+fP98g5ALiPcAPA6fDhw0pISNBrr72mxYsXa8+ePSoqKtJ1112nGTNmuPSdN2+eysvLtWvXLo0cOVJpaWnatm2bjyqXevXqpaCgoGbfs1qtioqKUpcuXdq1hh49eig4OLhdzwHgmxFuADhNnz5dFotF27dv1/e//30NGjRIV1xxhex2u/75z3+69A0ODlZUVJQGDRqk/Px8de3aVf/zP//TpvM3NyOye/duWSwWHT58WJs3b1ZmZqaqqqqcM0ePPvqopKa3pb7q67elpkyZ4tz/q9vmzZslSc8++6wSExOd1zh58mQdP37ceazrrrtOktS9e3dZLBZNmTJFUtPbUp999pnS09PVvXt3BQUF6bvf/a7279/vfP/cLNQrr7yiyy+/XN26ddONN96o8vLyNo0jcLEj3ACQJH366acqKirSjBkzdMkllzR5v7lbQed06dJF/v7+qqura8cKpdGjRysvL08hISEqLy9XeXm5HnjggVYf58knn3TuX15erpkzZyoiIkJDhgyRJNXX12v+/Pl69913tX79eh0+fNgZYGJjY/WXv/xFklRaWqry8nI9+eSTzZ5nypQpeuedd/Tyyy+rpKREhmFo/Pjxqq+vd/Y5c+aMlixZomeffVZvvPGGysrK3LomAF9q3zlaAJ3GgQMHZBiG8wO+perq6rR06VJVVVXpO9/5TjtV9wWbzabQ0FBZLBZFRUW5fZzQ0FCFhoZK+mKdzO9+9zu9+uqrzmP+5Cc/cfbt16+fli1bppEjR+r06dPq1q2bevToIUmKiIg4b+jbv3+/Xn75ZW3dulWjR4+WJD333HOKjY3V+vXr9cMf/lDSF0GqoKBA/fv3lyRlZWVp3rx5bl8bAGZuAPw/wzBa1f+hhx5St27dFBQUpIULF2rBggW66aab2qm69rFr1y7deeed+s1vfqMxY8Y423fs2KEJEyaoT58+Cg4O1jXXXCNJKisra/Gx9+7dqy5duigpKcnZ1rNnTw0ePFh79+51tgUFBTmDjSRFR0c7b4EBcA8zNwAkSQMHDpTFYtG+ffta1P/BBx/UlClT1K1bN0VGRspisTjfCwkJ0ZEjR5rsc/LkSVmt1mZve0mSn98X/7/11aD11Vs4nuRwOHTzzTfrrrvu0tSpU53tNTU1Sk1NVWpqqp577jn16tVLZWVlSk1NbZfbbv7+/i6vLRZLq4MmAFfM3ACQ9MU3fVJTU5Wfn6+ampom73/9a8/h4eEaMGCAoqKiXIKNJA0ePFjvv/++amtrXdp37typyy67rMkH+jm9evWSJJcFtV9/No3NZlNDQ0NLL6tZn3/+uSZOnKghQ4YoNzfX5b19+/bp3//+txYsWKCxY8dqyJAhTWZSbDabJF2wjssvv1xnz57VW2+95Wz797//rdLSUg0dOrRN9QO4MMINAKf8/Hw1NDRo1KhR+stf/qL9+/dr7969WrZsmZKTk1t8nNtvv10Wi0Xp6enasWOHDhw4oMLCQuXl5en+++8/734DBgxQbGysHn30Ue3fv18bNmzQ0qVLXfrExcXp9OnTKi4u1okTJ3TmzJlWX+c999yjo0ePatmyZaqsrJTD4ZDD4VBdXZ369Okjm82m5cuX69ChQ3r55ZebPLumb9++slgs+tvf/qbKykqdPn26yTkGDhyoiRMnatq0adqyZYveffdd3XHHHYqJidHEiRNbXTOAliPcAHDq16+fdu7cqeuuu07333+/hg0bpnHjxqm4uFhPPfVUi48TFhamN998U/X19br55psVHx+vZcuWKTc3V/fcc8959/P399cLL7ygffv26corr9TChQv1+OOPu/QZPXq0fvrTnyotLU29evXSokWLWn2d//u//6vy8nINHTpU0dHRzm3btm3q1auXVq1apbVr12ro0KFasGCBlixZ4rJ/TEyMHnvsMT388MOKjIxUVlZWs+dZuXKlEhIS9L3vfU/JyckyDEMbN24878wVAM+wGNzcBQAAJsLMDQAAMBXCDQAAMBXCDQAAMBXCDQAAMBXCDQAAMBXCDQAAMBXCDQAAMBXCDQAAMBXCDQAAMBXCDQAAMBXCDQAAMJX/Ay9KFnPmNQ5MAAAAAElFTkSuQmCC",
"text/plain": [
"<Figure size 640x480 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"data = df_host_multi.cpu_utilization\n",
"plt.hist(data, weights=np.ones_like(data) / len(data),\n",
" alpha=0.7, label=\"big\", bins=30)\n",
"\n",
"\n",
"data = df_host_single.cpu_utilization\n",
"plt.hist(data, weights=np.ones_like(data) / len(data),\n",
" alpha=0.7, label=\"small\", bins=30)\n",
"\n",
"plt.xlabel(\"CPU utilization\")\n",
"plt.ylabel(\"Frequency\")\n",
"plt.legend()\n",
"plt.show()"
]
},
{
"cell_type": "code",
"execution_count": 84,
"id": "520e42a4",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"1.000000 30730\n",
"0.027452 10\n",
"0.021973 10\n",
"0.031040 10\n",
"0.002294 10\n",
" ... \n",
"0.000003 1\n",
"0.194198 1\n",
"0.025827 1\n",
"0.002296 1\n",
"0.000009 1\n",
"Name: cpu_utilization, Length: 2495, dtype: int64"
]
},
"execution_count": 84,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"df_host_single.cpu_utilization.value_counts()"
]
},
{
"cell_type": "code",
"execution_count": 85,
"id": "a8c35267",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"array([b'\\xf8\\x8b\\xb8\\xa8rL\\x81\\xec\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x02',\n",
" b'\\x1b9\\x89jQ\\xa8t\\x9b\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x03',\n",
" b'\\xc5\\x84\\x13:\\xc9\\x16\\xab<\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00',\n",
" b'S\\xcb\\x9f\\x0ct~\\xa2\\xea\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x04',\n",
" b'\\xe2 \\xa89{\\x1d\\xcd\\xaf\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00',\n",
" b'\\x06\\xc4]\\x18\\x80\\tEO\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x01',\n",
" b',\\x82\\x9a\\xbe\\x1fE2\\xe1\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x05',\n",
" b'>\\xe5x\\x90A\\xc9\\x8a\\xc3\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x01',\n",
" b'nx\\x9ej\\xa1\\xb9e\\xf4\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00'],\n",
" dtype=object)"
]
},
"execution_count": 85,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"df_host_multi.host_id.unique()"
]
},
{
"cell_type": "code",
"execution_count": 86,
"id": "68546b09",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"1 704599\n",
"4 590754\n",
"8 388935\n",
"2 312937\n",
"32 43215\n",
"Name: cpu_count, dtype: int64"
]
},
"execution_count": 86,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"df_server_single.cpu_count.value_counts()"
]
},
{
"cell_type": "code",
"execution_count": 87,
"id": "326abd0c",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"43209\n",
"43215\n"
]
}
],
"source": [
"print(len(df_service_multi))\n",
"print(len(df_service_single))"
]
},
{
"cell_type": "code",
"execution_count": 88,
"id": "29ca8e9d",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"<matplotlib.legend.Legend at 0x7fc9612a4640>"
]
},
"execution_count": 88,
"metadata": {},
"output_type": "execute_result"
},
{
"data": {
"image/png": "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pP79+yslJUXDhg1TeXn5BUdCYmJiNH/+fPXq1UspKSl6/fXX9dZbb+naa68978+Eh4fr2Wef1UMPPaQePXooMjJS8+bNs7ZnZmZq4cKFWrp0qW666SZ1795dkydPtibgXoykpCS9++67eu+999SpUye9/vrr+u1vf3vRP38+kyZNUnp6uu655x5lZGSoR48e1mXP9cn17SU+fqOkpETR0dEqLi6u9VDZhRw8dlI3v7RcwYEB+nx83zrrFwDsUl5err179yo5ObnevxxwcXJycjRixAhrifOGrqysTFdeeaUmTpyoYcOGnbX9Qn8Ha/P97ZjTLha/iloAAPjOpk2b9Nlnn6lr164qLi7WuHHjJEn9+vWr1/06JnxwB2oAAM72u9/9TgUFBQoODlZaWppWr16t5s2b1+s+HRM+AACoaw8//LAefvhhX5dxyTp37qz8/Hzb98uEUwAAYCvHhQ/DpA8AAHzKMeHDxUofAAD4BceEDwAA4B8IHwAAwFaOCx/+taQaAADO45jwwTofAICG4uGHH9Z9993n6zLqDet8AADgI/v27VNycrI2bdqkG264wXp9ypQp8rO7n9QpwgcAoEGpqqpSUFBQnfdbWVmp4ODgOu/3UkRHR/u6hHrlmNMuNRpvjgQA//TOO+8oNTVVYWFhatasmTIyMlRWVmZtnzVrlnUn1Y4dO2r69OnWtn379snlcmnevHm69dZbFRoaqhkzZigsLEwffPCB134WLFigqKgonThxQpJ04MABPfDAA4qJiVFsbKz69eunffv2We1rTm28+OKLSkhIUIcOHSRJ06dPV/v27RUaGqq4uDgNHDjwvO/t66+/1uDBg3XllVcqPDxcqampeuutt7zaeDwevfzyy2rXrp1CQkKUlJSkF198UZKsu/d27txZLpdLt912m1dtkvQ///M/SkhIkMfj8eq3X79++slPfmI9f//999WlSxeFhoaqbdu2Gjt2rE6dOnXe2n3JMSMfTPkA0OgYI1Wd8M2+g8IvajLdoUOHNHjwYL388su6//77VVpaqtWrV1unFObMmaPRo0fr97//vTp37qxNmzbpscceU0REhIYOHWr189xzz2nixInq3LmzQkNDtXr1auXm5qpv3/+7S/mcOXN03333KTw8XFVVVcrMzFR6erpWr16twMBAjR8/Xnfeeae2bt1qjXDk5eXJ7XZr2bJlkqQNGzboqaee0p/+9CfdfPPN+uabb7R69erzvr/y8nKlpaXp2Wefldvt1qJFizRkyBBdddVV6tq1qyRp1KhRmjlzpiZPnqxbbrlFhw4d0meffSZJ+vTTT9W1a1f9/e9/17XXXnvOkZcf/vCHevLJJ/XRRx+pd+/ekqRvvvlGS5Ys0eLFiyVJq1ev1o9//GNNnTpVP/jBD7R79249/vjjkqQxY8Z873Gym2PCBwA0OlUnpN8m+GbfvzwoBUd8b7NDhw7p1KlT6t+/v1q3bi1JSk1NtbaPGTNGEydOVP/+/SWdHgnYuXOn3njjDa/wMWLECKuNJGVlZWnIkCE6ceKEwsPDVVJSokWLFmnBggWSpHnz5snj8WjWrFlyfRuSZs+erZiYGK1YsUJ9+vSRJEVERGjWrFnWl/78+fMVERGhe+65R1FRUWrdurU6d+583vd35ZVX6r/+67+s508++aQ+/PBD/eUvf1HXrl1VWlqqKVOm6Pe//731fq666irdcsstkqQWLVpIkpo1a6b4+Phz7qNp06bq27evcnNzrfDxzjvvqHnz5rr99tslSWPHjtVzzz1n7aNt27b6zW9+o5EjR/pl+HDeaZdGPIEHAPxNp06d1Lt3b6WmpuqHP/yhZs6cqaNHj0qSysrKtHv3bg0bNkyRkZHWY/z48dq9e7dXPzfeeKPX87vuuktBQUH661//Kkl699135Xa7lZGRIUnasmWLvvjiC0VFRVn9xsbGqry83Kvv1NRUr9GGO+64Q61bt1bbtm01ZMgQzZkzxzqNcy7V1dX6zW9+o9TUVMXGxioyMlIffvih9u/fL0natWuXKioqrNBwqbKysvTuu++qoqJC0ulRngcffFABAQHW+x03bpzX5/jYY4/p0KFDF6zfVxj5AICGKij89AiEr/Z9EZo0aaJly5bpk08+0dKlS/Xaa6/pV7/6ldatW6fw8NN9zJw5U926dTvr584UEeE9yhIcHKyBAwcqNzdXDz74oHJzczVo0CAFBp7+Wjt+/LjS0tI0Z86cs2qqGW04V79RUVHauHGjVqxYoaVLl2r06NF64YUXtH79esXExJzV1yuvvKIpU6bo1VdfVWpqqiIiIjRixAhVVlZKksLCwi7qc/o+9957r4wxWrRokW666SatXr1akydPtrYfP35cY8eO9RodqhEaGlonNdQl54QPJn0AaGxcros69eFrLpdLPXr0UI8ePTR69Gi1bt1aCxYsUHZ2thISErRnzx5lZWXVut+srCzdcccd2rFjh5YvX67x48db27p06aJ58+apZcuWcrvdteo3MDBQGRkZysjI0JgxYxQTE6Ply5ef84v9448/Vr9+/fSjH/1I0unJpZ9//rmuueYaSVL79u0VFhamvLw8Pfroo2f9fM2oS3V19QVrCg0NVf/+/TVnzhx98cUX6tChg7p06eL1fgsKCtSuXbtavVdfcU74AADYbt26dcrLy1OfPn3UsmVLrVu3TkeOHFFKSoqk03MVnnrqKUVHR+vOO+9URUWFNmzYoKNHjyo7O/uCfffs2VPx8fHKyspScnKy1+hJVlaWXnnlFfXr10/jxo1TYmKivvzyS82fP18jR45UYmLiOftcuHCh9uzZo549e6pp06ZavHixPB6PdSXMd7Vv317vvPOOPvnkEzVt2lSTJk1SUVGRFT5CQ0P17LPPauTIkQoODlaPHj105MgR7dixQ8OGDVPLli0VFhamJUuWKDExUaGhoee9zDYrK0v33HOPduzYYYWdGqNHj9Y999yjpKQkDRw4UAEBAdqyZYu2b9/uFcr8xWXN+XjppZfkcrk0YsQI67Xy8nINHz5czZo1U2RkpAYMGKCioqLLrbPOMOMDAOzjdru1atUq3XXXXbr66qv1/PPPa+LEidZVKo8++qhmzZql2bNnKzU1VbfeeqtycnKsS1AvxOVyafDgwdqyZctZIyfh4eFatWqVkpKS1L9/f6WkpGjYsGEqLy+/4EhITEyM5s+fr169eiklJUWvv/663nrrLV177bXnbP/888+rS5cuyszM1G233ab4+PizVib99a9/rV/84hcaPXq0UlJSNGjQIB0+fFjS6VGWqVOn6o033lBCQoL69et33tp69eql2NhYFRQU6KGHHvLalpmZqYULF2rp0qW66aab1L17d02ePNma5OtvXOYSZ2CuX79eDzzwgNxut26//Xa9+uqrkqSf/exnWrRokXJychQdHa0nnnhCAQEB+vjjjy+q35KSEkVHR6u4uLjWQ2UXcri0XF1fzJPLJe2dcHed9QsAdikvL9fevXuVnJzsl+fx0fhd6O9gbb6/L2nk4/jx48rKytLMmTPVtGlT6/Xi4mK9+eabmjRpknr16qW0tDTNnj1bn3zyidauXXspu6oz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QMuXLz/r9FVaWpqCgoK8PruCggLt37/f6xht27bNKyQuW7ZMbrdb11xzjdXmQp8/v4cXz+PxqKKigmPjB3r37q1t27Zp8+bN1uPGG29UVlaW9WeO0SXy9YxXO8ydO9eEhISYnJwcs3PnTvP444+bmJgYr9nHuDSlpaVm06ZNZtOmTUaSmTRpktm0aZP58ssvjTGnL7WNiYkx77//vtm6davp16/fOS+17dy5s1m3bp35xz/+Ydq3b+91qe2xY8dMXFycGTJkiNm+fbuZO3euCQ8PP+tS28DAQPO73/3O7Nq1y4wZM4ZLbY0xP/vZz0x0dLRZsWKFOXTokPU4ceKE1eanP/2pSUpKMsuXLzcbNmww6enpJj093dpec6lgnz59zObNm82SJUtMixYtznmp4DPPPGN27dplpk2bds5LBfk99Pbcc8+ZlStXmr1795qtW7ea5557zrhcLrN06VJjDMfGH515tYsxHKNL5YjwYYwxr732mklKSjLBwcGma9euZu3atb4uqVH46KOPjKSzHkOHDjXGnL7c9te//rWJi4szISEhpnfv3qagoMCrj6+//toMHjzYREZGGrfbbR555BFTWlrq1WbLli3mlltuMSEhIebKK680L7300lm1/OUvfzFXX321CQ4ONtdee61ZtGhRvb3vhuJcx0aSmT17ttXm5MmT5j//8z9N06ZNTXh4uLn//vvNoUOHvPrZt2+f6du3rwkLCzPNmzc3v/jFL0xVVZVXm48++sjccMMNJjg42LRt29ZrHzX4PfT2k5/8xLRu3doEBwebFi1amN69e1vBwxiOjT/6bvjgGF0alzHG+GbMBQAAOFGjn/MBAAD8C+EDAADYivABAABsRfgAAAC2InwAAABbET4AAICtCB8AAMBWhA8AAGArwgcAALAV4QMAANiK8AEAAGxF+AAAALb6/2YKIpyVbwgKAAAAAElFTkSuQmCC",
"text/plain": [
"<Figure size 640x480 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"import matplotlib.pyplot as plt\n",
"\n",
"plt.plot(df_service_single.servers_pending, label=\"servers pending\")\n",
"plt.plot(df_service_single.servers_active, label=\"servers active\")\n",
"\n",
"plt.legend()"
]
},
{
"cell_type": "code",
"execution_count": 89,
"id": "529a5d02",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"<matplotlib.legend.Legend at 0x7fc93c437f40>"
]
},
"execution_count": 89,
"metadata": {},
"output_type": "execute_result"
},
{
"data": {
"image/png": "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orfeesujjdvt1gsvvKAOHTooJCREiYmJeu655yTJ+vbe66+/Xg6HQzfffLNHbZL0P//zP4qPj5fb7fbod+DAgbr//vut5++++666deum0NBQtW/fXhMmTNDp06cvWrsvMfIBAP7KGKnqpG/WHRwuORzf26ywsFDDhw/XCy+8oLvuuktlZWVas2aNdUhh7ty5GjdunP74xz/q+uuv15YtW/Tggw+qWbNmGjlypNXPU089pcmTJ+v6669XaGio1qxZo5ycHA0YMMBqM3fuXA0aNEjh4eGqqqpSRkaG0tLStGbNGgUFBWnixInq37+/tm/fbo1w5ObmyuVyafny5ZKkjRs36tFHH9Vf/vIX/fCHP9S3336rNWvWXPT1lZeXKzU1VU8++aRcLpc+/PBDjRgxQj/4wQ/Uo0cPSdLYsWM1c+ZMTZ06VTfeeKMKCwu1d+9eSdJnn32mHj166G9/+5uuueaaC468/OQnP9EjjzyiTz75RH379pUkffvtt1q6dKmWLFkiSVqzZo1+/vOfa9q0afrRj36kffv26Re/+IUkafz48d+7nezGd7sAgJ8473s1Kk9Iv4/3TTG/LpCczb632ebNm5WamqqDBw+qbdu2583v0KGDfve732n48OHWtIkTJ2rJkiX69NNPrXMiXnrpJT322GNWm8WLF2vEiBEqLi5WeHi4SktLFRsbq0WLFql///568803NXHiRO3Zs0eOf4ekyspKRUdHa/HixerXr5/uvfdeLV26VIcOHbJ2+gsXLtR9992nf/7zn4qMjKzRW3PHHXeoc+fO+sMf/qCysjK1bNlSf/zjH/XAAw+c1/Zi53zce++9OnbsmBYvXixJGjRokFq0aKE33nhD0tnRkAkTJig/P18BAQFKT09X3759NXbsWKuPN998U2PGjFFBQUGNXseF8N0uAIAGr2vXrurbt69SUlL0k5/8RDNnztTRo0clSSdOnNC+ffs0atQoRUREWI+JEydq3759Hv10797d4/ltt92m4OBgvffee5KkBQsWyOVyKT09XZK0bds2ffnll4qMjLT6jYmJUXl5uUffKSkpHqMNt956q9q2bav27dtrxIgRmjt3rnUY50LOnDmj3/3ud0pJSVFMTIwiIiL08ccf69ChQ5KkPXv2qKKiwhqxqKnMzEwtWLBAFRUVks6O8tx9990KCAiwXu+zzz7r8T4+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",
"text/plain": [
"<Figure size 640x480 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"import matplotlib.pyplot as plt\n",
"\n",
"plt.plot(df_service_multi.servers_pending, label=\"servers pending\")\n",
"plt.plot(df_service_multi.servers_active, label=\"servers active\")\n",
"\n",
"plt.legend()"
]
},
{
"cell_type": "code",
"execution_count": 90,
"id": "d3e57f13",
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>timestamp</th>\n",
" <th>hosts_up</th>\n",
" <th>hosts_down</th>\n",
" <th>servers_pending</th>\n",
" <th>servers_active</th>\n",
" <th>attempts_success</th>\n",
" <th>attempts_failure</th>\n",
" <th>attempts_error</th>\n",
" <th>absolute_timestamp</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>43210</th>\n",
" <td>1970-01-31 00:11:00+00:00</td>\n",
" <td>1</td>\n",
" <td>0</td>\n",
" <td>16</td>\n",
" <td>0</td>\n",
" <td>33</td>\n",
" <td>1</td>\n",
" <td>0</td>\n",
" <td>2013-09-11 13:45:46+00:00</td>\n",
" </tr>\n",
" <tr>\n",
" <th>43211</th>\n",
" <td>1970-01-31 00:12:00+00:00</td>\n",
" <td>1</td>\n",
" <td>0</td>\n",
" <td>16</td>\n",
" <td>0</td>\n",
" <td>33</td>\n",
" <td>1</td>\n",
" <td>0</td>\n",
" <td>2013-09-11 13:46:46+00:00</td>\n",
" </tr>\n",
" <tr>\n",
" <th>43212</th>\n",
" <td>1970-01-31 00:13:00+00:00</td>\n",
" <td>1</td>\n",
" <td>0</td>\n",
" <td>16</td>\n",
" <td>0</td>\n",
" <td>33</td>\n",
" <td>1</td>\n",
" <td>0</td>\n",
" <td>2013-09-11 13:47:46+00:00</td>\n",
" </tr>\n",
" <tr>\n",
" <th>43213</th>\n",
" <td>1970-01-31 00:14:00+00:00</td>\n",
" <td>1</td>\n",
" <td>0</td>\n",
" <td>16</td>\n",
" <td>0</td>\n",
" <td>33</td>\n",
" <td>1</td>\n",
" <td>0</td>\n",
" <td>2013-09-11 13:48:46+00:00</td>\n",
" </tr>\n",
" <tr>\n",
" <th>43214</th>\n",
" <td>1970-01-31 00:15:00+00:00</td>\n",
" <td>1</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>16</td>\n",
" <td>49</td>\n",
" <td>1</td>\n",
" <td>0</td>\n",
" <td>2013-09-11 13:49:46+00:00</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" timestamp hosts_up hosts_down servers_pending \\\n",
"43210 1970-01-31 00:11:00+00:00 1 0 16 \n",
"43211 1970-01-31 00:12:00+00:00 1 0 16 \n",
"43212 1970-01-31 00:13:00+00:00 1 0 16 \n",
"43213 1970-01-31 00:14:00+00:00 1 0 16 \n",
"43214 1970-01-31 00:15:00+00:00 1 0 0 \n",
"\n",
" servers_active attempts_success attempts_failure attempts_error \\\n",
"43210 0 33 1 0 \n",
"43211 0 33 1 0 \n",
"43212 0 33 1 0 \n",
"43213 0 33 1 0 \n",
"43214 16 49 1 0 \n",
"\n",
" absolute_timestamp \n",
"43210 2013-09-11 13:45:46+00:00 \n",
"43211 2013-09-11 13:46:46+00:00 \n",
"43212 2013-09-11 13:47:46+00:00 \n",
"43213 2013-09-11 13:48:46+00:00 \n",
"43214 2013-09-11 13:49:46+00:00 "
]
},
"execution_count": 90,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"df_service_single.tail()"
]
},
{
"cell_type": "code",
"execution_count": 91,
"id": "6e94fba4",
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>timestamp</th>\n",
" <th>hosts_up</th>\n",
" <th>hosts_down</th>\n",
" <th>servers_pending</th>\n",
" <th>servers_active</th>\n",
" <th>attempts_success</th>\n",
" <th>attempts_failure</th>\n",
" <th>attempts_error</th>\n",
" <th>absolute_timestamp</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>43204</th>\n",
" <td>1970-01-31 00:05:00+00:00</td>\n",
" <td>9</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>48</td>\n",
" <td>50</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>2013-09-11 12:07:46+00:00</td>\n",
" </tr>\n",
" <tr>\n",
" <th>43205</th>\n",
" <td>1970-01-31 00:06:00+00:00</td>\n",
" <td>9</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>48</td>\n",
" <td>50</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>2013-09-11 12:08:46+00:00</td>\n",
" </tr>\n",
" <tr>\n",
" <th>43206</th>\n",
" <td>1970-01-31 00:07:00+00:00</td>\n",
" <td>9</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>48</td>\n",
" <td>50</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>2013-09-11 12:09:46+00:00</td>\n",
" </tr>\n",
" <tr>\n",
" <th>43207</th>\n",
" <td>1970-01-31 00:08:00+00:00</td>\n",
" <td>9</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>48</td>\n",
" <td>50</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>2013-09-11 12:10:46+00:00</td>\n",
" </tr>\n",
" <tr>\n",
" <th>43208</th>\n",
" <td>1970-01-31 00:09:00+00:00</td>\n",
" <td>9</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>48</td>\n",
" <td>50</td>\n",
" <td>0</td>\n",
" <td>0</td>\n",
" <td>2013-09-11 12:11:46+00:00</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" timestamp hosts_up hosts_down servers_pending \\\n",
"43204 1970-01-31 00:05:00+00:00 9 0 0 \n",
"43205 1970-01-31 00:06:00+00:00 9 0 0 \n",
"43206 1970-01-31 00:07:00+00:00 9 0 0 \n",
"43207 1970-01-31 00:08:00+00:00 9 0 0 \n",
"43208 1970-01-31 00:09:00+00:00 9 0 0 \n",
"\n",
" servers_active attempts_success attempts_failure attempts_error \\\n",
"43204 48 50 0 0 \n",
"43205 48 50 0 0 \n",
"43206 48 50 0 0 \n",
"43207 48 50 0 0 \n",
"43208 48 50 0 0 \n",
"\n",
" absolute_timestamp \n",
"43204 2013-09-11 12:07:46+00:00 \n",
"43205 2013-09-11 12:08:46+00:00 \n",
"43206 2013-09-11 12:09:46+00:00 \n",
"43207 2013-09-11 12:10:46+00:00 \n",
"43208 2013-09-11 12:11:46+00:00 "
]
},
"execution_count": 91,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"df_service_multi.tail()"
]
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 3 (ipykernel)",
"language": "python",
"name": "python3"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.10.12"
}
},
"nbformat": 4,
"nbformat_minor": 5
}
|