summaryrefslogtreecommitdiff
path: root/opendc-experiments/opendc-experiments-greenifier/src/main/Python_scripts/OpenDCdemo.ipynb
blob: 3a88aca7225aca57e044c8bfbf610b0cbaa92fe6 (plain)
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
{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 1,
   "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": 2,
   "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": 3,
   "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>0</th>\n",
       "      <td>1019</td>\n",
       "      <td>2013-08-12 13:40:46+00:00</td>\n",
       "      <td>300000</td>\n",
       "      <td>1</td>\n",
       "      <td>0.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>1019</td>\n",
       "      <td>2013-08-12 13:45:46+00:00</td>\n",
       "      <td>300000</td>\n",
       "      <td>1</td>\n",
       "      <td>11.703998</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>1019</td>\n",
       "      <td>2013-08-12 13:55:46+00:00</td>\n",
       "      <td>600000</td>\n",
       "      <td>1</td>\n",
       "      <td>0.000000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>1019</td>\n",
       "      <td>2013-08-12 14:00:46+00:00</td>\n",
       "      <td>300000</td>\n",
       "      <td>1</td>\n",
       "      <td>11.703998</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>1019</td>\n",
       "      <td>2013-08-12 14:15:46+00:00</td>\n",
       "      <td>900000</td>\n",
       "      <td>1</td>\n",
       "      <td>0.000000</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "     id                 timestamp  duration  cpu_count  cpu_usage\n",
       "0  1019 2013-08-12 13:40:46+00:00    300000          1   0.000000\n",
       "1  1019 2013-08-12 13:45:46+00:00    300000          1  11.703998\n",
       "2  1019 2013-08-12 13:55:46+00:00    600000          1   0.000000\n",
       "3  1019 2013-08-12 14:00:46+00:00    300000          1  11.703998\n",
       "4  1019 2013-08-12 14:15:46+00:00    900000          1   0.000000"
      ]
     },
     "execution_count": 3,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df_trace = pd.read_parquet(f\"{base_folder}/resources/bitbrains-small/trace/trace.parquet\")\n",
    "df_trace.head()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "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": 4,
     "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": 43,
   "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": 44,
   "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: 77859\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": 45,
   "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: 408490\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": 46,
   "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: 8651\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": 47,
   "id": "82f0a24a",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "single topology: 822692246.2425151\n",
      "multi topology:   5870271518.168591\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": 48,
   "id": "e94db3a6",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "single topology: 0.7799672554077309\n",
      "multi topology:   0.3421434368579651\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": 49,
   "id": "8d7daa45",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "multi topology:   0.3421434368579651\n",
      "single topology: 0.7799672554077309\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": 33,
   "id": "5df8f9aa",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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CuEGAACYCuEGAACYCuEGAACYCuEGAACYCuEGAACYSpcIN/n5+YqJiZG/v78SExO1bdu2c/ZdtWqVLBZLs83f39+D1QIAgK7M6+FmzZo1stvtys7O1o4dOzRq1CilpKTo2LFj59wnKChIFRUVzu3w4cMerBgAAHRlXg83ubm5yszMVEZGhkaMGKGCggIFBASosLDwnPtYLBZFREQ4t/DwcA9WDAAAujKvhpv6+npt375dycnJzjYfHx8lJyertLT0nPudOnVKl1xyiaKjozVp0iR98MEH5+xbV1enmpqaZhsAADAvr4ab48ePq7GxscXMS3h4uBwOR6v7DBs2TIWFhfrLX/6iP/7xj2pqatKYMWP0ySeftNo/JydHwcHBzi06Otrt1wEAALoOr9+Waq+kpCSlpaUpNjZW11xzjdatW6d+/frpt7/9bav9Z82aperqaud25MgRD1cMAAA8qYc3Tx4aGiqr1arKyspm7ZWVlYqIiGjTMXx9ffWtb31L+/fvb/V9Pz8/+fn5dbhWAADQPXh15sZmsykuLk7FxcXOtqamJhUXFyspKalNx2hsbNTu3bsVGRnZWWUCAIBuxKszN5Jkt9uVnp6u+Ph4JSQkKC8vT7W1tcrIyJAkpaWlKSoqSjk5OZKkefPm6dvf/rYGDx6sEydOaPHixTp8+LDuuusub14GAADoIrweblJTU1VVVaW5c+fK4XAoNjZWRUVFzkXG5eXl8vH5coLps88+U2ZmphwOh3r37q24uDht3bpVI0aM8NYlAACALsRiGIbh7SI8qaamRsHBwaqurlZQUJC3ywEAoGt6IdX1faescV8d/689n9/d7ttSAAAA50O4AQAApkK4AQAApkK4AQAApkK4AQAApkK4AQAApkK4AQAApkK4AQAApkK4AQAApkK4AQAApkK4AQAApkK4AQAApkK4AQAApkK4AQAApkK4AQAApkK4AQAApkK4AQAApkK4AQAAptLD2wWYzbRV77i874qpo91YCQAAFyZmbgAAgKkQbgAAgKkQbgAAgKkQbgAAgKm4FG4OHjzo7joAAADcwqVwM3jwYF133XX64x//qM8//9zdNQEAALjMpXCzY8cOXXnllbLb7YqIiNA999yjbdu2ubs2AACAdnMp3MTGxurJJ5/U0aNHVVhYqIqKCl199dUaOXKkcnNzVVVV5e46AQAA2qRD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",
      "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": 34,
   "id": "520e42a4",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "1.000000    6146\n",
       "0.000009       9\n",
       "0.002294       2\n",
       "0.027410       2\n",
       "0.021973       2\n",
       "            ... \n",
       "0.028164       1\n",
       "0.029120       1\n",
       "0.028367       1\n",
       "0.030243       1\n",
       "0.030289       1\n",
       "Name: cpu_utilization, Length: 2488, dtype: int64"
      ]
     },
     "execution_count": 34,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df_host_single.cpu_utilization.value_counts()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 35,
   "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": 35,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df_host_multi.host_id.unique()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 54,
   "id": "68546b09",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "1     141065\n",
       "4     118263\n",
       "8      77859\n",
       "2      62652\n",
       "32      8651\n",
       "Name: cpu_count, dtype: int64"
      ]
     },
     "execution_count": 54,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df_server_single.cpu_count.value_counts()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 56,
   "id": "326abd0c",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "8    8651\n",
       "Name: cpu_count, dtype: int64"
      ]
     },
     "execution_count": 56,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "df_host_single.cpu_count.value_counts()"
   ]
  }
 ],
 "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
}