summaryrefslogtreecommitdiff
path: root/opendc-experiments/opendc-experiments-greenifier/src
diff options
context:
space:
mode:
Diffstat (limited to 'opendc-experiments/opendc-experiments-greenifier/src')
-rw-r--r--opendc-experiments/opendc-experiments-greenifier/src/main/Python_scripts/.ipynb_checkpoints/OpenDCdemo-checkpoint.ipynb516
-rw-r--r--opendc-experiments/opendc-experiments-greenifier/src/main/Python_scripts/OpenDCdemo.ipynb535
2 files changed, 645 insertions, 406 deletions
diff --git a/opendc-experiments/opendc-experiments-greenifier/src/main/Python_scripts/.ipynb_checkpoints/OpenDCdemo-checkpoint.ipynb b/opendc-experiments/opendc-experiments-greenifier/src/main/Python_scripts/.ipynb_checkpoints/OpenDCdemo-checkpoint.ipynb
index 15fc32f6..96a09cd5 100644
--- a/opendc-experiments/opendc-experiments-greenifier/src/main/Python_scripts/.ipynb_checkpoints/OpenDCdemo-checkpoint.ipynb
+++ b/opendc-experiments/opendc-experiments-greenifier/src/main/Python_scripts/.ipynb_checkpoints/OpenDCdemo-checkpoint.ipynb
@@ -2,56 +2,10 @@
"cells": [
{
"cell_type": "code",
- "execution_count": 5,
+ "execution_count": 12,
"id": "18170001",
"metadata": {},
- "outputs": [
- {
- "data": {
- "text/plain": [
- "['build.gradle.kts',\n",
- " '.github',\n",
- " 'opendc-web',\n",
- " 'gradle.properties',\n",
- " 'gradlew.bat',\n",
- " 'docker-compose.yml',\n",
- " '.gitignore',\n",
- " 'resources',\n",
- " '.dockerignore',\n",
- " 'opendc-simulator',\n",
- " '.gitattributes',\n",
- " 'traces',\n",
- " 'codecov.yml',\n",
- " 'opendc-experiments',\n",
- " '.editorconfig',\n",
- " 'gradlew',\n",
- " '.gradle',\n",
- " 'site',\n",
- " 'opendc-compute',\n",
- " 'opendc-workflow',\n",
- " 'output',\n",
- " 'CONTRIBUTING.md',\n",
- " 'opendc-trace',\n",
- " 'LICENSE.txt',\n",
- " 'docker-compose.prod.yml',\n",
- " 'CITATION.cff',\n",
- " '.git',\n",
- " 'buildSrc',\n",
- " 'build',\n",
- " 'README.md',\n",
- " 'opendc-common',\n",
- " 'opendc-faas',\n",
- " 'docker-compose.override.yml',\n",
- " '.idea',\n",
- " 'gradle',\n",
- " 'settings.gradle.kts']"
- ]
- },
- "execution_count": 5,
- "metadata": {},
- "output_type": "execute_result"
- }
- ],
+ "outputs": [],
"source": [
"import numpy as np\n",
"import pandas as pd\n",
@@ -59,7 +13,7 @@
"\n",
"from IPython.display import display, HTML\n",
"\n",
- "base_folder = \"../../../..\""
+ "base_folder = \"../../../../..\""
]
},
{
@@ -72,7 +26,7 @@
},
{
"cell_type": "code",
- "execution_count": 2,
+ "execution_count": 13,
"id": "a2d05361",
"metadata": {},
"outputs": [
@@ -84,29 +38,117 @@
]
},
{
- "ename": "FileNotFoundError",
- "evalue": "[Errno 2] No such file or directory: '../resources/env/multi.txt'",
- "output_type": "error",
- "traceback": [
- "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m",
- "\u001b[0;31mFileNotFoundError\u001b[0m Traceback (most recent call last)",
- "Cell \u001b[0;32mIn[2], line 6\u001b[0m\n\u001b[1;32m 3\u001b[0m df \u001b[38;5;241m=\u001b[39m pd\u001b[38;5;241m.\u001b[39mread_csv(\u001b[38;5;124mf\u001b[39m\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124m../resources/env/\u001b[39m\u001b[38;5;132;01m{\u001b[39;00mtopology_name\u001b[38;5;132;01m}\u001b[39;00m\u001b[38;5;124m.txt\u001b[39m\u001b[38;5;124m\"\u001b[39m, delimiter\u001b[38;5;241m=\u001b[39m\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124m;\u001b[39m\u001b[38;5;124m\"\u001b[39m)\n\u001b[1;32m 4\u001b[0m display(HTML(df\u001b[38;5;241m.\u001b[39mto_html()))\n\u001b[0;32m----> 6\u001b[0m \u001b[43mread_topology\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[38;5;124;43mmulti\u001b[39;49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[43m)\u001b[49m\n\u001b[1;32m 7\u001b[0m read_topology(\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124msingle\u001b[39m\u001b[38;5;124m\"\u001b[39m)\n",
- "Cell \u001b[0;32mIn[2], line 3\u001b[0m, in \u001b[0;36mread_topology\u001b[0;34m(topology_name)\u001b[0m\n\u001b[1;32m 1\u001b[0m \u001b[38;5;28;01mdef\u001b[39;00m \u001b[38;5;21mread_topology\u001b[39m(topology_name):\n\u001b[1;32m 2\u001b[0m \u001b[38;5;28mprint\u001b[39m(\u001b[38;5;124mf\u001b[39m\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mTopology name: \u001b[39m\u001b[38;5;132;01m{\u001b[39;00mtopology_name\u001b[38;5;132;01m}\u001b[39;00m\u001b[38;5;124m\"\u001b[39m)\n\u001b[0;32m----> 3\u001b[0m df \u001b[38;5;241m=\u001b[39m \u001b[43mpd\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mread_csv\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;124;43mf\u001b[39;49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[38;5;124;43m../resources/env/\u001b[39;49m\u001b[38;5;132;43;01m{\u001b[39;49;00m\u001b[43mtopology_name\u001b[49m\u001b[38;5;132;43;01m}\u001b[39;49;00m\u001b[38;5;124;43m.txt\u001b[39;49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mdelimiter\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[38;5;124;43m;\u001b[39;49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[43m)\u001b[49m\n\u001b[1;32m 4\u001b[0m display(HTML(df\u001b[38;5;241m.\u001b[39mto_html()))\n",
- "File \u001b[0;32m~/.local/lib/python3.10/site-packages/pandas/util/_decorators.py:211\u001b[0m, in \u001b[0;36mdeprecate_kwarg.<locals>._deprecate_kwarg.<locals>.wrapper\u001b[0;34m(*args, **kwargs)\u001b[0m\n\u001b[1;32m 209\u001b[0m \u001b[38;5;28;01melse\u001b[39;00m:\n\u001b[1;32m 210\u001b[0m kwargs[new_arg_name] \u001b[38;5;241m=\u001b[39m new_arg_value\n\u001b[0;32m--> 211\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[43mfunc\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43margs\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43mkwargs\u001b[49m\u001b[43m)\u001b[49m\n",
- "File \u001b[0;32m~/.local/lib/python3.10/site-packages/pandas/util/_decorators.py:317\u001b[0m, in \u001b[0;36mdeprecate_nonkeyword_arguments.<locals>.decorate.<locals>.wrapper\u001b[0;34m(*args, **kwargs)\u001b[0m\n\u001b[1;32m 311\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;28mlen\u001b[39m(args) \u001b[38;5;241m>\u001b[39m num_allow_args:\n\u001b[1;32m 312\u001b[0m warnings\u001b[38;5;241m.\u001b[39mwarn(\n\u001b[1;32m 313\u001b[0m msg\u001b[38;5;241m.\u001b[39mformat(arguments\u001b[38;5;241m=\u001b[39marguments),\n\u001b[1;32m 314\u001b[0m \u001b[38;5;167;01mFutureWarning\u001b[39;00m,\n\u001b[1;32m 315\u001b[0m stacklevel\u001b[38;5;241m=\u001b[39mfind_stack_level(inspect\u001b[38;5;241m.\u001b[39mcurrentframe()),\n\u001b[1;32m 316\u001b[0m )\n\u001b[0;32m--> 317\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[43mfunc\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43margs\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43mkwargs\u001b[49m\u001b[43m)\u001b[49m\n",
- "File \u001b[0;32m~/.local/lib/python3.10/site-packages/pandas/io/parsers/readers.py:950\u001b[0m, in \u001b[0;36mread_csv\u001b[0;34m(filepath_or_buffer, sep, delimiter, header, names, index_col, usecols, squeeze, prefix, mangle_dupe_cols, dtype, engine, converters, true_values, false_values, skipinitialspace, skiprows, skipfooter, nrows, na_values, keep_default_na, na_filter, verbose, skip_blank_lines, parse_dates, infer_datetime_format, keep_date_col, date_parser, dayfirst, cache_dates, iterator, chunksize, compression, thousands, decimal, lineterminator, quotechar, quoting, doublequote, escapechar, comment, encoding, encoding_errors, dialect, error_bad_lines, warn_bad_lines, on_bad_lines, delim_whitespace, low_memory, memory_map, float_precision, storage_options)\u001b[0m\n\u001b[1;32m 935\u001b[0m kwds_defaults \u001b[38;5;241m=\u001b[39m _refine_defaults_read(\n\u001b[1;32m 936\u001b[0m dialect,\n\u001b[1;32m 937\u001b[0m delimiter,\n\u001b[0;32m (...)\u001b[0m\n\u001b[1;32m 946\u001b[0m defaults\u001b[38;5;241m=\u001b[39m{\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mdelimiter\u001b[39m\u001b[38;5;124m\"\u001b[39m: \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124m,\u001b[39m\u001b[38;5;124m\"\u001b[39m},\n\u001b[1;32m 947\u001b[0m )\n\u001b[1;32m 948\u001b[0m kwds\u001b[38;5;241m.\u001b[39mupdate(kwds_defaults)\n\u001b[0;32m--> 950\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m \u001b[43m_read\u001b[49m\u001b[43m(\u001b[49m\u001b[43mfilepath_or_buffer\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mkwds\u001b[49m\u001b[43m)\u001b[49m\n",
- "File \u001b[0;32m~/.local/lib/python3.10/site-packages/pandas/io/parsers/readers.py:605\u001b[0m, in \u001b[0;36m_read\u001b[0;34m(filepath_or_buffer, kwds)\u001b[0m\n\u001b[1;32m 602\u001b[0m _validate_names(kwds\u001b[38;5;241m.\u001b[39mget(\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mnames\u001b[39m\u001b[38;5;124m\"\u001b[39m, \u001b[38;5;28;01mNone\u001b[39;00m))\n\u001b[1;32m 604\u001b[0m \u001b[38;5;66;03m# Create the parser.\u001b[39;00m\n\u001b[0;32m--> 605\u001b[0m parser \u001b[38;5;241m=\u001b[39m \u001b[43mTextFileReader\u001b[49m\u001b[43m(\u001b[49m\u001b[43mfilepath_or_buffer\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[38;5;241;43m*\u001b[39;49m\u001b[43mkwds\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 607\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m chunksize \u001b[38;5;129;01mor\u001b[39;00m iterator:\n\u001b[1;32m 608\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m parser\n",
- "File \u001b[0;32m~/.local/lib/python3.10/site-packages/pandas/io/parsers/readers.py:1442\u001b[0m, in \u001b[0;36mTextFileReader.__init__\u001b[0;34m(self, f, engine, **kwds)\u001b[0m\n\u001b[1;32m 1439\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39moptions[\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mhas_index_names\u001b[39m\u001b[38;5;124m\"\u001b[39m] \u001b[38;5;241m=\u001b[39m kwds[\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mhas_index_names\u001b[39m\u001b[38;5;124m\"\u001b[39m]\n\u001b[1;32m 1441\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mhandles: IOHandles \u001b[38;5;241m|\u001b[39m \u001b[38;5;28;01mNone\u001b[39;00m \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;01mNone\u001b[39;00m\n\u001b[0;32m-> 1442\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_engine \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m_make_engine\u001b[49m\u001b[43m(\u001b[49m\u001b[43mf\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mengine\u001b[49m\u001b[43m)\u001b[49m\n",
- "File \u001b[0;32m~/.local/lib/python3.10/site-packages/pandas/io/parsers/readers.py:1729\u001b[0m, in \u001b[0;36mTextFileReader._make_engine\u001b[0;34m(self, f, engine)\u001b[0m\n\u001b[1;32m 1727\u001b[0m is_text \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;01mFalse\u001b[39;00m\n\u001b[1;32m 1728\u001b[0m mode \u001b[38;5;241m=\u001b[39m \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mrb\u001b[39m\u001b[38;5;124m\"\u001b[39m\n\u001b[0;32m-> 1729\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mhandles \u001b[38;5;241m=\u001b[39m \u001b[43mget_handle\u001b[49m\u001b[43m(\u001b[49m\n\u001b[1;32m 1730\u001b[0m \u001b[43m \u001b[49m\u001b[43mf\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 1731\u001b[0m \u001b[43m \u001b[49m\u001b[43mmode\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 1732\u001b[0m \u001b[43m \u001b[49m\u001b[43mencoding\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43moptions\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mget\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[38;5;124;43mencoding\u001b[39;49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;28;43;01mNone\u001b[39;49;00m\u001b[43m)\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 1733\u001b[0m \u001b[43m \u001b[49m\u001b[43mcompression\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43moptions\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mget\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[38;5;124;43mcompression\u001b[39;49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;28;43;01mNone\u001b[39;49;00m\u001b[43m)\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 1734\u001b[0m \u001b[43m \u001b[49m\u001b[43mmemory_map\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43moptions\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mget\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[38;5;124;43mmemory_map\u001b[39;49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;28;43;01mFalse\u001b[39;49;00m\u001b[43m)\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 1735\u001b[0m \u001b[43m \u001b[49m\u001b[43mis_text\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mis_text\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 1736\u001b[0m \u001b[43m \u001b[49m\u001b[43merrors\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43moptions\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mget\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[38;5;124;43mencoding_errors\u001b[39;49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[38;5;124;43mstrict\u001b[39;49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[43m)\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 1737\u001b[0m \u001b[43m \u001b[49m\u001b[43mstorage_options\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43moptions\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mget\u001b[49m\u001b[43m(\u001b[49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[38;5;124;43mstorage_options\u001b[39;49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[38;5;28;43;01mNone\u001b[39;49;00m\u001b[43m)\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 1738\u001b[0m \u001b[43m\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 1739\u001b[0m \u001b[38;5;28;01massert\u001b[39;00m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mhandles \u001b[38;5;129;01mis\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m\n\u001b[1;32m 1740\u001b[0m f \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mhandles\u001b[38;5;241m.\u001b[39mhandle\n",
- "File \u001b[0;32m~/.local/lib/python3.10/site-packages/pandas/io/common.py:857\u001b[0m, in \u001b[0;36mget_handle\u001b[0;34m(path_or_buf, mode, encoding, compression, memory_map, is_text, errors, storage_options)\u001b[0m\n\u001b[1;32m 852\u001b[0m \u001b[38;5;28;01melif\u001b[39;00m \u001b[38;5;28misinstance\u001b[39m(handle, \u001b[38;5;28mstr\u001b[39m):\n\u001b[1;32m 853\u001b[0m \u001b[38;5;66;03m# Check whether the filename is to be opened in binary mode.\u001b[39;00m\n\u001b[1;32m 854\u001b[0m \u001b[38;5;66;03m# Binary mode does not support 'encoding' and 'newline'.\u001b[39;00m\n\u001b[1;32m 855\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m ioargs\u001b[38;5;241m.\u001b[39mencoding \u001b[38;5;129;01mand\u001b[39;00m \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mb\u001b[39m\u001b[38;5;124m\"\u001b[39m \u001b[38;5;129;01mnot\u001b[39;00m \u001b[38;5;129;01min\u001b[39;00m ioargs\u001b[38;5;241m.\u001b[39mmode:\n\u001b[1;32m 856\u001b[0m \u001b[38;5;66;03m# Encoding\u001b[39;00m\n\u001b[0;32m--> 857\u001b[0m handle \u001b[38;5;241m=\u001b[39m \u001b[38;5;28;43mopen\u001b[39;49m\u001b[43m(\u001b[49m\n\u001b[1;32m 858\u001b[0m \u001b[43m \u001b[49m\u001b[43mhandle\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 859\u001b[0m \u001b[43m \u001b[49m\u001b[43mioargs\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mmode\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 860\u001b[0m \u001b[43m \u001b[49m\u001b[43mencoding\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mioargs\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mencoding\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 861\u001b[0m \u001b[43m \u001b[49m\u001b[43merrors\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43merrors\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 862\u001b[0m \u001b[43m \u001b[49m\u001b[43mnewline\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[43m,\u001b[49m\n\u001b[1;32m 863\u001b[0m \u001b[43m \u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 864\u001b[0m \u001b[38;5;28;01melse\u001b[39;00m:\n\u001b[1;32m 865\u001b[0m \u001b[38;5;66;03m# Binary mode\u001b[39;00m\n\u001b[1;32m 866\u001b[0m handle \u001b[38;5;241m=\u001b[39m \u001b[38;5;28mopen\u001b[39m(handle, ioargs\u001b[38;5;241m.\u001b[39mmode)\n",
- "\u001b[0;31mFileNotFoundError\u001b[0m: [Errno 2] No such file or directory: '../resources/env/multi.txt'"
+ "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\"../resources/env/{topology_name}.txt\", delimiter=\";\")\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",
@@ -123,7 +165,7 @@
},
{
"cell_type": "code",
- "execution_count": 4,
+ "execution_count": 14,
"id": "fd17d88a",
"metadata": {},
"outputs": [
@@ -209,19 +251,19 @@
"4 1019 2013-08-12 14:15:46+00:00 900000 1 0.000000"
]
},
- "execution_count": 4,
+ "execution_count": 14,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
- "trace = pd.read_parquet(f\"resources/bitbrains-small/trace/trace.parquet\")\n",
- "trace.head(5)"
+ "df_trace = pd.read_parquet(f\"{base_folder}/resources/bitbrains-small/trace/trace.parquet\")\n",
+ "df_trace.head()"
]
},
{
"cell_type": "code",
- "execution_count": 5,
+ "execution_count": 15,
"id": "346f097f",
"metadata": {
"scrolled": true
@@ -322,14 +364,14 @@
"4 2599.999649 179306 "
]
},
- "execution_count": 5,
+ "execution_count": 15,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
- "meta = pd.read_parquet(f\"resources/bitbrains-small/trace/meta.parquet\")\n",
- "meta.head(5)"
+ "df_meta = pd.read_parquet(f\"{base_folder}/resources/bitbrains-small/trace/meta.parquet\")\n",
+ "df_meta.head()"
]
},
{
@@ -350,23 +392,35 @@
},
{
"cell_type": "code",
- "execution_count": 23,
+ "execution_count": 16,
"id": "0d400ffd",
"metadata": {},
"outputs": [],
"source": [
- "output_folder = \"output\"\n",
+ "output_folder = f\"{base_folder}/output\"\n",
"workload = \"workload=bitbrains-small\"\n",
"seed = \"seed=0\"\n",
"\n",
- "df_host_multi = pd.read_parquet(f\"{output_folder}/host/topology=multi/{workload}/{seed}/data.parquet\")\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_multi = pd.read_parquet(f\"{output_folder}/server/topology=multi/{workload}/{seed}/data.parquet\")\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",
- "df_service_single = pd.read_parquet(f\"{output_folder}/service/topology=single/{workload}/{seed}/data.parquet\")"
+ "\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())"
]
},
{
@@ -379,7 +433,7 @@
},
{
"cell_type": "code",
- "execution_count": 24,
+ "execution_count": 17,
"id": "48a1e1a6",
"metadata": {},
"outputs": [
@@ -415,7 +469,7 @@
"name": "stdout",
"output_type": "stream",
"text": [
- "number of measurements: 77778\n"
+ "number of measurements: 77769\n"
]
}
],
@@ -434,7 +488,7 @@
},
{
"cell_type": "code",
- "execution_count": 25,
+ "execution_count": 20,
"id": "57a2b148",
"metadata": {},
"outputs": [
@@ -444,17 +498,18 @@
"['timestamp',\n",
" 'server_id',\n",
" 'host_id',\n",
- " 'uptime',\n",
- " 'downtime',\n",
- " 'provision_time',\n",
- " 'boot_time',\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",
- " 'mem_limit']"
+ " 'uptime',\n",
+ " 'downtime',\n",
+ " 'provision_time',\n",
+ " 'boot_time',\n",
+ " 'absolute_timestamp']"
]
},
"metadata": {},
@@ -464,7 +519,8 @@
"name": "stdout",
"output_type": "stream",
"text": [
- "number of measurements: 408040\n"
+ "number of measurements: 407990\n",
+ "number of measurements: 408090\n"
]
}
],
@@ -483,7 +539,7 @@
},
{
"cell_type": "code",
- "execution_count": 26,
+ "execution_count": 19,
"id": "9ef468ed",
"metadata": {
"scrolled": false
@@ -499,7 +555,8 @@
" 'servers_active',\n",
" 'attempts_success',\n",
" 'attempts_failure',\n",
- " 'attempts_error']"
+ " 'attempts_error',\n",
+ " 'absolute_timestamp']"
]
},
"metadata": {},
@@ -509,7 +566,7 @@
"name": "stdout",
"output_type": "stream",
"text": [
- "number of measurements: 8642\n"
+ "number of measurements: 8643\n"
]
}
],
@@ -528,7 +585,7 @@
},
{
"cell_type": "code",
- "execution_count": 27,
+ "execution_count": 47,
"id": "82f0a24a",
"metadata": {},
"outputs": [
@@ -536,14 +593,14 @@
"name": "stdout",
"output_type": "stream",
"text": [
- "big topology: 3400876.9739568997\n",
- "small topology: 60000.000858306885\n"
+ "single topology: 822692246.2425151\n",
+ "multi topology: 5870271518.168591\n"
]
}
],
"source": [
- "print(f\"big topology: {df_host_multi.power_total.sum()}\")\n",
- "print(f\"small topology: {df_host_single.power_total.sum()}\")"
+ "print(f\"single topology: {df_host_single.power_total.sum()}\")\n",
+ "print(f\"multi topology: {df_host_multi.power_total.sum()}\")"
]
},
{
@@ -556,7 +613,7 @@
},
{
"cell_type": "code",
- "execution_count": 32,
+ "execution_count": 48,
"id": "e94db3a6",
"metadata": {},
"outputs": [
@@ -564,14 +621,14 @@
"name": "stdout",
"output_type": "stream",
"text": [
- "big topology: 2.352397194967523e-05\n",
- "small topology: 0.00011571395510298542\n"
+ "single topology: 0.7799672554077309\n",
+ "multi topology: 0.3421434368579651\n"
]
}
],
"source": [
- "print(f\"big topology: {df_host_multi.cpu_utilization.mean()}\")\n",
- "print(f\"small topology: {df_host_single.cpu_utilization.mean()}\")"
+ "print(f\"single topology: {df_host_single.cpu_utilization.mean()}\")\n",
+ "print(f\"multi topology: {df_host_multi.cpu_utilization.mean()}\")"
]
},
{
@@ -584,7 +641,7 @@
},
{
"cell_type": "code",
- "execution_count": 29,
+ "execution_count": 49,
"id": "8d7daa45",
"metadata": {},
"outputs": [
@@ -592,14 +649,14 @@
"name": "stdout",
"output_type": "stream",
"text": [
- "big topology: 2.352397194967523e-05\n",
- "small topology: 0.00011571395510298542\n"
+ "multi topology: 0.3421434368579651\n",
+ "single topology: 0.7799672554077309\n"
]
}
],
"source": [
- "print(f\"big topology: {df_host_multi.cpu_utilization.mean()}\")\n",
- "print(f\"small topology: {df_host_single.cpu_utilization.mean()}\")"
+ "print(f\"multi topology: {df_host_multi.cpu_utilization.mean()}\")\n",
+ "print(f\"single topology: {df_host_single.cpu_utilization.mean()}\")"
]
},
{
@@ -612,13 +669,13 @@
},
{
"cell_type": "code",
- "execution_count": 13,
+ "execution_count": 33,
"id": "5df8f9aa",
"metadata": {},
"outputs": [
{
"data": {
- "image/png": "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OnjwoL3N39/fHmwkKTw83H4KDIBrWLkBIElq27atLBaLDh06VKn+Tz/9tEaOHKl69eopNDRUFovF/llgYKC+++67cmN++eUXeXt7V3jaS5K8vC79/9Zvg9ZvT+G4U1ZWlu6991498sgjGj16tL29oKBAsbGxio2N1TvvvKPGjRsrIyNDsbGx1XLazcfHx+G9xWJxOmgCcMTKDQBJl+70iY2NVVJSkgoKCsp9/vvbnoODg9WmTRuFhYU5BBtJat++vb755hsVFhY6tO/fv18tW7Ys94V+WePGjSXJ4YLa3z+bxmq1qrS0tLKHVaGLFy9q0KBB6tChgxYtWuTw2aFDh/Tjjz9q7ty56tu3rzp06FBuJcVqtUrSVevo2LGjSkpKtHv3bnvbjz/+qMOHD6tTp05Vqh/A1RFuANglJSWptLRUPXv21IcffqijR4/q4MGDWrJkiaKjoyu9nWHDhslisSguLk779u3TsWPHtGLFCi1evFhPPvnkFce1adNGNptNzz33nI4ePaqNGzdq4cKFDn0iIiJ0/vx5JScn69y5c7pw4YLTx/noo4/q9OnTWrJkiXJycpSVlaWsrCwVFRWpefPmslqtevXVV3XixAlt2LCh3LNrWrRoIYvFoo8//lg5OTk6f/58uX20bdtWgwYN0pgxY7Rjxw599dVXeuihh9S0aVMNGjTI6ZoBVB7hBoBdq1attH//fvXr109PPvmkOnfurP79+ys5OVmvv/56pbdTv359ff755youLta9996ryMhILVmyRIsWLdKjjz56xXE+Pj567733dOjQId10002aN2+eXnjhBYc+vXr10mOPPaYhQ4aocePGmj9/vtPH+b//+7/KzMxUp06dFB4ebn/t2rVLjRs31qpVq7R27Vp16tRJc+fO1UsvveQwvmnTppo1a5amTJmi0NBQTZgwocL9rFy5Ut26ddO//du/KTo6WoZhaNOmTVdcuQLgHhaDk7sAAMBEWLkBAACmQrgBAACmQrgBAACmQrgBAACmQrgBAACmQrgBAACmQrgBAACmQrgBAACmQrgBAACmQrgBAACmQrgBAACm8v8BjCGIOvW4gUwAAAAASUVORK5CYII=",
+ "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>"
]
@@ -645,19 +702,28 @@
},
{
"cell_type": "code",
- "execution_count": 14,
+ "execution_count": 34,
"id": "520e42a4",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
- "0.0 8641\n",
- "1.0 1\n",
- "Name: cpu_utilization, dtype: int64"
+ "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": 14,
+ "execution_count": 34,
"metadata": {},
"output_type": "execute_result"
}
@@ -668,7 +734,7 @@
},
{
"cell_type": "code",
- "execution_count": 22,
+ "execution_count": 35,
"id": "a8c35267",
"metadata": {},
"outputs": [
@@ -687,7 +753,7 @@
" dtype=object)"
]
},
- "execution_count": 22,
+ "execution_count": 35,
"metadata": {},
"output_type": "execute_result"
}
@@ -698,239 +764,51 @@
},
{
"cell_type": "code",
- "execution_count": 30,
+ "execution_count": 54,
"id": "68546b09",
"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",
- " </tr>\n",
- " </thead>\n",
- " <tbody>\n",
- " <tr>\n",
- " <th>0</th>\n",
- " <td>1970-01-01 00:05:00+00:00</td>\n",
- " <td>1</td>\n",
- " <td>0</td>\n",
- " <td>44</td>\n",
- " <td>0</td>\n",
- " <td>0</td>\n",
- " <td>0</td>\n",
- " <td>0</td>\n",
- " </tr>\n",
- " <tr>\n",
- " <th>1</th>\n",
- " <td>1970-01-01 00:10:00+00:00</td>\n",
- " <td>1</td>\n",
- " <td>0</td>\n",
- " <td>29</td>\n",
- " <td>15</td>\n",
- " <td>15</td>\n",
- " <td>0</td>\n",
- " <td>0</td>\n",
- " </tr>\n",
- " <tr>\n",
- " <th>2</th>\n",
- " <td>1970-01-01 00:15:00+00:00</td>\n",
- " <td>1</td>\n",
- " <td>0</td>\n",
- " <td>29</td>\n",
- " <td>15</td>\n",
- " <td>15</td>\n",
- " <td>0</td>\n",
- " <td>0</td>\n",
- " </tr>\n",
- " <tr>\n",
- " <th>3</th>\n",
- " <td>1970-01-01 00:20:00+00:00</td>\n",
- " <td>1</td>\n",
- " <td>0</td>\n",
- " <td>29</td>\n",
- " <td>15</td>\n",
- " <td>15</td>\n",
- " <td>0</td>\n",
- " <td>0</td>\n",
- " </tr>\n",
- " <tr>\n",
- " <th>4</th>\n",
- " <td>1970-01-01 00:25:00+00:00</td>\n",
- " <td>1</td>\n",
- " <td>0</td>\n",
- " <td>29</td>\n",
- " <td>15</td>\n",
- " <td>15</td>\n",
- " <td>0</td>\n",
- " <td>0</td>\n",
- " </tr>\n",
- " <tr>\n",
- " <th>...</th>\n",
- " <td>...</td>\n",
- " <td>...</td>\n",
- " <td>...</td>\n",
- " <td>...</td>\n",
- " <td>...</td>\n",
- " <td>...</td>\n",
- " <td>...</td>\n",
- " <td>...</td>\n",
- " </tr>\n",
- " <tr>\n",
- " <th>8637</th>\n",
- " <td>1970-01-30 23:50:00+00:00</td>\n",
- " <td>0</td>\n",
- " <td>1</td>\n",
- " <td>0</td>\n",
- " <td>0</td>\n",
- " <td>49</td>\n",
- " <td>1</td>\n",
- " <td>0</td>\n",
- " </tr>\n",
- " <tr>\n",
- " <th>8638</th>\n",
- " <td>1970-01-30 23:55:00+00:00</td>\n",
- " <td>0</td>\n",
- " <td>1</td>\n",
- " <td>0</td>\n",
- " <td>0</td>\n",
- " <td>49</td>\n",
- " <td>1</td>\n",
- " <td>0</td>\n",
- " </tr>\n",
- " <tr>\n",
- " <th>8639</th>\n",
- " <td>1970-01-31 00:00:00+00:00</td>\n",
- " <td>0</td>\n",
- " <td>1</td>\n",
- " <td>0</td>\n",
- " <td>0</td>\n",
- " <td>49</td>\n",
- " <td>1</td>\n",
- " <td>0</td>\n",
- " </tr>\n",
- " <tr>\n",
- " <th>8640</th>\n",
- " <td>1970-01-31 00:05:00+00:00</td>\n",
- " <td>0</td>\n",
- " <td>1</td>\n",
- " <td>0</td>\n",
- " <td>0</td>\n",
- " <td>49</td>\n",
- " <td>1</td>\n",
- " <td>0</td>\n",
- " </tr>\n",
- " <tr>\n",
- " <th>8641</th>\n",
- " <td>1970-01-31 00:10:00+00:00</td>\n",
- " <td>0</td>\n",
- " <td>1</td>\n",
- " <td>0</td>\n",
- " <td>0</td>\n",
- " <td>49</td>\n",
- " <td>1</td>\n",
- " <td>0</td>\n",
- " </tr>\n",
- " </tbody>\n",
- "</table>\n",
- "<p>8642 rows × 8 columns</p>\n",
- "</div>"
- ],
"text/plain": [
- " timestamp hosts_up hosts_down servers_pending \\\n",
- "0 1970-01-01 00:05:00+00:00 1 0 44 \n",
- "1 1970-01-01 00:10:00+00:00 1 0 29 \n",
- "2 1970-01-01 00:15:00+00:00 1 0 29 \n",
- "3 1970-01-01 00:20:00+00:00 1 0 29 \n",
- "4 1970-01-01 00:25:00+00:00 1 0 29 \n",
- "... ... ... ... ... \n",
- "8637 1970-01-30 23:50:00+00:00 0 1 0 \n",
- "8638 1970-01-30 23:55:00+00:00 0 1 0 \n",
- "8639 1970-01-31 00:00:00+00:00 0 1 0 \n",
- "8640 1970-01-31 00:05:00+00:00 0 1 0 \n",
- "8641 1970-01-31 00:10:00+00:00 0 1 0 \n",
- "\n",
- " servers_active attempts_success attempts_failure attempts_error \n",
- "0 0 0 0 0 \n",
- "1 15 15 0 0 \n",
- "2 15 15 0 0 \n",
- "3 15 15 0 0 \n",
- "4 15 15 0 0 \n",
- "... ... ... ... ... \n",
- "8637 0 49 1 0 \n",
- "8638 0 49 1 0 \n",
- "8639 0 49 1 0 \n",
- "8640 0 49 1 0 \n",
- "8641 0 49 1 0 \n",
- "\n",
- "[8642 rows x 8 columns]"
+ "1 141065\n",
+ "4 118263\n",
+ "8 77859\n",
+ "2 62652\n",
+ "32 8651\n",
+ "Name: cpu_count, dtype: int64"
]
},
- "execution_count": 30,
+ "execution_count": 54,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
- "df_service_single"
+ "df_server_single.cpu_count.value_counts()"
]
},
{
"cell_type": "code",
- "execution_count": 33,
- "id": "5b9ccf81",
+ "execution_count": 56,
+ "id": "326abd0c",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
- "0 6189\n",
- "1 1828\n",
- "2 612\n",
- "44 13\n",
- "Name: servers_active, dtype: int64"
+ "8 8651\n",
+ "Name: cpu_count, dtype: int64"
]
},
- "execution_count": 33,
+ "execution_count": 56,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
- "df_service_multi.servers_active.value_counts()"
+ "df_host_single.cpu_count.value_counts()"
]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "id": "9e9bd9b9",
- "metadata": {},
- "outputs": [],
- "source": []
}
],
"metadata": {
diff --git a/opendc-experiments/opendc-experiments-greenifier/src/main/Python_scripts/OpenDCdemo.ipynb b/opendc-experiments/opendc-experiments-greenifier/src/main/Python_scripts/OpenDCdemo.ipynb
index 3a88aca7..bc83b6eb 100644
--- a/opendc-experiments/opendc-experiments-greenifier/src/main/Python_scripts/OpenDCdemo.ipynb
+++ b/opendc-experiments/opendc-experiments-greenifier/src/main/Python_scripts/OpenDCdemo.ipynb
@@ -2,7 +2,7 @@
"cells": [
{
"cell_type": "code",
- "execution_count": 1,
+ "execution_count": 71,
"id": "18170001",
"metadata": {},
"outputs": [],
@@ -13,7 +13,7 @@
"\n",
"from IPython.display import display, HTML\n",
"\n",
- "base_folder = \"../../../..\""
+ "base_folder = \"../../../../..\""
]
},
{
@@ -26,7 +26,7 @@
},
{
"cell_type": "code",
- "execution_count": 2,
+ "execution_count": 72,
"id": "a2d05361",
"metadata": {},
"outputs": [
@@ -165,7 +165,7 @@
},
{
"cell_type": "code",
- "execution_count": 3,
+ "execution_count": 73,
"id": "fd17d88a",
"metadata": {},
"outputs": [
@@ -199,71 +199,92 @@
" </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",
+ " <th>276974</th>\n",
+ " <td>997</td>\n",
+ " <td>2013-09-11 13:19:58+00:00</td>\n",
" <td>300000</td>\n",
- " <td>1</td>\n",
- " <td>0.000000</td>\n",
+ " <td>8</td>\n",
+ " <td>10524.798812</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",
+ " <th>276975</th>\n",
+ " <td>997</td>\n",
+ " <td>2013-09-11 13:24:58+00:00</td>\n",
" <td>300000</td>\n",
- " <td>1</td>\n",
- " <td>11.703998</td>\n",
+ " <td>8</td>\n",
+ " <td>10761.598785</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",
+ " <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>3</th>\n",
- " <td>1019</td>\n",
- " <td>2013-08-12 14:00:46+00:00</td>\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>1</td>\n",
- " <td>11.703998</td>\n",
+ " <td>8</td>\n",
+ " <td>10044.798866</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",
+ " <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",
- "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"
+ " 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": 3,
+ "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.head()"
+ "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": 4,
+ "execution_count": 75,
"id": "346f097f",
"metadata": {
"scrolled": true
@@ -364,7 +385,7 @@
"4 2599.999649 179306 "
]
},
- "execution_count": 4,
+ "execution_count": 75,
"metadata": {},
"output_type": "execute_result"
}
@@ -392,7 +413,7 @@
},
{
"cell_type": "code",
- "execution_count": 43,
+ "execution_count": 76,
"id": "0d400ffd",
"metadata": {},
"outputs": [],
@@ -433,7 +454,7 @@
},
{
"cell_type": "code",
- "execution_count": 44,
+ "execution_count": 77,
"id": "48a1e1a6",
"metadata": {},
"outputs": [
@@ -469,7 +490,7 @@
"name": "stdout",
"output_type": "stream",
"text": [
- "number of measurements: 77859\n"
+ "number of measurements: 388881\n"
]
}
],
@@ -488,7 +509,7 @@
},
{
"cell_type": "code",
- "execution_count": 45,
+ "execution_count": 78,
"id": "57a2b148",
"metadata": {},
"outputs": [
@@ -519,7 +540,7 @@
"name": "stdout",
"output_type": "stream",
"text": [
- "number of measurements: 408490\n"
+ "number of measurements: 2040140\n"
]
}
],
@@ -538,7 +559,7 @@
},
{
"cell_type": "code",
- "execution_count": 46,
+ "execution_count": 79,
"id": "9ef468ed",
"metadata": {
"scrolled": false
@@ -565,7 +586,7 @@
"name": "stdout",
"output_type": "stream",
"text": [
- "number of measurements: 8651\n"
+ "number of measurements: 43215\n"
]
}
],
@@ -584,7 +605,7 @@
},
{
"cell_type": "code",
- "execution_count": 47,
+ "execution_count": 80,
"id": "82f0a24a",
"metadata": {},
"outputs": [
@@ -592,8 +613,8 @@
"name": "stdout",
"output_type": "stream",
"text": [
- "single topology: 822692246.2425151\n",
- "multi topology: 5870271518.168591\n"
+ "single topology: 822212243.0180907\n",
+ "multi topology: 5865297897.085712\n"
]
}
],
@@ -612,7 +633,7 @@
},
{
"cell_type": "code",
- "execution_count": 48,
+ "execution_count": 81,
"id": "e94db3a6",
"metadata": {},
"outputs": [
@@ -620,8 +641,8 @@
"name": "stdout",
"output_type": "stream",
"text": [
- "single topology: 0.7799672554077309\n",
- "multi topology: 0.3421434368579651\n"
+ "single topology: 0.7806848856408527\n",
+ "multi topology: 0.3425064770436447\n"
]
}
],
@@ -640,7 +661,7 @@
},
{
"cell_type": "code",
- "execution_count": 49,
+ "execution_count": 82,
"id": "8d7daa45",
"metadata": {},
"outputs": [
@@ -648,8 +669,8 @@
"name": "stdout",
"output_type": "stream",
"text": [
- "multi topology: 0.3421434368579651\n",
- "single topology: 0.7799672554077309\n"
+ "multi topology: 0.3425064770436447\n",
+ "single topology: 0.7806848856408527\n"
]
}
],
@@ -668,13 +689,13 @@
},
{
"cell_type": "code",
- "execution_count": 33,
+ "execution_count": 83,
"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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",
+ "image/png": "iVBORw0KGgoAAAANSUhEUgAAAjcAAAGwCAYAAABVdURTAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjYuMCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy89olMNAAAACXBIWXMAAA9hAAAPYQGoP6dpAAA1N0lEQVR4nO3de1xUdf7H8fcwMiDJRUUuEkreM002UBbNX7VhtLamtRc2K5A1a1fZnzXVlqtJaRteWdJlY7cVbdtK19bcfqtLa5S/UtksL+WWkpcUSwZxS1DcAOH8/ujn1AQaDMMMHF/Px+M8Hs13vuecz/lmzrvv+c4Zi2EYhgAAAEzCz9cFAAAAeBLhBgAAmArhBgAAmArhBgAAmArhBgAAmArhBgAAmArhBgAAmEoXXxfgbY2NjTp27JiCg4NlsVh8XQ4AAGgBwzB06tQp9e7dW35+F56buejCzbFjxxQbG+vrMgAAgBuOHj2qSy+99IJ9LrpwExwcLOmLwQkJCfFxNQAAoCWqq6sVGxvr/By/kIsu3Jy7FRUSEkK4AQCgk2nJkhIWFAMAAFMh3AAAAFMh3AAAAFO56NbctFRDQ4Pq6+t9XYYp+Pv7y2q1+roMAMBFgnDzNYZhyOFw6OTJk74uxVTCwsIUFRXFs4UAAO2OcPM154JNRESEgoKC+DBuI8MwdObMGR0/flySFB0d7eOKAABmR7j5ioaGBmew6dmzp6/LMY2uXbtKko4fP66IiAhuUQEA2hULir/i3BqboKAgH1diPufGlHVMAID2RrhpBreiPI8xBQB4C+EGAACYCuEGAACYCguKW2jqqre9er4VU0a2qv+1116r+Ph45eXlNft+XFyc7r33Xt17771tLw4AgA6McHORePvtt3XJJZf4ugwAANod4eYi0atXL1+XAACAV7DmxkTOnj2rrKwshYaGKjw8XI888ogMw5D0xW2pr96y2rdvn66++moFBgZq6NChevXVV2WxWLR+/XrfFA8AgIcwc2MizzzzjKZOnart27frnXfe0d13360+ffpo2rRpLv0aGho0adIk9enTR2+99ZZOnTql+++/30dVAwA6pOfT3N938hrP1eEGwo2JxMbG6te//rUsFosGDx6sPXv26Ne//nWTcLNp0yYdPHhQmzdvVlRUlCTpV7/6lcaNG+eLsgEA8KgOcVsqPz9fcXFxCgwMVFJSkrZv337evtdee60sFkuT7aabbvJixR3Tt7/9bZeH5SUnJ2v//v1qaGhw6VdaWqrY2FhnsJGkUaNGea1OAADak8/DzZo1a2S325Wdna2dO3dqxIgRSk1Ndf7Q4tetW7dO5eXlzu1f//qXrFarfvjDH3q5cgAA0BH5PNzk5uZq2rRpyszM1NChQ1VQUKCgoCAVFhY2279Hjx6Kiopybps2bVJQUBDhRtJbb73l8vqf//ynBg4c2OSHKgcPHqyjR4+qoqLC2fb22959jg8AAO3Fp+Gmrq5OO3bsUEpKirPNz89PKSkpKikpadExVqxYoR//+MfnfYZLbW2tqqurXTazKisrk91uV2lpqV544QUtX75cM2fObNJv3Lhx6t+/vzIyMvTee+9p69atmjNnjiR+AwoA0Pn5dEHxiRMn1NDQoMjISJf2yMhI7du37xv33759u/71r39pxYoV5+2Tk5Ojxx57rM21tvaJwb6Qnp6u//znPxo1apSsVqtmzpypu+++u0k/q9Wq9evX66677tLIkSPVr18/LV68WBMmTFBgYKAPKgcAwHM69belVqxYoeHDh19wMeysWbNkt9udr6urqxUbG+uN8rxq8+bNzn9+6qmnmrx/+PBhl9dDhgzRli1bnK+3bt0qSRowYEC71AcAgLf4NNyEh4fLarW6rP2QpIqKCpdv8jSnpqZGq1ev1rx58y7YLyAgQAEBAW2u1WxeeukldevWTQMHDtSBAwc0c+ZMjRkzRv379/d1aQAAtIlP19zYbDYlJCSouLjY2dbY2Kji4mIlJydfcN+1a9eqtrZWd9xxR3uXaUqnTp3SjBkzNGTIEE2ZMkUjR47UX//6V1+XBQBAm/n8tpTdbldGRoYSExM1atQo5eXlqaamRpmZmZK+WEcSExOjnJwcl/1WrFihSZMmqWfPnr4ou9NLT09Xenq6r8sAAMDjfB5u0tLSVFlZqblz58rhcCg+Pl5FRUXORcZlZWXy83OdYCotLdWWLVv0j3/8wxclAwCADszn4UaSsrKylJWV1ex7X10oe87gwYOdPwgJAADwVT5/iB8AAIAnEW4AAICpEG4AAICpEG7glkcffVTx8fHO11OmTNGkSZN8Vg8AAOd0iAXFncLzad493+Q13j0fAAAmwcwNAAAwFcKNSbz44osaPny4unbtqp49eyolJUU1NTXO20VPPPGEIiMjFRYWpnnz5uns2bN68MEH1aNHD1166aVauXKly/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>"
]
@@ -701,28 +722,28 @@
},
{
"cell_type": "code",
- "execution_count": 34,
+ "execution_count": 84,
"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"
+ "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": 34,
+ "execution_count": 84,
"metadata": {},
"output_type": "execute_result"
}
@@ -733,7 +754,7 @@
},
{
"cell_type": "code",
- "execution_count": 35,
+ "execution_count": 85,
"id": "a8c35267",
"metadata": {},
"outputs": [
@@ -752,7 +773,7 @@
" dtype=object)"
]
},
- "execution_count": 35,
+ "execution_count": 85,
"metadata": {},
"output_type": "execute_result"
}
@@ -763,22 +784,22 @@
},
{
"cell_type": "code",
- "execution_count": 54,
+ "execution_count": 86,
"id": "68546b09",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
- "1 141065\n",
- "4 118263\n",
- "8 77859\n",
- "2 62652\n",
- "32 8651\n",
+ "1 704599\n",
+ "4 590754\n",
+ "8 388935\n",
+ "2 312937\n",
+ "32 43215\n",
"Name: cpu_count, dtype: int64"
]
},
- "execution_count": 54,
+ "execution_count": 86,
"metadata": {},
"output_type": "execute_result"
}
@@ -789,24 +810,364 @@
},
{
"cell_type": "code",
- "execution_count": 56,
+ "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": [
- "8 8651\n",
- "Name: cpu_count, dtype: int64"
+ "<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": 56,
+ "execution_count": 91,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
- "df_host_single.cpu_count.value_counts()"
+ "df_service_multi.tail()"
]
}
],