{ "cells": [ { "cell_type": "markdown", "id": "forced-resolution", "metadata": {}, "source": [ "# Downloading and preparing the workload and platform\n", "## Workload\n", "We use the reconverted log `METACENTRUM-2013-3.swf` available on [Parallel Workload Archive](https://www.cs.huji.ac.il/labs/parallel/workload/l_metacentrum2/index.html)." ] }, { "cell_type": "code", "execution_count": 7, "id": "f66eb756", "metadata": {}, "outputs": [], "source": [ "# Download the workload (548.3 MB unzipped)\n", "!wget https://www.cs.huji.ac.il/labs/parallel/workload/l_metacentrum2/METACENTRUM-2013-3.swf.gz \\\n", " --no-check-certificate -nc -P workload workload/METACENTRUM-2013-3.swf.gz" ] }, { "cell_type": "code", "execution_count": 6, "id": "bound-harvey", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "gzip: workload/METACENTRUM-2013-3.swf already exists; do you wish to overwrite (y or n)? ^C\n" ] } ], "source": [ "# Unzip the workload\n", "!gunzip workload/METACENTRUM-2013-3.swf.gz" ] }, { "cell_type": "markdown", "id": "graphic-rabbit", "metadata": {}, "source": [ "It is a 2-year-long trace from MetaCentrum, the national grid of the Czech republic. As mentionned in the [original paper releasing the log](https://www.cs.huji.ac.il/~feit/parsched/jsspp15/p5-klusacek.pdf), the platform is **very heterogeneous** and underwent majors changes during the logging period. For the purpose of our study, we perform the following selection.\n", "\n", "First:\n", "- we remove from the workload all the clusters whose nodes have **more than 16 cores**\n", "- we truncate the workload to keep only 6 month (June to November 2014) where no major change was performed in the infrastructure (no cluster < 16 cores added nor removed, no reconfiguration in the scheduling system)\n", "\n", "Second:\n", "- we remove from the workload the jobs with an **execution time greater than one day**\n", "- we remove from the workload the jobs with a **number of requested cores greater than 16**\n", "\n", "To do so, we use a the home-made SWF parser `swf_moulinette.py`:" ] }, { "cell_type": "code", "execution_count": 3, "id": "ff40dcdd", "metadata": { "scrolled": true }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Unix Time Jun 1st 2014: 1401573600\n", "Unix Time Nov 30th 2014: 1417388399\n", "We should keep all the jobs submitted between 44578794 and 60393593\n", "Processing swf line 100000\n", "Processing swf line 200000\n", "Processing swf line 300000\n", "Processing swf line 400000\n", "Processing swf line 500000\n", "Processing swf line 600000\n", "Processing swf line 700000\n", "Processing swf line 800000\n", "Processing swf line 900000\n", "Processing swf line 1000000\n", "Processing swf line 1100000\n", "Processing swf line 1200000\n", "Processing swf line 1300000\n", "Processing swf line 1400000\n", "Processing swf line 1500000\n", "Processing swf line 1600000\n", "Processing swf line 1700000\n", "Processing swf line 1800000\n", "Processing swf line 1900000\n", "Processing swf line 2000000\n", "Processing swf line 2100000\n", "Processing swf line 2200000\n", "Processing swf line 2300000\n", "Processing swf line 2400000\n", "Processing swf line 2500000\n", "Processing swf line 2600000\n", "Processing swf line 2700000\n", "Processing swf line 2800000\n", "Processing swf line 2900000\n", "Processing swf line 3000000\n", "Processing swf line 3100000\n", "Processing swf line 3200000\n", "Processing swf line 3300000\n", "Processing swf line 3400000\n", "Processing swf line 3500000\n", "Processing swf line 3600000\n", "Processing swf line 3700000\n", "Processing swf line 3800000\n", "Processing swf line 3900000\n", "Processing swf line 4000000\n", "Processing swf line 4100000\n", "Processing swf line 4200000\n", "Processing swf line 4300000\n", "Processing swf line 4400000\n", "Processing swf line 4500000\n", "Processing swf line 4600000\n", "Processing swf line 4700000\n", "Processing swf line 4800000\n", "Processing swf line 4900000\n", "Processing swf line 5000000\n", "Processing swf line 5100000\n", "Processing swf line 5200000\n", "Processing swf line 5300000\n", "Processing swf line 5400000\n", "Processing swf line 5500000\n", "Processing swf line 5600000\n", "Processing swf line 5700000\n", "-------------------\n", "End parsing\n", "Total 1649029 jobs and 556 users have been created.\n", "Total number of core-hours: 18222722\n", "4075060 valid jobs were not selected (keep_only) for 75784902 core-hour\n", "Jobs not selected: 71.2% in number, 80.6% in core-hour\n", "7119 out of 5731209 lines in the file did not match the swf format\n", "30 jobs were not valid\n" ] } ], "source": [ "# First selection\n", "# Create a swf with only the selected clusters and the 6 selected months \n", "from time import *\n", "begin_trace = 1356994806 # according to original SWF header\n", "jun1_unix_time, nov30_unix_time = mktime(strptime('Sun Jun 1 00:00:00 2014')), mktime(strptime('Sun Nov 30 23:59:59 2014'))\n", "jun1, nov30 = (int) (jun1_unix_time - begin_trace), (int) (nov30_unix_time - begin_trace)\n", "print(\"Unix Time Jun 1st 2014: {:.0f}\".format( jun1_unix_time ))\n", "print(\"Unix Time Nov 30th 2014: {:.0f}\".format( nov30_unix_time ))\n", "print(\"We should keep all the jobs submitted between {:d} and {:d}\".format(jun1, nov30))\n", "\n", "! ./scripts/swf_moulinette.py workload/METACENTRUM-2013-3.swf \\\n", " -o workload/METACENTRUM_6months.swf \\\n", " --keep_only=\"submit_time >= {jun1} and submit_time <= {nov30}\" \\\n", " --partitions_to_select 1 2 3 5 7 8 9 10 11 12 14 15 18 19 20 21 22 23 25 26 31" ] }, { "cell_type": "code", "execution_count": 4, "id": "6ec15ee8", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Processing swf line 100000\n", "Processing swf line 200000\n", "Processing swf line 300000\n", "Processing swf line 400000\n", "Processing swf line 500000\n", "Processing swf line 600000\n", "Processing swf line 700000\n", "Processing swf line 800000\n", "Processing swf line 900000\n", "Processing swf line 1000000\n", "Processing swf line 1100000\n", "Processing swf line 1200000\n", "Processing swf line 1300000\n", "Processing swf line 1400000\n", "Processing swf line 1500000\n", "Processing swf line 1600000\n", "-------------------\n", "End parsing\n", "Total 1604201 jobs and 546 users have been created.\n", "Total number of core-hours: 4785357\n", "44828 valid jobs were not selected (keep_only) for 13437365 core-hour\n", "Jobs not selected: 2.7% in number, 73.7% in core-hour\n", "0 out of 1649030 lines in the file did not match the swf format\n", "1 jobs were not valid\n" ] } ], "source": [ "# Second selection\n", "# Keep only the selected jobs\n", "! ./scripts/swf_moulinette.py workload/METACENTRUM_6months.swf \\\n", " -o workload/MC_selection_article.swf \\\n", " --keep_only=\"nb_res <= 16 and run_time <= 24*3600\"" ] }, { "cell_type": "code", "execution_count": 2, "id": "747ba154", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Processing swf line 100000\n", "Processing swf line 200000\n", "Processing swf line 300000\n", "Processing swf line 400000\n", "Processing swf line 500000\n", "Processing swf line 600000\n", "Processing swf line 700000\n", "Processing swf line 800000\n", "Processing swf line 900000\n", "Processing swf line 1000000\n", "Processing swf line 1100000\n", "Processing swf line 1200000\n", "Processing swf line 1300000\n", "Processing swf line 1400000\n", "Processing swf line 1500000\n", "Processing swf line 1600000\n", "-------------------\n", "End parsing\n", "Total 1358376 jobs and 416 users have been created.\n", "Total number of core-hours: 929847\n", "245825 valid jobs were not selected (keep_only) for 3855510 core-hour\n", "Jobs not selected: 15.3% in number, 80.6% in core-hour\n", "0 out of 1604202 lines in the file did not match the swf format\n", "1 jobs were not valid\n" ] } ], "source": [ "# Check how many jobs are 1-core-jobs\n", "! ./scripts/swf_moulinette.py workload/MC_selection_article.swf \\\n", " --keep_only=\"nb_res == 1\"" ] }, { "cell_type": "code", "execution_count": 71, "id": "38296cb6", "metadata": {}, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAxYAAAEiCAYAAABkykQ1AAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjguMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8g+/7EAAAACXBIWXMAAA9hAAAPYQGoP6dpAABZ+UlEQVR4nO3deXhMZ/sH8O8kJpNENtkkIYmQEGuqljZ4iSUIL1VKixK0tJaiKS21NCGa8F5VLWqpli7oaunbKqKWVJsiBKW1hBBL0FIZESYjeX5/eDM/Y5LImcx68v1cV672POfMee77PvFMnjlzzlEIIQSIiIiIiIiqwMHaARARERERkf3jxIKIiIiIiKqMEwsiIiIiIqoyTiyIiIiIiKjKOLEgIiIiIqIq48SCiIiIiIiqjBMLIiIiIiKqMk4siIiIiIioyjixICIiIiKiKuPEgsiCdu/eDYVCgd27d1s7lAp99tlniIyMhFKphJeXV7nbJSYmQqFQGNVHvXr18O9//9vICImIyie3sdZexMTEoFmzZtYOg6yohrUDIJKjDz74AK6urhgxYoS1Q5HsxIkTGDFiBHr27Ilp06bB1dXV2iEREZWJYy2RbVEIIYS1gyCSm2bNmsHX19fg07KSkhIUFRXByckJDg62ecJw+fLlGDt2LE6fPo3w8PAKt7137x7u3bsHZ2dnyf3Uq1cPzZo1w/fff29sqERUzVWXsdZexMTE4O+//8axY8esHQpZiW3+ayN6hJKSEty9e9faYRgoLCyscL2DgwOcnZ1t9o0OAK5duwYAlTotX6NGDaMmFURkHzjWmo+Usdbcbt++be0QzEKuedky2/0XR7JX+v38EydOYNCgQfDw8ICPjw8mTZpk8EamUCgwYcIErF27Fk2bNoVKpcLWrVsBAFlZWYiLi4OHhwfc3NzQtWtX/Pbbb3qvX7NmDRQKBdLT0/HSSy/Bx8cHHh4eGD58OP755x+D2D744ANdP0FBQRg/fjxu3rypt03pd0kPHjyIjh07wtXVFW+++Sbq1auH48ePY8+ePVAoFFAoFIiJiQFQ/vd+v/76a7Rq1QouLi7w9fXF888/j0uXLultM2LECLi5ueHSpUvo168f3Nzc4OfnhylTpqC4uLhSNX9UXvXq1cNbb70FAPDz84NCoUBiYmK5+yvrGot79+5h7ty5aNCgAVQqFerVq4c333wTGo2mzH1s374djz32GJydndGkSRNs2LBBb71Wq0VSUhIiIiLg7OwMHx8fdOjQAWlpaZXKmai641j7/+x1rAWgO35+fn5wcXFBo0aNMGPGDL1tpByjPXv2YNy4cfD390fdunV163/88Uf861//Qs2aNeHu7o7evXvj+PHjlcq71B9//IHOnTvD1dUVderUwYIFCwy2uXbtGl544QXUrl0bzs7OiIqKwieffKK3TXnH8dy5c1AoFFizZo2urfS4nTlzBr169YK7uzuGDh0KADh9+jQGDBiAgIAAODs7o27dunjuueeQn58vKS+qBEFkJW+99ZYAIJo3by769OkjlixZIp5//nkBQAwbNkxvWwCicePGws/PTyQlJYmlS5eKrKwscezYMVGzZk0RGBgo5s6dK1JTU0VYWJhQqVTit99+071+9erVur7+9a9/iffff1+MHz9eODg4iI4dO4qSkhKDuLp16yYWL14sJkyYIBwdHUWbNm1EUVGRbrtOnTqJgIAA4efnJ1555RWxYsUKsWnTJrFx40ZRt25dERkZKT777DPx2Wefie3btwshhNi1a5cAIHbt2mUQW5s2bcS7774rpk2bJlxcXES9evXEP//8o9suPj5eODs7i6ZNm4pRo0aJZcuWiQEDBggA4oMPPqh0vSvKa+PGjeLpp58WAMSyZcvEZ599Jo4cOfLIfT4oPj5eABDPPPOMWLp0qRg+fLgAIPr166e3XWhoqGjYsKHw8vIS06ZNEwsXLhTNmzcXDg4OunoJIcSbb74pFAqFGD16tPjwww/FO++8IwYPHixSU1MfmTMRcax9ODZ7HGuPHDkiPDw8hI+Pj5g+fbpYsWKFeP3110Xz5s1120g9Rk2aNBGdOnUSixcv1o2nn376qVAoFKJnz55i8eLFYv78+aJevXrCy8tL5OTkPDL3Tp06iaCgIBEcHCwmTZokPvjgA9GlSxcBQGzZskW3XWFhoWjcuLFQKpXi1VdfFe+//77417/+JQCIRYsW6bYr6zgKIUROTo4AIFavXq1ri4+PFyqVSjRo0EDEx8eL5cuXi08//VRoNBoRFhYmgoKCRHJysli1apVISkoSbdq0EefOnXtkTiQNJxZkNaWDb9++ffXax40bJwDoDbIAhIODgzh+/Ljetv369RNOTk7izJkzurbLly8Ld3d30bFjR11b6UDaqlUr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", "text/plain": [ "<Figure size 800x300 with 2 Axes>" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "import pandas as pd\n", "from matplotlib.ticker import PercentFormatter\n", "import matplotlib.pyplot as plt\n", "\n", "header = [\"JOB_ID\",\"SUBMIT_TIME\",\"WAIT_TIME\",\"RUN_TIME\",\"ALLOCATED_PROCESSOR_COUNT\",\"AVERAGE_CPU_TIME_USED\",\"USED_MEMORY\",\"REQUESTED_NUMBER_OF_PROCESSORS\",\"REQUESTED_TIME\",\"REQUESTED_MEMORY\",\"STATUS\",\"USER_ID\",\"GROUP_ID\",\"APPLICATION_ID\",\"QUEUD_ID\",\"PARTITION_ID\",\"PRECEDING_JOB_ID\",\"THINK_TIME_FROM_PRECEDING_JOB\"]\n", "df = pd.read_csv(\"workload/MC_selection_article.swf\", delim_whitespace=True, header=None, names=header)\n", "# pd.read\n", "\n", "fix, ax = plt.subplots(1,2, sharey=True, figsize=(8,3), layout=\"tight\")\n", "\n", "procs = df[\"REQUESTED_NUMBER_OF_PROCESSORS\"].value_counts().sort_index()\n", "df[\"coreh\"] = df[\"REQUESTED_NUMBER_OF_PROCESSORS\"] * df[\"RUN_TIME\"]\n", "coreh = df.groupby(by=[\"REQUESTED_NUMBER_OF_PROCESSORS\"]).sum()[\"coreh\"]\n", "coreh_prct = coreh / coreh.sum() \n", "procs_prct = procs / procs.sum()\n", "# display(procs_prct.sort_index())\n", "procs_prct.plot.barh(ax=ax[0], ylabel=\"number of requested cores\", title=\"proportion of jobs\")\n", "coreh_prct.plot.barh(ax=ax[1], title=\"proportion of core-hours\")\n", "\n", "ax[0].grid(); ax[1].grid(); ax[0].set_axisbelow(True); ax[1].set_axisbelow(True)\n", "ax[0].xaxis.set_major_formatter(PercentFormatter(1)); ax[1].xaxis.set_major_formatter(PercentFormatter(1,decimals=0))\n", "\n", "plt.savefig(\"out/stats_filtered_wl.pdf\", bbox_inches='tight', dpi=1000)\n" ] }, { "cell_type": "code", "execution_count": 74, "id": "8d3d2fb8", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "count 1.604201e+06\n", "mean 3.213063e+03\n", "std 9.773328e+03\n", "min 0.000000e+00\n", "25% 6.600000e+01\n", "50% 1.360000e+02\n", "75% 1.123000e+03\n", "max 8.640000e+04\n", "Name: RUN_TIME, dtype: float64" ] }, "execution_count": 74, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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RA8yJyQkaOLEiWpoaLDGQqGQGhoalJub2+M+ubm5YfXS1ctrXfWZmZlyuVxhNYFAQI2NjVZNbm6uWltb1dTUZNXs3r1boVBIbrf7uvN96623woIUAACwr4hvb5WVlWnhwoXKycnRpEmTtHHjRl28eFFFRUWSpAULFmjkyJGqrKyUJC1ZskRTp07Vhg0blJ+fr5qaGh04cECbN2+WJMXExGjp0qV66qmnlJWVpczMTK1atUoZGRkqKCiQJI0dO1YzZ87UokWLVF1drWAwqNLSUs2bN08ZGRmSpB/84AdKSEjQfffdJ0n68Y9/rC1btuill176xG8SAAD49Is49MydO1cffvihKioq5Pf7lZ2drfr6eutB5NOnT8vh+MsFpMmTJ2vbtm1auXKlVqxYoaysLNXW1mrcuHFWzfLly3Xx4kWVlJSotbVVU6ZMUX19vRITE62arVu3qrS0VNOmTZPD4dCcOXNUVVUVNre1a9fq97//veLi4jRmzBht375dX/va1yJ+UwAAwOATY4wxH19mD4FAQCkpKWpra7spDzLX1dVp+b5Y65me99bl39BzoP+6+jNr1qxBeb/7047+RD96FN0Ge3/6+v2b370FAABsgdADAABsgdADAABsgdADAABsgdADAABsgdADAABsgdADAABsgdADAABsgdADAABsgdADAABsgdADAABsgdADAABsgdADAABsgdADAABsgdADAABsgdADAABsgdADAABsgdADAABsgdADAABsgdADAABsgdADAABsgdADAABsgdADAABsgdADAABsgdADAABsgdADAABsgdADAABsgdADAABsgdADAABsgdADAABsoV+hZ9OmTRo9erQSExPldru1b9++Xut37NihMWPGKDExUePHj1ddXV3YdmOMKioqlJ6eriFDhsjj8ejkyZNhNS0tLSosLFRycrJSU1NVXFysCxcu9Hi+3/72t7r11luVmpran+UBAIBBKOLQs337dpWVlWn16tU6ePCgJkyYoLy8PJ09e7bH+r1792r+/PkqLi7WoUOHVFBQoIKCAh0+fNiqWb9+vaqqqlRdXa3GxkYNHTpUeXl5unz5slVTWFioI0eOyOv1aufOndqzZ49KSkq6nS8YDGr+/Pn64he/GOnSAADAIBZx6Hnuuee0aNEiFRUV6e6771Z1dbWSkpK0ZcuWHuuff/55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XK6w9y4QCKixsTGsR62trWpqarJqdu/erVAoJLfbbdXs2bNHwWDQqvF6vfrc5z6n2267zarprY92dOnSJTkc4d+iY2NjFQqFJNGffhvoJ6kHu5qaGuN0Os33v/99c/ToUVNSUmJSU1PDPpGCyD322GMmJSXFvPnmm+aDDz6w/ly6dMmq+Yd/+Adzxx13mN27d5sDBw6Y3Nxck5uba23v+kj0jBkzzFtvvWXq6+vNX/3VX/X4kehly5aZY8eOmU2bNvX4kWh6/PE++uktY+jPQNu3b5+Ji4sz3/72t83JkyfN1q1bTVJSkvnhD39o1axbt86kpqaan/zkJ+add94xs2fP7vEj0ffdd59pbGw0v/zlL01WVlbYR6JbW1tNWlqa+frXv24OHz5sampqTFJSUrePRMfFxZlnn33WHDt2zKxevfpT+5HoG2XhwoVm5MiR1kfWf/zjH5vhw4eb5cuXWzX0J3KEnv8AL7zwgrnjjjtMQkKCmTRpkvn1r3890FP61JPU45/vfe97Vs2f//xn81//6381t912m0lKSjIPPvig+eCDD8KO895775kvfelLZsiQIWb48OHmn/7pn0wwGAyr+fnPf26ys7NNQkKC+cxnPhN2ji70+ONdG3roz8B7/fXXzbhx44zT6TRjxowxmzdvDtseCoXMqlWrTFpamnE6nWbatGnmxIkTYTV//OMfzfz5880tt9xikpOTTVFRkTl//nxYzdtvv22mTJlinE6nGTlypFm3bl23ubz66qvmrrvuMgkJCeaee+4xP/3pT2/8gj9FAoGAWbJkibnjjjtMYmKi+cxnPmP+5V/+Jeyj5fQncjHGfOTHOwIAAAxSPNMDAABsgdADAABsgdADAABsgdADAABsgdADAABsgdADAABsgdADAABsgdADAABsgdADAABsgdADAABsgdADAABsgdADAABs4f8BBoROX+XnC2wAAAAASUVORK5CYII=", "text/plain": [ "<Figure size 640x480 with 1 Axes>" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "df[\"RUN_TIME\"].hist(bins=100, density=1)\n", "df[\"RUN_TIME\"].describe()" ] }, { "cell_type": "markdown", "id": "afde35e8", "metadata": {}, "source": [ "## Platform\n", "According to the system specifications given in the [corresponding page in Parallel Workload Archive](https://www.cs.huji.ac.il/labs/parallel/workload/l_metacentrum2/index.html): from June 1st 2014 to Nov 30th 2014 there is no change in the platform for the clusters considered in our study (<16 cores). There is a total of **6304 cores**.(1)\n", "\n", "We build a platform file adapted to the remaining workload. We see above that the second selection cuts 73.7\\% of core-hours from the original workload. We choose to make an homogeneous cluster with 16-core nodes. To have a coherent number of nodes, we count:\n", "\n", "$\\#nodes = \\frac{\\#cores_{total} * \\%kept_{core.hour}}{\\#corePerNode} = 6304 * .263 / 16 = 104$\n", "\n", "In SimGrid platform language, this corresponds to such a cluster:\n", "```xml\n", "<cluster id=\"cluster_MC\" prefix=\"MC_\" suffix=\"\" radical=\"0-103\" core=\"16\">\n", "```\n", "\n", "The corresponding SimGrid platform file can be found in `platform/average_metacentrum.xml`.\n", "\n", "(1) clusters decomissionned before or comissionned after the 6-month period have been removed: $8+480+160+1792+256+576+88+416+108+168+752+112+588+48+152+160+192+24+224 = 6304$" ] } ], "metadata": { "kernelspec": { "display_name": "Python 3", "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 }