diff --git a/.github/workflows/conda-cpp.yml b/.github/workflows/conda-cpp.yml index e557637f8..00111c5aa 100644 --- a/.github/workflows/conda-cpp.yml +++ b/.github/workflows/conda-cpp.yml @@ -25,6 +25,7 @@ jobs: - os: ubuntu-20.04 gcc: 9 ucc: "master" + ucx: "override-remote-address3" steps: - uses: actions/checkout@v2 @@ -39,7 +40,7 @@ jobs: - uses: conda-incubator/setup-miniconda@v2 with: activate-environment: cylon_dev - environment-file: conda/environments/cylon.yml + environment-file: conda/environments/cylon_NoUCX.yml - name: Activate conda run: conda activate cylon_dev @@ -51,17 +52,24 @@ jobs: cmake .. -DBUILD_SHARED_LIBS=1 -DUSE_MPI=1 -DCMAKE_INSTALL_PREFIX=$HOME/gloo/install make install + - name: Install UCX + run: | + git clone --single-branch -b ${{ matrix.ucx }} https://github.com/mstaylor/ucx.git $HOME/ucx + cd $HOME/ucx + ./autogen.sh + ./configure --prefix=$HOME/ucx/install --without-go + make install + - name: Install UCC run: | git clone --single-branch -b ${{ matrix.ucc }} https://github.com/openucx/ucc.git $HOME/ucc cd $HOME/ucc - echo "conda ucx: $(conda list | grep ucx)" ./autogen.sh - ./configure --prefix=$HOME/ucc/install --with-ucx=$CONDA/envs/cylon_dev + ./configure --prefix=$HOME/ucc/install --with-ucx=$HOME/ucx/install make install - name: Build cylon, pycylon and run cpp test - run: python build.py -cmake-flags="-DCYLON_UCX=1 -DCYLON_GLOO=1 -DGLOO_INSTALL_PREFIX=$HOME/gloo/install -DCYLON_UCC=1 -DUCC_INSTALL_PREFIX=$HOME/ucc/install" -ipath="$HOME/cylon/install" --cpp --python --test + run: python build.py -cmake-flags="-DCYLON_UCX=1 -DCYLON_GLOO=1 -DGLOO_INSTALL_PREFIX=$HOME/gloo/install -DCYLON_UCC=1 -DUCC_INSTALL_PREFIX=$HOME/ucc/install -DUCX_INSTALL_PREFIX=$HOME/ucx/install" -ipath="$HOME/cylon/install" --cpp --python --test - name: Run pytest run: python build.py -ipath="$HOME/cylon/install" --pytest diff --git a/.github/workflows/macos.yml b/.github/workflows/macos.yml index 3ad7f8b8b..15cbb3d38 100644 --- a/.github/workflows/macos.yml +++ b/.github/workflows/macos.yml @@ -20,7 +20,7 @@ jobs: fail-fast: false matrix: include: - - os: macos-11 + - os: macos-latest steps: - uses: actions/checkout@v2 diff --git a/aws/scripts/Join_Weak_Scaling.ipynb b/aws/scripts/Join_Weak_Scaling.ipynb index b962f6948..3e11bff98 100644 --- a/aws/scripts/Join_Weak_Scaling.ipynb +++ b/aws/scripts/Join_Weak_Scaling.ipynb @@ -16,7 +16,7 @@ "cells": [ { "cell_type": "code", - "execution_count": 19, + "execution_count": 8, "metadata": { "colab": { "base_uri": "https://localhost:8080/", diff --git a/aws/scripts/Join_Weak_Scaling_round2.ipynb b/aws/scripts/Join_Weak_Scaling_round2.ipynb new file mode 100644 index 000000000..64d81e0c1 --- /dev/null +++ b/aws/scripts/Join_Weak_Scaling_round2.ipynb @@ -0,0 +1,473 @@ +{ + "nbformat": 4, + "nbformat_minor": 0, + "metadata": { + "colab": { + "provenance": [] + }, + "kernelspec": { + "name": "python3", + "display_name": "Python 3" + }, + "language_info": { + "name": "python" + } + }, + "cells": [ + { + "cell_type": "code", + "execution_count": 18, + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 473 + }, + "id": "DdPziLudpalX", + "outputId": "3c63ebcd-b960-425e-9733-7e06a43dc28d" + }, + "outputs": [ + { + "data": { + "text/plain": "
", + "image/png": "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" + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "import matplotlib.pyplot as plt\n", + "\n", + "# Given data\n", + "world_size = ['4 | 16', '8 | 32', '16 | 64', '32 | 128', '64 | 256']\n", + "ec2_4_26 = [26.80001503, 33.82108727, 34.70261905, 34.40150503, 36.04979236]\n", + "ec2_16_28 = [30.07260311, 36.75810435, 36.8333492, 37.36801396, 38.40536711]\n", + "fargate_4_26 = [33.68554413, 42.44095802, 43.11394629, 46.3293512, 47.92054052]\n", + "fargate_16_28 = [31.50847322, 40.88083729, 40.72470558, 41.43658119, 42.52811459]\n", + "rivanna_8 = [25.98013163, 28.41809341, 30.62765954, 29.37659091, 30.77450389]\n", + "rivanna_16 = [25.26343322, 28.12409517, 27.14304942, 28.98870633, 31.24031554]\n", + "\n", + "ec2_4_26_err = [1.690741089, 0.4297059082, 0.2713161653, 0.621981106, 0.3555366731]\n", + "ec2_16_28_err = [0.1131030894, 0.5180851482, 0.1446106828, 0.2227162348, 0.3716563786]\n", + "fargate_4_26_err = [0.05400982477, 1.46033826, 1.515233265, 1.808315597, 1.200178515]\n", + "fargate_16_28_err = [3.518690911, 0.5573273239, 0.3047347395, 0.2670398924, 0.2849529409]\n", + "rivanna_8_err = [0.6486999821, 0.3616146377, 2.897190918, 1.677787319, 2.216267362]\n", + "rivanna_16_err = [0.1507025937, 0.3740365494, 0.1460753863, 1.080150049, 0.8721500223]\n", + "\n", + "# Create a line chart\n", + "plt.plot(world_size, ec2_4_26, marker='o', color='b', label='EC2 - 8 CPU/26 GB Memory')\n", + "plt.plot(world_size, ec2_16_28, marker='o', color='g', label='EC2 - 16 CPU/28 GB Memory')\n", + "plt.plot(world_size, fargate_4_26, marker='o', color='r', label='Fargate - 8 CPU/26 GB Memory')\n", + "plt.plot(world_size, fargate_16_28, marker='o', color='orange', label='Fargate - 16 CPU/28 GB Memory')\n", + "plt.plot(world_size, rivanna_8, marker='o', color='black', label='Rivanna - 8 CPU')\n", + "plt.plot(world_size, rivanna_16, marker='o', color='purple', label='Rivanna - 16 CPU')\n", + "\n", + "plt.errorbar(world_size, ec2_4_26, yerr=ec2_4_26_err, fmt='x', color='b', ecolor='b', capsize=5)\n", + "plt.errorbar(world_size, ec2_16_28, yerr=ec2_16_28_err, fmt='o', color='g', ecolor='g', capsize=5)\n", + "plt.errorbar(world_size, fargate_4_26, yerr=fargate_4_26_err, fmt='x', color='r', ecolor='r', capsize=5)\n", + "plt.errorbar(world_size, fargate_16_28, yerr=fargate_16_28_err, fmt='x', color='orange', ecolor='orange', capsize=5)\n", + "plt.errorbar(world_size, rivanna_8, yerr=rivanna_8_err, fmt='x', color='black', ecolor='black', capsize=5)\n", + "plt.errorbar(world_size, rivanna_16, yerr=rivanna_16_err, fmt='x', color='purple', ecolor='purple', capsize=5)\n", + "\n", + "custom_text = \"9.1m rows (1/2/4/8/16 Nodes)\"\n", + "plt.text(1, 48, custom_text, fontsize=10, color='blue', ha='center')\n", + "\n", + "plt.ylim(5, 50)\n", + "\n", + "plt.xticks(world_size)\n", + "\n", + "# Add labels and title\n", + "plt.xlabel('parallelism')\n", + "plt.ylabel('average time (s)')\n", + "plt.title('Weak Scaling of Join Operation')\n", + "\n", + "# Add a legend\n", + "plt.legend(loc=\"lower right\")\n", + "\n", + "plt.savefig('join-w-scaling.svg', format='svg')\n", + "\n", + "# Display the chart\n", + "plt.show()\n" + ] + }, + { + "cell_type": "code", + "execution_count": 22, + "outputs": [ + { + "data": { + "text/plain": "
", + "image/png": "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OBg7duxAbGwszM3NsXnzZtja2uLs2bMYOXIkNDU1MW7cuELrPnv2LBISEtC/f39xWUZGBszNzREUFIRvv/22wP3evn2Lzp07w8LCArt27UK1atXw4MEDGBkZqXTMMTExGDt2LJo2bYqsrCwEBQXB09MTcXFx4sXupEmTEBUVhc2bN8PBwQFHjx7FmDFjYGNjA29vbwCAr68vpkyZgvj4eNSpU0eluovy9ddfY8SIEUhNTcX69esxevRoVKpUCQMGDFC7rMzMTGhra793TO/r4sWLyM7OBqB4vfv164dbt27B2NgYAKCjowOpVAqpVFpuMaalpWHHjh2YMmUKIiIiSpQomZubl0Fk/x7sekdERERqM8dzWONJmT9Kmozp6urCyspK6VG5cmUAigvIoUOHolu3bti/fz86deoER0dHNG/eHEuWLMHKlSsBAMOGDUN4eDg8PDxQvXp1DBo0CEOHDsWePXuKrHv79u3w9PSEnp6euMzBwQHLly/H4MGDC0341q5di+fPn2Pfvn1o1aoV7O3t0bp1azRs2FClY46MjISfnx/q1auHhg0bYt26dUhMTFTqRnfu3DkMGTIE7dq1g4ODA0aOHImGDRvi0qVL4jampqZo2bIltm3bplK9xTEyMoKVlRWcnJwwb9481KxZE/v27QMABAYGolatWtDX10f16tURHByMzMxMcd+QkBA0atQIa9euRfXq1aGrqwtBEBAZGYnWrVujUqVKMDU1RY8ePXD37l214jp79izatm0LqVQKW1tb+Pv74/Xr1yrta25uLr6vqlSpAgCwsLBQWpa3613uY7Gzs4OhoSG+/PJLZGdnIywsDFZWVrCwsMD8+fOV6pLJZBg5ciQsLCxgbGyMDh064OrVq8XG+PPPP6Nu3bqYPn06zpw5g/v37yutf/LkCXr27AmpVApHR0ds2bIlXxm5u94V1N0tJSUFEokE0dHRAIAXL17A19cX5ubmkEqlqFmzpviDhaOjIwDA1dUVEokE7dq1E8tZt24d6tSpAz09PdSuXRs//vijUhz/+9//4OrqCj09Pbi5ueHy5cvFHn9pYKJERERE/ylHjhxBcnIypk6dWuD6osaVyGQy8cK4MCdPnoSbm5vace3fvx/u7u4YO3YsLC0t4eLigtDQULHlQl05Y7tyx9u6dWvs378ff//9NwRBQFRUFG7fvg0vLy+l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tzMzMyVJkyZN0muvvaaZM2fqwoULeuyxx/T999+rX79+2rJli2w2m1mRAQAAADQDphal5ORkORyOXz1usViUlZWlrKwsz4UCAAAA0Ox57RolAAAAADALRQkAAAAADChKAAAAAGBAUQIAAAAAA4oSAAAAABiY+tQ7NC0lJSUeHQcAAACYhaKEqwoKKletQ8rLyzM7CgAAAOARFCVcVevWF+VnkQouJche29rl8df529W75dduSAYAAAC4B0UJ9Wavba1zjjYujwuuveCGNAAAAID78DAHAAAAADCgKAEAAACAAUUJAAAAAAwoSgAAAABgQFECAAAAAAOKEgAAAAAYUJQAAAAAwICiBAAAAAAGFCUAAAAAMKAoAQAAAIABRQkAAAAADChKAAAAAGBAUQIAAAAAA4oSAAAAABhQlAAAAADAgKIEAAAAAAYUJQAAAAAwoCgBAAAAgAFFCQAAAAAMKEoAAAAAYEBRAgAAAAADihIAAAAAGFCUAAAAAMCAogQAAAAABhQlAAAAADCgKAEAAACAAUUJAAAAAAwoSgAAAABgQFECAAAAAAOKEgAAAAAYUJQAAAAAwICiBAAAAAAGFCUAAAAAMKAoAQAAAIABRQkAAAAADChKAAAAAGBAUQIAAAAAA4oSAAAAABhQlAAAAADAgKIEAAAAAAZeXZSysrJksVjqvKKjo82OBQAAAMDHtTA7wNV069ZNH3zwgXPb39/fxDQAAAAAmgOvL0otWrRgFgkAAACAR3l9UTp+/LhiY2NltVrVr18/LVq0SImJib96flVVlaqqqpzbdrtdklRaWur2rFdTVlamixcvqqy2Vm0aML68pkYXL15UrWpdHlujGl3URdXWlkkufnpNTbkuXryomqpK1TosLn92td8FXXRcVJlq1UYOl8aW/3/u6gvVqqmtce1zq6p/+vMuK1ObNg35E296uMa4xjzhWq4zs64x6dquM64xz+Ia89w1JjXP68ysa0wy7+9LrrGf/NwJHI6r/xlYHPU5yyTvv/++Kisr1alTJ3377bdasGCBPvvsMx05ckRhYWFXHJOVlaVnnnnGw0kBAAAANBWnT59W+/btf/Mcry5KRhUVFerYsaNmzpypzMzMK55jnFGqra3V+fPnFRYWJovF9X+pbipKS0sVFxen06dPq23btmbHgQ/iGoMncJ3B3bjG4G5cY97N4XCo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FBQUpJEjR+rSpUtXHb93715NmTJF8+fP17Fjx7Rp0yYNGjTosv/u8PBw/ec//1FGRoYeffRR3XPPPRowYIA+/vhjjRgxQvfdd58qKyvrlRkA4HncegcAcJu4uDgtXbpUFotFnTt31uHDh7V06VI99NBDevDBB53nJSYm6sUXX9Stt96q8vJyBQUFOY/Nnz9fw4cPd26HhYWpV69ezu0FCxZo/fr12rhxo9LT06+a6a233pKfn59eeeUVWSwWSdLKlSsVEhKi/Px8paSk/Ob4U6dOqU2bNrrjjjtks9kUHx+vm2++uc45vXr10pw5cyRJs2fP1uLFixUeHq6HHnpIkjRv3jwtX75chw4dUv/+/a+aGQDgecwoAQDcpn///s4yIkm/+93vdPz4cdXU1Gj//v0aPXq04uPjZbPZlJycLEmXzQz16dOnznZFRYVmzpyprl27KiQkREFBQfrss8/qPaO0b98+nThxQjabTUFBQQoKClJoaKguXryokydPXnX88OHDFR8fr8TERN13331avXr1ZTNDPXv2dP7s7++vsLAw9ejRw7kvKipKkurcaggA8C7MKAEAPO7ixYtKSUlRSkqKVq1apYiICJ06dUojRoy47Pa3Nm3a1NmeMWOGNm/erOeff1433HCDAgICdPfdd9frtjlJqq2tVe/evbV69erLjkVERFx1vM1m08cff6z8/Hxt2bJF8+bNU1ZWlvbs2aOQkBBJuuwJeRaLpc6+n8tjbW1tvTIDADyPogQAcJtdu3Zdtp2UlKTPPvtMJSUlWrx4seLi4iT9tPanPrZv367Jkydr7NixkqTy8vLffBCD0S233KJ169YpMjJSbdu2rfe4X2rRooWGDRumYcOG6emnn1ZISIi2bdumcePGNej9AADeh1vvAABuc/r0aWVmZurYsWNau3atli1bpqlTp6pDhw5q1aqVli1bpi+++EIbN27Us88+W6/3vOGGG5SXl6cDBw7o4MGDmjhxokszM3/84x8VHh6u0aNHa/v27SoqKlJBQYGmTp2qM2fOXHX8O++8oxdffFEHDhzQV199pTfeeEO1tbXq3LlzvTMAALwfRQkA4Db333+/Lly4oFtvvVVpaWnKyMjQww8/rIiICL322mv6xz/+oa5du2rx4sV6/vnn6/WeS5cuVbt27TRgwAClpqZqxIgRuuWWW+qdKTAwUIWFherQoYPGjRunG2+8UQ8++KAuXLhQrxmmkJAQ5eXlaejQobrxxhv18ssva+3aterWrVu9MwAAvJ/F8fMXWgAA0IiSk5N10003KScnx+woAAC4jBklAAAAADCgKAEAAACAAbfeAQAAAIABM0oAAAAAYEBRAgAAAAADihIAAAAAGFCUAAAAAMCAogQAAAAABhQlAAAAADCgKAEAAACAAUUJAAAAAAz+D6sXCPuUa7vMAAAAAElFTkSuQmCC" + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "import matplotlib.pyplot as plt\n", + "import numpy as np\n", + "\n", + "# Given data\n", + "world_size = ['1', '2', '4', '8', '16']\n", + "ec2_4_26 = [26.80001503, 33.82108727, 34.70261905, 34.40150503, 36.04979236]\n", + "ec2_16_28 = [30.07260311, 36.75810435, 36.8333492, 37.36801396, 38.40536711]\n", + "fargate_4_26 = [33.68554413, 42.44095802, 43.11394629, 46.3293512, 47.92054052]\n", + "fargate_16_28 = [31.50847322, 40.88083729, 40.72470558, 41.43658119, 42.52811459]\n", + "rivanna_8 = [25.98013163, 28.41809341, 30.62765954, 29.37659091, 30.77450389]\n", + "rivanna_16 = [25.26343322, 28.12409517, 27.14304942, 28.98870633, 31.24031554]\n", + "\n", + "ec2_4_26_2 = [26.80001503/3.021825373, 33.82108727/3.021825373, 34.70261905/3.021825373, 34.40150503/3.021825373, 36.04979236/3.021825373]\n", + "ec2_16_28_2 = [30.07260311/2.598218739, 36.75810435/2.598218739, 36.8333492/2.598218739, 37.36801396/2.598218739, 38.40536711/2.598218739]\n", + "fargate_4_26_2 = [33.68554413, 42.44095802, 43.11394629, 46.3293512, 47.92054052]\n", + "fargate_16_28_2 = [31.50847322, 40.88083729, 40.72470558, 41.43658119, 42.52811459]\n", + "rivanna_8_2_2 = [25.98013163, 28.41809341, 30.62765954, 29.37659091, 30.77450389]\n", + "rivanna_16_2 = [25.26343322/2.072015524, 28.12409517/2.072015524, 27.14304942/2.072015524, 28.98870633/2.072015524, 31.24031554/2.072015524]\n", + "\n", + "# set width of bar\n", + "barWidth = 0.1\n", + "\n", + "br1 = np.arange(len(world_size))\n", + "br2 = [x + barWidth for x in br1]\n", + "br3 = [x + barWidth for x in br2]\n", + "br4 = [x + barWidth for x in br3]\n", + "br5 = [x + barWidth for x in br4]\n", + "br6 = [x + barWidth for x in br5]\n", + "\n", + "\n", + "fig = plt.subplots(figsize =(10, 7))\n", + "\n", + "plt.bar(br1, ec2_4_26, color ='r', width = barWidth,\n", + " edgecolor ='grey', label ='EC2 (4_26)')\n", + "plt.bar(br2, ec2_16_28, color ='g', width = barWidth,\n", + " edgecolor ='grey', label ='EC2 (16_28)')\n", + "plt.bar(br3, rivanna_16, color ='b', width = barWidth,\n", + " edgecolor ='grey', label ='Rivanna')\n", + "plt.bar(br4, ec2_4_26_2, width = barWidth,\n", + " edgecolor ='grey', label ='EC2 (16_28) - Parallel Time Adjusted')\n", + "plt.bar(br5, ec2_16_28_2, width = barWidth,\n", + " edgecolor ='grey', label ='EC2 (16_28) - Parallel Time Adjusted')\n", + "plt.bar(br6, rivanna_16_2, width = barWidth,\n", + " edgecolor ='grey', label ='Rivanna - Parallel Time Adjusted')\n", + "\n", + "\n", + "\n", + "# Create a line chart\n", + "#plt.plot(world_size, ec2_4_26, marker='o', color='b', label='EC2 - 8 CPU/26 GB Memory')\n", + "#plt.plot(world_size, ec2_16_28, marker='o', color='g', label='EC2 - 16 CPU/28 GB Memory')\n", + "#plt.plot(world_size, fargate_4_26, marker='o', color='r', label='Fargate - 8 CPU/26 GB Memory')\n", + "#plt.plot(world_size, fargate_16_28, marker='o', color='orange', label='Fargate - 16 CPU/28 GB Memory')\n", + "#plt.plot(world_size, rivanna_8, marker='o', color='black', label='Rivanna - 8 CPU')\n", + "#plt.plot(world_size, rivanna_16, marker='o', color='purple', label='Rivanna - 16 CPU')\n", + "\n", + "\n", + "custom_text = \"9.1m rows (1/2/4/8/16 Nodes)\"\n", + "plt.text(1, 48, custom_text, fontsize=10, color='blue', ha='center')\n", + "\n", + "plt.ylim(5, 50)\n", + "\n", + "#plt.xticks(world_size)\n", + "plt.xticks([r + barWidth for r in range(len(world_size))],\n", + " world_size)\n", + "\n", + "# Add labels and title\n", + "plt.xlabel('parallelism')\n", + "plt.ylabel('average time (s)')\n", + "plt.title('EC2/Rivanna Weak Scaling Versus Parallelism Based on Single Node')\n", + "\n", + "# Add a legend\n", + "plt.legend()\n", + "\n", + "plt.savefig('join-w-scaling-adjusted.svg', format='svg')\n", + "\n", + "# Display the chart\n", + "plt.show()" + ], + "metadata": { + "collapsed": false + } + }, + { + "cell_type": "code", + "source": [ + "import matplotlib.pyplot as plt\n", + "\n", + "# Given data\n", + "world_size = ['4 | 16', '8 | 32', '16 | 64', '32 | 128', '64 | 256']\n", + "ec2_4_26 = [26.80001503, 33.82108727, 34.70261905, 34.40150503, 36.04979236]\n", + "ec2_16_28 = [30.07260311, 36.75810435, 36.8333492, 37.36801396, 38.40536711]\n", + "fargate_4_26 = [33.68554413, 42.44095802, 43.11394629, 46.3293512, 47.92054052]\n", + "fargate_16_28 = [31.50847322, 40.88083729, 40.72470558, 41.43658119, 42.52811459]\n", + "rivanna_8 = [25.98013163, 28.41809341, 30.62765954, 29.37659091, 30.77450389]\n", + "rivanna_16 = [25.26343322, 28.12409517, 27.14304942, 28.98870633, 31.24031554]\n", + "\n", + "ec2_4_26_err = [1.690741089, 0.4297059082, 0.2713161653, 0.621981106, 0.3555366731]\n", + "ec2_16_28_err = [0.1131030894, 0.5180851482, 0.1446106828, 0.2227162348, 0.3716563786]\n", + "fargate_4_26_err = [0.05400982477, 1.46033826, 1.515233265, 1.808315597, 1.200178515]\n", + "fargate_16_28_err = [3.518690911, 0.5573273239, 0.3047347395, 0.2670398924, 0.2849529409]\n", + "rivanna_8_err = [0.6486999821, 0.3616146377, 2.897190918, 1.677787319, 2.216267362]\n", + "rivanna_16_err = [0.1507025937, 0.3740365494, 0.1460753863, 1.080150049, 0.8721500223]\n", + "\n", + "# Create a line chart\n", + "plt.plot(world_size, ec2_4_26, marker='o', color='b', label='EC2 - 8 CPU/26 GB Memory')\n", + "plt.plot(world_size, ec2_16_28, marker='o', color='g', label='EC2 - 16 CPU/28 GB Memory')\n", + "plt.plot(world_size, fargate_4_26, marker='o', color='r', label='Fargate - 8 CPU/26 GB Memory')\n", + "plt.plot(world_size, fargate_16_28, marker='o', color='orange', label='Fargate - 16 CPU/28 GB Memory')\n", + "plt.plot(world_size, rivanna_8, marker='o', color='black', label='Rivanna - 8 CPU')\n", + "plt.plot(world_size, rivanna_16, marker='o', color='purple', label='Rivanna - 16 CPU')\n", + "\n", + "plt.errorbar(world_size, ec2_4_26, yerr=ec2_4_26_err, fmt='x', color='b', ecolor='b', capsize=5)\n", + "plt.errorbar(world_size, ec2_16_28, yerr=ec2_16_28_err, fmt='o', color='g', ecolor='g', capsize=5)\n", + "plt.errorbar(world_size, fargate_4_26, yerr=fargate_4_26_err, fmt='x', color='r', ecolor='r', capsize=5)\n", + "plt.errorbar(world_size, fargate_16_28, yerr=fargate_16_28_err, fmt='x', color='orange', ecolor='orange', capsize=5)\n", + "plt.errorbar(world_size, rivanna_8, yerr=rivanna_8_err, fmt='x', color='black', ecolor='black', capsize=5)\n", + "plt.errorbar(world_size, rivanna_16, yerr=rivanna_16_err, fmt='x', color='purple', ecolor='purple', capsize=5)\n", + "\n", + "custom_text = \"9.1m rows (1/2/4/8/16 Nodes)\"\n", + "plt.text(1, 48, custom_text, fontsize=10, color='blue', ha='center')\n", + "\n", + "plt.ylim(5, 50)\n", + "\n", + "plt.xticks(world_size)\n", + "\n", + "# Add labels and title\n", + "plt.xlabel('parallelism')\n", + "plt.ylabel('average time (s)')\n", + "plt.title('Weak Scaling of Join Operation')\n", + "\n", + "# Add a legend\n", + "plt.legend(loc=\"lower right\")\n", + "\n", + "plt.savefig('join-w-scaling.svg', format='svg')\n", + "\n", + "# Display the chart\n", + "plt.show()\n", + "\n" + ], + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 473 + }, + "id": "HvgUPka-uMRo", + "outputId": "7fd8d45a-823b-4360-c1f1-593e70d31515" + }, + "execution_count": 2, + "outputs": [ + { + "data": { + "text/plain": "
", + "image/png": "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" + }, + "metadata": {}, + "output_type": "display_data" + } + ] + }, + { + "cell_type": "code", + "source": [ + "import matplotlib.pyplot as plt\n", + "\n", + "\n", + "# Given data\n", + "infrastructure = ['EC2 Nano', 'EC2 Micro', 'Fargate .25 CPU', 'Fargate .5 CPU', 'Rivanna 1 Node']\n", + "server = [3.021825373, 2.598218739, 10.42936128, 5.220078409, 2.072015524\t\t]\n", + "server_err = [0.07005206974, 0.1331001051, 0.3293929105, 0.1551287397, 0.1036626711\t\t ]\n", + "\n", + "\n", + "fig = plt.subplots(figsize =(10, 7))\n", + "# Create a line chart\n", + "p1 = plt.bar(infrastructure, server_err, color='orange', label ='Error (Standard Deviation)')\n", + "p2 = plt.bar(infrastructure, server,color='blue',\n", + " bottom = server_err, label ='Join')\n", + "#plt.plot(world_size, ec2_16_28, marker='o', color='g', label='EC2 - 16 CPU/28 GB Memory')\n", + "\n", + "\n", + "\n", + "#plt.errorbar(world_size, ec2_4_26, yerr=ec2_4_26_err, fmt='x', color='b', ecolor='b', capsize=5)\n", + "#plt.errorbar(world_size, ec2_16_28, yerr=ec2_16_28_err, fmt='o', color='g', ecolor='g', capsize=5)\n", + "\n", + "\n", + "\n", + "custom_text = \"800000 rows\"\n", + "plt.text(1, 50, custom_text, fontsize=10, color='blue', ha='center')\n", + "\n", + "#plt.ylim(10, 625)\n", + "\n", + "#plt.xticks(infrastructure)\n", + "\n", + "# Add labels and title\n", + "plt.xlabel('Infrastructure')\n", + "plt.ylabel('average time (s)')\n", + "plt.title('Weak Scaling of Join Operation')\n", + "\n", + "# Add a legend\n", + "plt.legend()\n", + "\n", + "plt.savefig('join-w-scaling_inf.svg', format='svg')\n", + "\n", + "\n", + "\n", + "# Display the chart\n", + "plt.show()" + ], + "metadata": { + "id": "2vSanYys6E68" + }, + "execution_count": 20, + "outputs": [ + { + "data": { + "text/plain": "
", + "image/png": "iVBORw0KGgoAAAANSUhEUgAAA0oAAAmbCAYAAADJyC4pAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjcuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8pXeV/AAAACXBIWXMAAA9hAAAPYQGoP6dpAACRjElEQVR4nOzdebye853/8c9JZD9oSIWINbW1QmwlgiQlaGiUtlpVjTKtbhPtMF3MoFLbL6UzyigztVapqSVUW8uQKJ3QMGPsulhKJfYlFJHk+v1xP86J884iNEWb5/PxOA/u6/re1/W975y05+W67u9pa5qmKQAAADp1e7snAAAA8E4jlAAAAIJQAgAACEIJAAAgCCUAAIAglAAAAIJQAgAACEIJAAAgCCUAAIAglAAAAIJQgmXQnDlV//zPVeusU9WnT9W661ZNnFg1b978MU1T9a1vVQ0a1BozalTVXXd1Pc4rr1T9/d9XDRhQ1a9f1bhxVY880nXMM89U7bdf1Yortr7226/q2We7jvnDH6o+9KHWMQYMqJowoWr27K5j7rijauTI1lxWX70136ZZSm8IAEAQSrAM+n//r+q006pOOaXqnnuqJk2q+s53qk4+ef6YSZOqvvvd1pjp06tWXbVqzJiqWbPmj/nKV6ouvbTqxz+uuvHGqhdeqNp996q5c+eP+eQnq267rerKK1tft93WiqUOc+dW7bZb1Ysvto7x4x9XXXxx1SGHzB/z/POtcw8a1JrLySdXnXBCa35vxKuvvrHxAMAyrAGWObvt1jQHHNB12157Nc2nPtX693nzmmbVVZvm+OPn73/55aZZccWmOe201uNnn22aHj2a5sc/nj/mj39smm7dmubKK1uP7767aaqa5qab5o+ZNq217d57W49//vPWc/74x/ljLrigaXr1aprnnms9PvXU1rlffnn+mOOOa5pBg1pzXZgHHmid58ILm2bkyNbxzjyzaebObZqjjmqa1Vdvmp49m2bTTZvmF7/o+j58+cvzHx98cOs4d97Zevzqq03T3j7/Nf7kJ02z8cZN07t306y0UtPsuGPTvPDCwucEAPz1cEUJlkHbbVd17bVVv/lN6/H//V/ras7Ysa3HDzxQNXNm1c47z39Or16tW9/++79bj2+9tXWF5rVjBg2q2njj+WOmTWvdbrf11vPHbLNNa9trx2y8ceu5HXbZpXVb3623zh8zcmRrDq8d8+ijVQ8+uPjX+vWvt27lu+ee1nNOOqnqxBNbV6Ruv721bdy4qt/+tjV+1KiqqVPnP//661u3A15/fevx9OlVL79cNWJE1YwZVfvsU3XAAa3jT51atddebgkEgL8FQgmWQV//eusH/A03rOrRo2qzzVq30e2zT2v/zJmtfw4c2PV5AwfO3zdzZlXPnlX9+y9+zCqrLHj+VVbpOibP079/69iLG9PxuGPMonzlK614WWedVoydcELr9X/iE1UbbNC6DXHYsKp//dfW+I7PYj35ZOvzVXfd1TpGRzxNnVq1xRZV7e2tUJozp3X8tdeuGjq06otfbO0DAP66CSVYBl14YdV551Wdf37V//xP1TnntALinHO6jmtr6/q4aRbclnLMwsYvjTEdV21ebz5bbjn/359/vnUVasSIrmNGjGhdEapqXd1aeeXWFaQbbqjadNPWFaeOK0pTp7aublW19u24YyuQPvaxqv/4j1ZcAQB//YQSLIP+8R+rvvGN1lWVoUNbiyt89atVxx3X2r/qqq1/5tWaxx+ffyVn1VVbK9NlGOSYxx5b8PxPPNF1TJ7nmWdat/Utbszjj7f+mVeaUr9+C25bXAC2tVXtsEMriK6/vnWFaeONW4tO3HFH65bBUaNaY7t3r7rmmqpf/KLqve9tLTKxwQatWxcBgL9uQgmWQX/6U1W3+Nvfvfv85cHXWacVJ9dcM3//7NmtcNh229bjLbZo3bb32jEzZlTdeef8McOHVz33XNWvfz1/zM03t7a9dsydd7ae2+Hqq1ufR9pii/ljfvnLrkuGX31161a6tdde8te9wgqt59x4Y9ft//3fVRttNP9xx+eUpk5t/XtbW9X227euur30UtcrUm1trcdHHVX1v//bumXw0kuXfE4AwDvTcm/3BIC33oc+VHXMMVVrrln1vve1fsD/7ndbixJUtX74/8pXqo49tmq99Vpfxx5b1bdva7nvqtaCDAce2FrGe+WVq1ZaqerQQ1tXqHbaqTVmo42qdt216rOfrTr99Na2z32utYT4Bhu0Hu+8c+tqzH77tZYof/rp1nE++9lW2FS1znnUUVX771912GGthReOPbbqiCNe/9a79I//WHXkkVVDhrQ+m3TWWa0ly3/0o/ljRo2qOvjgquWWawVSx7ZDDqnafPP587r55taiGDvv3Prc1c03t66WvTa6AIC/TkIJlkEnn1x1+OGthQcef7x1leWgg1rh0eFrX2tdPfniF1u3wm29desqzvLLzx/zL//Siom9926N3XHHqrPPbl2d6vCjH7VWnetYHW/cuNbvZurQvXvVz37WOs+IEa1fKPvJT7au3nRYccXWlasvfan1maP+/av+4R9aX2/UhAmtzyodckjrtb/3vVWXX96KwQ4bb9xa6W6tteZH0ciRrdvvOj6fVNXa98tfthaCeP751vgTT6z64Aff+LwAgHeWtqaxkC0AAMBr+YwSAABAEEoAAABBKAEAAAShBAAAEIQSAABAEEoAAABBKAEAAAShBAAAEIQSAABAEEoAAABBKAEAAAShBAAAEIQSAABAEEoAAABBKAEAAAShBAAAEIQSAABAEEoAAABBKAEAAAShBAAAEIQSAABAEEoAAABBKAEAAAShBAAAEIQSAABAEEoAAABBKAEAAAShBAAAEIQSAABAEEoAAABBKAEAAAShBAAAEIQSAABAEEoAAABBKAEAAAShBAAAEIQSAABAEEoAAABBKAEAAAShBAAAEIQSAABAEEoAAABBKAEAAAShBAAAEIQSAABAEEoAAABBKAEAAAShBAAAEIQSAABAEEoAAABBKAEAAAShBAAAEIQSAABAEEoAAABBKAEAAAShBAAAEIQSAABAEEoAAABBKAEAAAShBAAAEIQSAABAEEoAAABBKAEAAAShBAAAEIQSAABAEEoAAABBKAEAAAShBAAAEIQSAABAEEoAAABBKAEAAAShBAAAEIQSAABAEEoAAABBKAEAAAShBAAAEIQSAABAEEoAAABBKAEAAAShBAAAEIQSAABAEEoAAABBKAEAAAShBAAAEIQSAABAEEoAAABBKAEAAAShBAAAEIQSAABAEEoAAABBKAEAAAShBAAAEIQSAABAEEoAAABBKAEAAAShBAAAEIQSAABAEEoAAABBKAEAAAShBAAAEIQSAABAEEoAAABBKAEAAAShBAAAEIQSAABAEEoAAABBKAEAAAShBAAAEIQSAABAEEoAAABBKAEAAAShBAAAEIQSAABAEEoAAABBKAEAAAShBAAAEIQSAABAEEoAAABBKAEAAAShBAAAEIQSAABAEEoAAABBKAEAAAShBAAAEIQSAABAEEoAAABBKAEAAAShBAAAEIQSAABAEEoAAABBKAEAAAShBAAAEIQSAABAEEoAAABBKAEAAAShBAAAEIQSAABAEEoAAABBKAEAAAShBAAAEIQSAABAEEoAAABBKAEAAAShBAAAEIQSAABAEEoAAABBKAEAAAShBAAAEIQSAABAEEoAAABBKAEAAAShBAAAEIQSAABAEEoAAABBKAEAAAShBAAAEIQSAABAEEoAAABBKAEAAAShBAAAEIQSAABAEEoAAABBKAEAAAShBAAAEIQSAABAEEoAAABBKAEAAAShBAAAEIQSAABAEEoAAABBKAEAAAShBAAAEIQSAABAEEoAAABBKAEAAAShBAAAEIQSAABAEEoAAABBKAEAAAShBAAAEIQSAABAEEoAAABBKAEAAAShBAAAEIQSAABAEEoAAABBKAEAAAShBAAAEIQSAABAEEoAAABBKAEAAAShBAAAEIQSAABAEEoAAABBKAEAAAShBAAAEIQSAABAEEoAAABBKAEAAAShBAAAEIQSAABAEEoAAABBKAEAAAShBAAAEIQSAABAEEoAAABBKAEAAAShBAAAEIQSAABAEEoAAABBKAEAAAShBAAAEIQSAABAEEoAAABBKAEAAAShBAAAEIQSAABAEEoAAABBKAEAAAShBAAAEIQSAABAEEoAAABBKAEAAAShBAAAEIQSAABAEEoAAABBKAEAAAShBAAAEIQSAABAEEoAAABBKAEAAAShBAAAEIQSAABAEEoAAABBKAEAAAShBAAAEIQSAABAEEoAAABBKAEAAAShBAAAEIQSAABAEEoAAABBKAEAAAShBAAAEIQSAABAEEoAAABBKAEAAAShBAAAEIQSAABAEEoAAABBKAEAAAShBAAAEIQSAABAEEoAAABBKAEAAAShBAAAEIQSAABAEEoAAABBKAEAAAShBAAAEIQSAABAEEoAAABBKAEAAAShBAAAEIQSAABAEEoAAABBKAEAAAShBAAAEIQSAABAEEoAAABBKAEAAAShBAAAEIQSAABAEEoAAABBKAEAAAShBAAAEIQSAABAEEoAAABBKAEAAAShBAAAEIQSAABAEEoAAABBKAEAAAShBAAAEIQSAABAEEoAAABBKAEAAAShBAAAEIQSAABAEEoAAABBKAEAAAShBAAAEIQSAABAEEoAAABBKAEAAAShBAAAEIQSAABAEEoAAABBKAEAAAShBAAAEIQSAABAEEoAAABBKAEAAAShBAAAEIQSAABAEEoAAABBKAEAAAShBAAAEIQSAABAEEoAAABBKAEAAAShBAAAEIQSAABAEEoAAABBKAEAAAShBAAAEIQSAABAEEoAAABBKAEAAAShBAAAEIQSAABAEEoAAABBKAEAAAShBAAAEIQSAABAEEoAAABBKAEAAAShBAAAEIQSAABAEEoAAABBKAEAAAShBAAAEIQSAABAEEoAAABBKAEAAAShBAAAEIQSAABAEEoAAABBKAEAAAShBAAAEIQSAABAEEoAAABBKAEAAAShBAAAEIQSAABAEEoAAABBKAEAAAShBAAAEIQSAABAEEoAAABBKAEAAAShBAAAEIQSAABAEEoAAABBKAEAAAShBAAAEIQSAABAEEoAAABBKAEAAAShBAAAEIQSAABAEEoAAABBKAEAAAShBAAAEIQSAABAEEoAAABBKAEAAAShBAAAEIQSAABAEEoAAABBKAEAAAShBAAAEIQSAABAEEoAAABBKAEAAAShBAAAEIQSAABAEEoAAABBKAEAAAShBAAAEIQSAABAEEoAAABBKAEAAAShBAAAEIQSAABAEEoAAABBKAEAAAShBAAAEIQSAABAEEoAAABBKAEAAAShBAAAEIQSAABAEEoAAABBKAEAAAShBAAAEIQSAABAEEoAAABBKAEAAAShBAAAEIQSAABAEEoAAABBKAEAAAShBAAAEIQSAABAEEoAAABBKAEAAAShBAAAEIQSAABAEEoAAABBKAEAAAShBAAAEIQSAABAEEoAAABBKAEAAAShBAAAEIQSAABAEEoAAABBKAEAAAShBAAAEIQSAABAEEoAAABBKAEAAAShBAAAEIQSAABAEEoAAABBKAEAAAShBAAAEIQSAABAEEoAAABBKAEAAAShBAAAEIQSAABAEEoAAABBKAEAAAShBAAAEIQSAABAEEoAAABBKAEAAAShBAAAEIQSAABAEEoAAABBKAEAAAShBAAAEIQSAABAEEoAAABBKAEAAAShBAAAEIQSAABAEEoAAABBKAEAAAShBAAAEIQSAABAEEoAAABBKAEAAAShBAAAEIQSAABAEEoAAABBKAEAAAShBAAAEIQSAABAEEoAAABBKAEAAAShBAAAEIQSAABAEEoAAABBKAEAAAShBAAAEIQSAABAEEoAAABBKAEAAAShBAAAEIQSAABAEEoAAABBKAEAAAShBAAAEIQSAABAEEoAAABBKAEAAAShBAAAEIQSAABAEEoAAABBKAEAAAShBAAAEIQSAABAEEoAAABBKAEAAAShBAAAEIQSAABAEEoAAABBKAEAAAShBAAAEIQSAABAEEoAAABBKAEAAAShBAAAEIQSAABAEEoAAABBKAEAAAShBAAAEIQSAABAEEoAAABBKAEAAAShBAAAEIQSAABAEEoAAABBKAEAAAShBAAAEIQSAABAEEoAAABBKAEAAAShBAAAEIQSAABAEEoAAABBKAEAAAShBAAAEIQSAABAEEoAAABBKAEAAAShBAAAEIQSAABAEEoAAABBKAEAAAShBAAAEIQSAABAEEoAAABBKAEAAAShBAAAEIQSAABAEEoAAABBKAEAAAShBAAAEIQSAABAEEoAAABBKAEAAAShBAAAEIQSAABAEEoAAABBKAEAAAShBAAAEIQSAABAEEoAAABBKAEAAAShBAAAEIQSAABAEEoAAABBKAEAAAShBAAAEIQSAABAEEoAAABBKAEAAAShBAAAEIQSAABAEEoAAABBKAEAAAShBAAAEIQSAABAEEoAAABBKAEAAAShBAAAEIQSAABAEEoAAABBKAEAAAShBAAAEIQSAABAEEoAAABBKAEAAAShBAAAEIQSAABAEEoAAABBKAEAAAShBAAAEIQSAABAEEoAAABBKAEAAAShBAAAEIQSAABAEEoAAABBKAEAAAShBAAAEIQSAABAEEoAAABBKAEAAAShBAAAEIQSAABAEEoAAABBKAEAAAShBAAAEIQSAABAEEoAAABBKAEAAAShBAAAEIQSAABAEEoAAABBKAEAAAShBAAAEIQSAABAEEoAAABBKAEAAAShBAAAEIQSAABAEEoAAABBKAEAAAShBAAAEIQSAABAEEoAAABBKAEAAAShBAAAEIQSAABAEEoAAABBKAEAAAShBAAAEIQSAABAEEoAAABBKAEAAAShBAAAEIQSAABAEEoAAABBKAEAAAShBAAAEIQSAABAEEoAAABBKAEAAAShBAAAEIQSAABAEEoAAABBKAEAAAShBAAAEIQSAABAEEoAAABBKAEAAAShBAAAEIQSAABAEEoAAABBKAEAAAShBAAAEIQSAABAEEoAAABBKAEAAAShBAAAEIQSAABAEEoAAABBKAEAAAShBAAAEIQSAABAEEoAAABBKAEAAAShBAAAEIQSAABAEEoAAABBKAEAAAShBAAAEIQSAABAEEoAAABBKAEAAAShBAAAEIQSAABAEEoAAABBKAEAAAShBAAAEIQSAABAEEoAAABBKAEAAAShBAAAEIQSAABAEEoAAABBKAEAAAShBAAAEIQSAABAEEoAAABBKAEAAAShBAAAEIQSAABAEEoAAABBKAEAAAShBAAAEIQSAABAEEoAAABBKAEAAAShBAAAEIQSAABAEEoAAABBKAEAAAShBAAAEIQSAABAEEoAAABBKAEAAAShBAAAEIQSAABAEEoAAABBKAEAAAShBAAAEIQSAABAEEoAAABBKAEAAAShBAAAEIQSAABAEEoAAABBKAEAAAShBAAAEIQSAABAEEoAAABBKAEAAAShBAAAEIQSAABAEEoAAABBKAEAAAShBAAAEIQSAABAEEoAAABBKAEAAAShBAAAEIQSAABAEEoAAABBKAEAAAShBAAAEIQSAABAEEoAAABBKAEAAAShBAAAEIQSAABAEEoAAABBKAEAAAShBAAAEIQSAABAEEoAAABBKAEAAAShBAAAEIQSAABAEEoAAABBKAEAAAShBAAAEIQSAABAEEoAAABBKAEAAAShBAAAEIQSAABAEEoAAABBKAEAAAShBAAAEIQSAABAEEoAAABBKAEAAAShBAAAEIQSAABAEEoAAABBKAEAAAShBAAAEIQSAABAEEoAAABBKAEAAAShBAAAEIQSAABAEEoAAABBKAEAAAShBAAAEIQSAABAEEoAAABBKAEAAAShBAAAEIQSAABAEEoAAABBKAEAAAShBAAAEIQSAABAEEoAAABBKAEAAAShBAAAEIQSAABAEEoAAABBKAEAAAShBAAAEIQSAABAEEoAAABBKAEAAAShBAAAEIQSAABAEEoAAABBKAEAAAShBAAAEIQSAABAEEoAAABBKAEAAAShBAAAEIQSAABAEEoAAABBKAEAAAShBAAAEIQSAABAEEoAAABBKAEAAAShBAAAEIQSAABAEEoAAABBKAEAAAShBAAAEIQSAABAEEoAAABBKAEAAAShBAAAEIQSAABAEEoAAABBKAEAAAShBAAAEIQSAABAEEoAAABBKAEAAAShBAAAEIQSAABAEEoAAABBKAEAAAShBAAAEIQSAABAEEoAAABBKAEAAAShBAAAEIQSAABAEEoAAABBKAEAAAShBAAAEIQSAABAEEoAAABBKAEAAAShBAAAEIQSAABAEEoAAABBKAEAAAShBAAAEIQSAABAEEoAAABBKAEAAAShBAAAEIQSAABAEEoAAABBKAEAAAShBAAAEIQSAABAEEoAAABBKAEAAAShBAAAEIQSAABAEEoAAABBKAEAAAShBAAAEIQSAABAEEoAAABBKAEAAAShBAAAEIQSAABAEEoAAABBKAEAAAShBAAAEIQSAABAEEoAAABBKAEAAAShBAAAEIQSAABAEEoAAABBKAEAAAShBAAAEIQSAABAEEoAAABBKAEAAAShBAAAEIQSAABAEEoAAABBKAEAAAShBAAAEIQSAABAEEoAAABBKAEAAAShBAAAEIQSAABAEEoAAABBKAEAAAShBAAAEIQSAABAEEoAAABBKAEAAAShBAAAEIQSAABAEEoAAABBKAEAAAShBAAAEIQSAABAEEoAAABBKAEAAAShBAAAEIQSAABAEEoAAABBKAEAAAShBAAAEIQSAABAEEoAAABBKAEAAAShBAAAEIQSAABAEEoAAABBKAEAAAShBAAAEIQSAABAEEoAAABBKAEAAAShBAAAEIQSAABAEEoAAABBKAEAAAShBAAAEIQSAABAEEoAAABBKAEAAAShBAAAEIQSAABAEEoAAABBKAEAAAShBAAAEIQSAABAEEoAAABBKAEAAAShBAAAEIQSAABAEEoAAABBKAEAAAShBAAAEIQSAABAEEoAAABBKAEAAAShBAAAEIQSAABAEEoAAABBKAEAAAShBAAAEIQSAABAEEoAAABBKAEAAAShBAAAEIQSAABAEEoAAABBKAEAAAShBAAAEIQSAABAEEoAAABBKAEAAAShBAAAEIQSAABAEEoAAABBKAEAAAShBAAAEIQSAABAEEoAAABBKAEAAAShBAAAEIQSAABAEEoAAABBKAEAAAShBAAAEIQSAABAEEoAAABBKAEAAAShBAAAEIQSAABAEEoAAABBKAEAAAShBAAAEIQSAABAEEoAAABBKAEAAAShBAAAEIQSAABAEEoAAABBKAEAAAShBAAAEIQSAABAEEoAAABBKAEAAAShBAAAEIQSAABAEEoAAABBKAEAAAShBAAAEIQSAABAEEoAAABBKAEAAAShBAAAEIQSAABAEEoAAABBKAEAAAShBAAAEIQSAABAEEoAAABBKAEAAAShBAAAEIQSAABAEEoAAABBKAEAAAShBAAAEIQSAABAEEoAAABBKAEAAAShBAAAEIQSAABAEEoAAABBKAEAAAShBAAAEIQSAABAEEoAAABBKAEAAAShBAAAEIQSAABAEEoAAABBKAEAAAShBAAAEIQSAABAEEoAAABBKAEAAAShBAAAEIQSAABAEEoAAABBKAEAAAShBAAAEIQSAABAEEoAAABBKAEAAAShBAAAEIQSAABAEEoAAABBKAEAAAShBAAAEIQSAABAEEoAAABBKAEAAAShBAAAEIQSAABAEEoAAABBKAEAAAShBAAAEIQSAABAEEoAAABBKAEAAAShBAAAEIQSAABAEEoAAABBKAEAAAShBAAAEIQSAABAEEoAAABBKAEAAAShBAAAEIQSAABAEEoAAABBKAEAAAShBAAAEIQSAABAEEoAAABBKAEAAAShBAAAEIQSAABAEEoAAABBKAEAAAShBAAAEIQSAABAEEoAAABBKAEAAAShBAAAEIQSAABAEEoAAABBKAEAAAShBAAAEIQSAABAEEoAAABBKAEAAAShBAAAEIQSAABAEEoAAABBKAEAAAShBAAAEIQSAABAEEoAAABBKAEAAAShBAAAEIQSAABAEEoAAABBKAEAAAShBAAAEIQSAABAEEoAAABBKAEAAAShBAAAEIQSAABAEEoAAABBKAEAAAShBAAAEIQSAABAEEoAAABBKAEAAAShBAAAEIQSAABAEEoAAABBKAEAAAShBAAAEIQSAABAEEoAAABBKAEAAAShBAAAEIQSAABAEEoAAABBKAEAAAShBAAAEIQSAABAEEoAAABBKAEAAAShBAAAEIQSAABAEEoAAABBKAEAAAShBAAAEIQSAABAEEoAAABBKAEAAAShBAAAEIQSAABAEEoAAABBKAEAAAShBAAAEIQSAABAEEoAAABBKAEAAAShBAAAEIQSAABAEEoAAABBKAEAAAShBAAAEIQSAABAEEoAAABBKAEAAAShBAAAEIQSAABAEEoAAABBKAEAAAShBAAAEIQSAABAEEoAAABBKAEAAAShBAAAEIQSAABAEEoAAABBKAEAAAShBAAAEIQSAABAEEoAAABBKAEAAAShBAAAEIQSAABAEEoAAABBKAEAAAShBAAAEIQSAABAEEoAAABBKAEAAAShBAAAEIQSAABAEEoAAABBKAEAAAShBAAAEIQSAABAEEoAAABBKAEAAAShBAAAEIQSAABAEEoAAABBKAEAAAShBAAAEIQSAABAEEoAAABBKAEAAAShBAAAEIQSAABAEEoAAABBKAEAAAShBAAAEIQSAABAEEoAAABBKAEAAAShBAAAEIQSAABAEEoAAABBKAEAAAShBAAAEIQSAABAEEoAAABBKAEAAAShBAAAEIQSAABAEEoAAABBKAEAAAShBAAAEIQSAABAEEoAAABBKAEAAAShBAAAEIQSAABAEEoAAABBKAEAAAShBAAAEIQSAABAEEoAAABBKAEAAAShBAAAEIQSAABAEEoAAABBKAEAAAShBAAAEIQSAABAEEoAAABBKAEAAAShBAAAEIQSAABAEEoAAABBKAEAAAShBAAAEIQSAABAEEoAAABBKAEAAAShBAAAEIQSAABAEEoAAABBKAEAAAShBAAAEIQSAABAEEoAAABBKAEAAAShBAAAEIQSAABAEEoAAABBKAEAAAShBAAAEIQSAABAEEoAAABBKAEAAAShBAAAEIQSAABAEEoAAABBKAEAAAShBAAAEIQSAABAEEoAAABBKAEAAAShBAAAEIQSAABAEEoAAABBKAEAAAShBAAAEIQSAABAEEoAAABBKAEAAAShBAAAEIQSAABAEEoAAABBKAEAAAShBAAAEIQSAABAEEoAAABBKAEAAAShBAAAEIQSAABAEEoAAABBKAEAAAShBAAAEIQSAABAEEoAAABBKAEAAAShBAAAEIQSAABAEEoAAABBKAEAAAShBAAAEIQSAABAEEoAAABBKAEAAAShBAAAEIQSAABAEEoAAABBKAEAAAShBAAAEIQSAABAEEoAAABBKAEAAAShBAAAEIQSAABAEEoAAABBKAEAAAShBAAAEIQSAABAEEoAAABBKAEAAAShBAAAEIQSAABAEEoAAABBKAEAAAShBAAAEIQSAABAEEoAAABBKAEAAAShBAAAEIQSAABAEEoAAABBKAEAAAShBAAAEIQSAABAEEoAAABBKAEAAAShBAAAEIQSAABAEEoAAABBKAEAAAShBAAAEIQSAABAEEoAAABBKAEAAAShBAAAEIQSAABAEEoAAABBKAEAAAShBAAAEIQSAABAEEoAAABBKAEAAAShBAAAEIQSAABAEEoAAABBKAEAAAShBAAAEIQSAABAEEoAAABBKAEAAAShBAAAEIQSAABAEEoAAABBKAEAAAShBAAAEIQSAABAEEoAAABBKAEAAAShBAAAEIQSAABAEEoAAABBKAEAAAShBAAAEIQSAABAEEoAAABBKAEAAAShBAAAEIQSAABAEEoAAABBKAEAAAShBAAAEIQSAABAEEoAAABBKAEAAAShBAAAEIQSAABAEEoAAABBKAEAAAShBAAAEIQSAABAEEoAAABBKAEAAAShBAAAEIQSAABAEEoAAABBKAEAAAShBAAAEIQSAABAEEoAAABBKAEAAAShBAAAEIQSAABAEEoAAABBKAEAAAShBAAAEIQSAABAEEoAAABBKAEAAAShBAAAEIQSAABAEEoAAABBKAEAAAShBAAAEIQSAABAEEoAAABBKAEAAAShBAAAEIQSAABAEEoAAABBKAEAAAShBAAAEIQSAABAEEoAAABBKAEAAAShBAAAEIQSAABAEEoAAABBKAEAAAShBAAAEIQSAABAEEoAAABBKAEAAAShBAAAEIQSAABAEEoAAABBKAEAAAShBAAAEIQSAABAEEoAAABBKAEAAAShBAAAEIQSAABAEEoAAABBKAEAAAShBAAAEIQSAABAEEoAAABBKAEAAAShBAAAEIQSAABAEEoAAABBKAEAAAShBAAAEIQSAABAEEoAAABBKAEAAAShBAAAEIQSAABAEEoAAABBKAEAAAShBAAAEIQSAABAEEoAAABBKAEAAAShBAAAEIQSAABAEEoAAABBKAEAAAShBAAAEIQSAABAEEoAAABBKAEAAAShBAAAEIQSAABAEEoAAABBKAEAAAShBAAAEIQSAABAEEoAAABBKAEAAAShBAAAEIQSAABAEEoAAABBKAEAAAShBAAAEIQSAABAEEoAAABBKAEAAAShBAAAEIQSAABAEEoAAABBKAEAAAShBAAAEIQSAABAEEoAAABBKAEAAAShBAAAEIQSAABAEEoAAABBKAEAAAShBAAAEIQSAABAEEoAAABBKAEAAAShBAAAEIQSAABAEEoAAABBKAEAAAShBAAAEIQSAABAEEoAAABBKAEAAAShBAAAEIQSAABAEEoAAABBKAEAAAShBAAAEIQSAABAEEoAAABBKAEAAAShBAAAEIQSAABAEEoAAABBKAEAAAShBAAAEIQSAABAEEoAAABBKAEAAAShBAAAEIQSAABAEEoAAABBKAEAAAShBAAAEIQSAABAEEoAAABBKAEAAAShBAAAEIQSAABAEEoAAABBKAEAAAShBAAAEIQSAABAEEoAAABBKAEAAAShBAAAEIQSAABAEEoAAABBKAEAAAShBAAAEIQSAABAEEoAAABBKAEAAAShBAAAEIQSAABAEEoAAABBKAEAAAShBAAAEIQSAABAEEoAAABBKAEAAAShBAAAEIQSAABAEEoAAABBKAEAAAShBAAAEIQSAABAEEoAAABBKAEAAAShBAAAEIQSAABAEEoAAABBKAEAAAShBAAAEIQSAABAEEoAAABBKAEAAAShBAAAEIQSAABAEEoAAABBKAEAAAShBAAAEIQSAABAEEoAAABBKAEAAAShBAAAEIQSAABAEEoAAABBKAEAAAShBAAAEIQSAABAEEoAAABBKAEAAAShBAAAEIQSAABAEEoAAABBKAEAAAShBAAAEIQSAABAEEoAAABBKAEAAAShBAAAEIQSAABAEEoAAABBKAEAAAShBAAAEIQSAABAEEoAAABBKAEAAAShBAAAEIQSAABAEEoAAABBKAEAAAShBAAAEIQSAABAEEoAAABBKAEAAAShBAAAEIQSAABAEEoAAABBKAEAAAShBAAAEIQSAABAEEoAAABBKAEAAAShBAAAEIQSAABAEEoAAABBKAEAAAShBAAAEIQSAABAEEoAAABBKAEAAAShBAAAEIQSAABAEEoAAABBKAEAAAShBAAAEIQSAABAEEoAAABBKAEAAAShBAAAEIQSAABAEEoAAABBKAEAAAShBAAAEIQSAABAEEoAAABBKAEAAAShBAAAEIQSAABAEEoAAABBKAEAAAShBAAAEIQSAABAEEoAAABBKAEAAAShBAAAEIQSAABAEEoAAABBKAEAAAShBAAAEIQSAABAEEoAAABBKAEAAAShBAAAEIQSAABAEEoAAABBKAEAAAShBAAAEIQSAABAEEoAAABBKAEAAAShBAAAEIQSAABAEEoAAABBKAEAAAShBAAAEIQSAABAEEoAAABBKAEAAAShBAAAEIQSAABAEEoAAABBKAEAAAShBAAAEIQSAABAEEoAAABBKAEAAAShBAAAEIQSAABAEEoAAABBKAEAAAShBAAAEIQSAABAEEoAAABBKAEAAAShBAAAEIQSAABAEEoAAABBKAEAAAShBAAAEIQSAABAEEoAAABBKAEAAAShBAAAEIQSAABAEEoAAABBKAEAAAShBAAAEIQSAABAEEoAAABBKAEAAAShBAAAEIQSAABAEEoAAABBKAEAAAShBAAAEIQSAABAEEoAAABBKAEAAAShBAAAEIQSAABAEEoAAABBKAEAAAShBAAAEIQSAABAEEoAAABBKAEAAAShBAAAEIQSAABAEEoAAABBKAEAAAShBAAAEIQSAABAEEoAAABBKAEAAAShBAAAEIQSAABAEEoAAABBKAEAAAShBAAAEIQSAABAEEoAAABBKAEAAAShBAAAEIQSAABAEEoAAABBKAEAAAShBAAAEIQSAABAEEoAAABBKAEAAAShBAAAEIQSAABAEEoAAABBKAEAAAShBAAAEIQSAABAEEoAAABBKAEAAAShBAAAEIQSAABAEEoAAABBKAEAAAShBAAAEIQSAABAEEoAAABBKAEAAAShBAAAEIQSAABAEEoAAABBKAEAAAShBAAAEIQSAABAEEoAAABBKAEAAAShBAAAEIQSAABAEEoAAABBKAEAAAShBAAAEIQSAABAEEoAAABBKAEAAAShBAAAEIQSAABAEEoAAABBKAEAAAShBAAAEIQSAABAEEoAAABBKAEAAAShBAAAEIQSAABAEEoAAABBKAEAAAShBAAAEIQSAABAEEoAAABBKAEAAAShBAAAEIQSAABAEEoAAABBKAEAAAShBAAAEIQSAABAEEoAAABBKAEAAAShBAAAEIQSAABAEEoAAABBKAEAAAShBAAAEIQSAABAEEoAAABBKAEAAAShBAAAEIQSAABAEEoAAABBKAEAAAShBAAAEIQSAABAEEoAAABBKAEAAAShBAAAEIQSAABAEEoAAABBKAEAAAShBAAAEIQSAABAEEoAAABBKAEAAAShBAAAEIQSAABAEEoAAABBKAEAAAShBAAAEIQSAABAEEoAAABBKAEAAAShBAAAEIQSAABAEEoAAABBKAEAAAShBAAAEIQSAABAEEoAAABBKAEAAAShBAAAEIQSAABAEErAMuOiiy6qtra2uvDCCxfYt+mmm1ZbW1tdddVVC+wbMmRIbb755n+ROX3rW9+qtra2evLJJ9/U82+++ebac889a80116xevXrVwIEDa/jw4XXIIYcs5ZnOd/bZZ1dbW1s9+OCDndv233//Wnvttf9i51xaTj755HrPe95TPXv2rLa2tnr22WcXOq7jNd5yyy1v+BwLe3+WhhdffLGOP/742myzzaq9vb369etXw4YNq2OPPbZefPHFpXquv6Rjjz22Jk+evMD2qVOnVltbW02dOvUtnxPAwgglYJkxatSoamtrqylTpnTZ/vTTT9cdd9xR/fr1W2DfI488Uvfff3+NHj36rZzqEvnZz35W2267bT3//PM1adKkuvrqq+ukk06qESNGLDQG/5IOP/zwuvTSS9/Sc75Rt912W02YMKFGjx5d1113XU2bNq2WX375pX6e3XbbraZNm1arrbbaUjvmY489Vttss01NnDixdtlll7r00ktr8uTJ9cEPfrCOPvro2mabbeqxxx5bauf7S1pUKG2++eY1bdq0v9h/lAB4o5Z7uycA8FYZMGBAbbzxxgv8F+vrr7++lltuuTrwwAMXCKWOx+/EUJo0aVKts846ddVVV9Vyy83/n/NPfOITNWnSpLd0LkOGDHlLz/dm3HXXXVVV9dnPfrbe//73/8XO8+53v7ve/e53L9VjfvrTn6577723pkyZUtttt13n9jFjxtRuu+1Wo0ePrvHjx9eVV165VM/7eubOnVtz5sypXr16/dnHWmGFFWqbbbZZCrMCWDpcUQKWKaNHj6777ruvZsyY0blt6tSptdVWW9XYsWPr1ltvrVmzZnXZ171799p+++2rqqppmjr11FNr2LBh1adPn+rfv3999KMfrfvvv7/Lea655praY489avDgwdW7d+96z3veUwcddNAS3WJ377331rrrrltbb711Pf7444sc99RTT9WAAQO6RFKHbt0W/J/3888/v4YPH17t7e3V3t5ew4YNqzPOOGOpzHlht961tbXVl7/85frhD39YG220UfXt27c23XTTuuKKKxZ4/mWXXVabbLJJ9erVq9Zdd9066aSTOm9LXBJnnnlmbbrpptW7d+9aaaWVas8996x77rmnc/+oUaPqU5/6VFVVbb311tXW1lb777//Eh37tS6//PIaPnx49e3bt5ZffvkaM2ZMTZs2rcuYhd16N2rUqNp4441r+vTptf3221ffvn1r3XXXreOPP77mzZu32HPecsstdfXVV9eBBx7YJZI6bLfddnXAAQfUVVddVbfeemvn9o73//TTT6/111+/evXqVe9973vrxz/+8QLHmDlzZh100EE1ePDg6tmzZ62zzjp11FFH1Zw5czrHPPjgg9XW1laTJk2qo48+utZZZ53q1atXTZkypV5++eU65JBDatiwYbXiiivWSiutVMOHD6/LLrusy3na2trqxRdfrHPOOafa2tqqra2tRo0aVVWLvvVuSd7zju+Vu+66q/bZZ59accUVa+DAgXXAAQfUc889t9j3F2BRhBKwTOm4MvTaH8amTJlSI0eOrBEjRlRbW1vdcMMNXfZtvvnmteKKK1ZV1UEHHVRf+cpXaqeddqrJkyfXqaeeWnfddVdtu+22XW59+v3vf1/Dhw+v73//+3X11VfXEUccUTfffHNtt9129eqrry5yftdff31tu+22tckmm9SUKVNqlVVWWeTY4cOH180331wTJkyom2++ebHHPeKII2rfffetQYMG1dlnn12XXnppjR8/vh566KE/e86L87Of/axOOeWUmjhxYl188cWdEfPasLzyyitrr732qpVXXrkuvPDCmjRpUl1wwQV1zjnnLNE5jjvuuDrwwAPrfe97X11yySV10kkn1e23317Dhw+v3/72t1VVdeqpp9Y///M/V1XVWWedVdOmTavDDz/8Db2W888/v/bYY49aYYUV6oILLqgzzjijnnnmmRo1alTdeOONr/v8mTNn1r777luf+tSn6vLLL68PfvCD9c1vfrPOO++8xT7vmmuuqaqqD3/4w4sc07GvY2yHyy+/vL73ve/VxIkT66KLLqq11lqr9tlnn7rooou6zOv9739/XXXVVXXEEUfUL37xizrwwAPruOOOq89+9rMLnOt73/teXXfddXXCCSfUL37xi9pwww3rlVdeqaeffroOPfTQmjx5cl1wwQW13Xbb1V577VXnnntu53OnTZtWffr0qbFjx9a0adNq2rRpdeqppy7ydb3R9/wjH/lIrb/++nXxxRfXN77xjTr//PPrq1/96iKPD7BYDcAy5Omnn266devWfO5zn2uapmmefPLJpq2trbnyyiubpmma97///c2hhx7aNE3T/OEPf2iqqvna177WNE3TTJs2ramq5sQTT+xyzIcffrjp06dP57g0b9685tVXX20eeuihpqqayy67rHPfkUce2VRV88QTTzQ//OEPm549ezYTJkxo5s6d+7qv5cknn2y22267pqqaqmp69OjRbLvtts1xxx3XzJo1q3Pc/fff33Tv3r3Zd999l/h9WtyczzrrrKaqmgceeKBz2/jx45u11lqryzGqqhk4cGDz/PPPd26bOXNm061bt+a4447r3LbVVls1a6yxRvPKK690bps1a1az8sorN6/3f1PPPPNM06dPn2bs2LFdtv/hD39oevXq1Xzyk59cYN7Tp09/3defY+fOndsMGjSoGTp0aJc/m1mzZjWrrLJKs+222y7w3Ne+PyNHjmyqqrn55pu7nOe9731vs8suuyx2Lp///OebqmruvffeRY655557mqpqvvCFL3Ruq6qmT58+zcyZMzu3zZkzp9lwww2b97znPZ3bDjrooKa9vb156KGHuhzzhBNOaKqqueuuu5qmaZoHHnigqapmyJAhzezZsxc75zlz5jSvvvpqc+CBBzabbbZZl339+vVrxo8fv8BzpkyZ0lRVM2XKlKZp3th73vH3aNKkSV2O+cUvfrHp3bt3M2/evMXOF2BhXFEClin9+/evTTfdtPOK0vXXX1/du3evESNGVFXVyJEjOz+XlJ9PuuKKK6qtra0+9alP1Zw5czq/Vl111S7HrKp6/PHH6/Of/3ytscYatdxyy1WPHj1qrbXWqqrqcktYh2OOOab233//Ov744+ukk05a6K1zaeWVV64bbrihpk+fXscff3ztscce9Zvf/Ka++c1v1tChQztvmbvmmmtq7ty59aUvfWmxx3ujc14So0eP7rJgwsCBA2uVVVbpvJL14osv1i233FIf/vCHq2fPnp3j2tvb60Mf+tDrHn/atGn10ksvLXAb3RprrFEf+MAH6tprr31T80733XdfPfroo7Xffvt1+bNpb2+vj3zkI3XTTTfVn/70p8UeY9VVV13gs1GbbLJJl6t6b1bTNFVVC9yquOOOO9bAgQM7H3fv3r0+/vGP1+9+97t65JFHqqr1fT169OgaNGhQl+/rD37wg1XV+jvyWuPGjasePXosMIef/OQnNWLEiGpvb+/8/jnjjDPe9PfOm3nPx40b1+XxJptsUi+//PJib2EFWBShBCxzRo8eXb/5zW/q0UcfrSlTptQWW2xR7e3tVdUKpf/93/+t5557rqZMmVLLLbdc5+dCHnvssWqapgYOHFg9evTo8nXTTTd1hsm8efNq5513rksuuaS+9rWv1bXXXlu//vWv66abbqqqqpdeemmBOZ133nm1+uqr1yc+8Yk3/Hq23HLL+vrXv14/+clP6tFHH62vfvWr9eCDD3Yu6PDEE09UVdXgwYMXeYw3M+clsfLKKy+wrVevXp3He+aZZzrf07Swbempp56qqlroCnODBg3q3P/ner3zzJs3r5555pnFHuP13otFWXPNNauq6oEHHljkmI7PQ62xxhpdtq+66qoLjO3Y1vGaHnvssfrpT3+6wPf0+973vqqqBT6jtrD34JJLLqm99967Vl999TrvvPNq2rRpNX369DrggAPq5ZdfXuzrW5Q3857ne9yxyMSb/f4Flm1WvQOWOaNHj67vfve7NXXq1Jo6dWqNHTu2c19HFP3yl7/sXOShI6IGDBjQ+Rmmha3y1bHtzjvvrP/7v/+rs88+u8aPH9+5/3e/+90i53TllVfWxz/+8dp+++3r2muv7byS80b16NGjjjzyyPqXf/mXuvPOO6uqOldge+SRRxb4QbrDm5nz0tC/f/9qa2tb6NLWM2fOfN3nd/xg/NrFOTo8+uijNWDAgD9/kktwnm7dulX//v2XyrnSmDFj6rDDDqvJkyfXrrvuutAxHcttjxkzpsv2hb2HHds6XtOAAQNqk002qWOOOWahxx40aFCXxwtbYOO8886rddZZpy688MIu+1955ZVFvKrX93a+5wBVrigBy6AddtihunfvXhdddFHdddddnatuVVWtuOKKNWzYsDrnnHPqwQcf7LIs+O67715N09Qf//jH2nLLLRf4Gjp0aFXN/0EyY+r0009f5JzWWmutzgDbfvvtOxchWJyF/QBZNf82uY4fcHfeeefq3r17ff/731/ksd7MnJeGfv361ZZbblmTJ0+u2bNnd25/4YUXFro6Xho+fHj16dNngQURHnnkkbruuutqxx13XCrz3GCDDWr11Vev888/v/M2t6rWrYMXX3xx56psfwlbbrll7bzzznXGGWfUr371qwX233jjjXXmmWfWrrvuWltssUWXfddee22XCJ07d25deOGFNWTIkM4rjLvvvnvdeeedNWTIkIV+X2coLUxbW1vnL/HtMHPmzAVWvatasqtoVW/vew5Q5YoSsAxaYYUVavPNN6/JkydXt27dOj+f1GHkyJH1r//6r1XV9fcnjRgxoj73uc/VZz7zmbrllltqhx12qH79+tWMGTPqxhtvrKFDh9YXvvCF2nDDDWvIkCH1jW98o5qmqZVWWql++tOfLrAiWVpttdXq+uuvr1122aV22GGHuuaaa2rjjTde5PhddtmlBg8eXB/60Idqww03rHnz5tVtt91WJ554YrW3t9fBBx9cVVVrr712HXbYYfXtb3+7Xnrppc7lk+++++568skn66ijjnrTc14aJk6cWLvttlvtsssudfDBB9fcuXPrO9/5TrW3t9fTTz+92Oe+613vqsMPP7wOO+yw+vSnP1377LNPPfXUU3XUUUdV796968gjj/yz5tbxg3+3bt1q0qRJte+++9buu+9eBx10UL3yyiv1ne98p5599tk6/vjj/6zzvJ5zzz23dtppp9p5551rwoQJnQF43XXX1UknnVQbbrhhnX322Qs8b8CAAfWBD3ygDj/88OrXr1+deuqpde+993ZZInzixIl1zTXX1LbbblsTJkyoDTbYoF5++eV68MEH6+c//3mddtppi71ts6oVW5dcckl98YtfrI9+9KP18MMP17e//e1abbXVFoj+oUOH1tSpU+unP/1prbbaarX88svXBhtssMAx3+73HMCqd8Ay6Wtf+1pTVc2WW265wL7Jkyc3VdX07NmzefHFFxfYf+aZZzZbb711069fv6ZPnz7NkCFDmk9/+tPNLbfc0jnm7rvvbsaMGdMsv/zyTf/+/ZuPfexjnavoHXnkkZ3jXrvqXYdnn322GTFiRLPSSistdoW2Cy+8sPnkJz/ZrLfeek17e3vTo0ePZs0112z222+/5u67715g/LnnnttstdVWTe/evZv29vZms802a84666w3POc3surdl770pQXmsdZaay2w6tmll17aDB06tOnZs2ez5pprNscff3wzYcKEpn///ot8/a/1gx/8oNlkk02anj17NiuuuGKzxx57dK7WlvNeklXv/u3f/q2pquaOO+7osn3y5MnN1ltv3fTu3bvp169fs+OOOza/+tWvFnqeXPXufe973wLnWdj7tigvvPBCc+yxxzbDhg1r+vbt2/Tt27fZZJNNmqOPPrp54YUXFhjf8f6feuqpzZAhQ5oePXo0G264YfOjH/1ogbFPPPFEM2HChGadddZpevTo0ay00krNFlts0fzTP/1T57E7Vr37zne+s9D5HX/88c3aa6/d9OrVq9loo42a//iP/+j8/n6t2267rRkxYkTTt2/fpqqakSNHNk2z4Kp3HZbkPV/Y36OmWfifBcCSamua11zPBoB3gFdffbWGDRtWq6++el199dVv+fkPPvjgOuWUU+rZZ5/tsmrfX5O2trb60pe+VKeccsrbPRWAv0puvQPgbXfggQfWmDFjarXVVquZM2fWaaedVvfcc0+ddNJJb+k8br311po+fXqdeeaZNW7cuL/aSALgzyeUAHjbzZo1qw499NB64oknqkePHrX55pvXz3/+89ppp53e0nl89KMfreeee67GjRtX3/ve997ScwPwzuLWOwAAgGB5cAAAgCCUAAAAglACAAAIf/OLOcybN68effTRWn755bv8xnAAAGDZ0jRNzZo1qwYNGlTdui3+mtHffCg9+uijtcYaa7zd0wAAAN4hHn744Ro8ePBix/zNh1LH78B4+OGHa4UVVnibZwMAALxdnn/++VpjjTWW6Pfk/c2HUsftdiussIJQAgAAlugjORZzAAAACEIJAAAgCCUAAIDwN/8ZJQCApa1pmpozZ07NnTv37Z4K8Brdu3ev5ZZbbqn8WiChBADwBsyePbtmzJhRf/rTn97uqQAL0bdv31pttdWqZ8+ef9ZxhBIAwBKaN29ePfDAA9W9e/caNGhQ9ezZ0y+0h3eIpmlq9uzZ9cQTT9QDDzxQ66233uv+UtnFEUoAAEto9uzZNW/evFpjjTWqb9++b/d0gNCnT5/q0aNHPfTQQzV79uzq3bv3mz6WxRwAAN6gP+e/UgN/WUvr76e/5QAAAEEoAQAABKEEAAAQLOYAALA0nP8Wr373yeatPd9f2H777VcbbbRRHXbYYW/3VBZq6tSpNXr06HrmmWfqXe9611/Nsd+Mb33rWzV58uS67bbb3hHHea0rrriiDj/88Lr11lv/4p8VdEUJAGAZsP/++1dbW9sCX7vuuuvbPbW6/fbb62c/+1n9/d//fee2+++/v/bZZ58aNGhQ9e7duwYPHlx77LFH/eY3v6mqqgcffLDa2tqW6g/h72Rrr712559Znz59au2116699967rrvuuqV+rkMPPbSuvfbaN/Sctra2mjx58p99nNez++67V1tbW51//vlL9bgLI5QAAJYRu+66a82YMaPL1wUXXLDI8a+++uoSbVsSi3veKaecUh/72Mdq+eWXr6rWMuxjxoyp559/vi655JK677776sILL6yNN964nnvuuTd1/neC2bNn/1nPnzhxYs2YMaPuu+++Ovfcc+td73pX7bTTTnXMMccspRm2tLe318orr/yOOU76zGc+UyeffPJSP24SSgAAy4hevXrVqquu2uWrf//+nfvb2trqtNNOqz322KP69etXRx99dH3rW9+qYcOG1Zlnnlnrrrtu9erVq5qmqT/84Q+1xx57VHt7e62wwgq1995712OPPdZ5rEU9L82bN69+8pOf1Lhx4zq33X333XX//ffXqaeeWttss02ttdZaNWLEiDrmmGNqq622qqqqddZZp6qqNttss2pra6tRo0ZVVdX06dNrzJgxNWDAgFpxxRVr5MiR9T//8z9dztnW1lY/+MEPas8996y+ffvWeuutV5dffnmXMT//+c9r/fXXrz59+tTo0aPrwQcf7LL/qaeeqn322acGDx5cffv2raFDhy4QnaNGjaovf/nL9Q//8A81YMCAGjNmzBIde1GWX375WnXVVWvNNdesHXbYof793/+9Dj/88DriiCPqvvvu6/L+jR07ttrb22vgwIG133771ZNPPllVVaeffnqtvvrqNW/evC7HHjduXI0fP76q5v/ZdXi993Tttdeuqqo999yz2traOh/ncebNm1cTJ06swYMHV69evWrYsGF15ZVXdu7vuEp4ySWX1OjRo6tv37616aab1rRp0xaY669//eu6//77l+h9e7OEEgAAnY488sjaY4896o477qgDDjigqqp+97vf1X/+53/WxRdf3Hmr24c//OF6+umn6/rrr69rrrmmfv/739fHP/7xLsda2PPS7bffXs8++2xtueWWndve/e53V7du3eqiiy6quXPnLvR5v/71r6uq6r/+679qxowZdckll1RV1axZs2r8+PF1ww031E033VTrrbdejR07tmbNmtXl+UcddVTtvffedfvtt9fYsWNr3333raeffrqqqh5++OHaa6+9auzYsXXbbbfV3/3d39U3vvGNLs9/+eWXa4sttqgrrrii7rzzzvrc5z5X++23X918881dxp1zzjm13HLL1a9+9as6/fTTl+jYb8TBBx9cTdPUZZddVlVVM2bMqJEjR9awYcPqlltuqSuvvLIee+yx2nvvvauq6mMf+1g9+eSTNWXKlM5jPPPMM3XVVVfVvvvuu9BzvN57On369KqqOuuss2rGjBmdj9NJJ51UJ554Yp1wwgl1++231y677FLjxo2r3/72t13G/dM//VMdeuihddttt9X6669f++yz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1KFDB82bN0+SlJ6ersWLF6tfv34FbpeWlqbWrVvr+PHjWr58uXbv3q2RI0c69MVDhw7p448/1pIlS+ynpnTp0kVnzpxRXFycVq1apcOHD6tbt25XrPNG4eXlpX//+9/64YcfNG/ePH377be5fv/p6emaMmWKZs+erX379qlChQrq3bu3jh8/rnXr1mnJkiWaOXOmkpOTC73vli1batq0aQ7/mc8ZbXnkkUe0ceNGffTRR9qzZ48efPBBdezYUT/99NNVP8709HRdunQpVx/96aefFBkZqapVq+rvf/+7jhw5UuB+FixYoLZt26px48a5lvn4+OQaFb1cQEDADTXS6cl9Ky0tTdHR0apcubL+9re/adeuXQWuv2DBAtWqVUuxsbG5ltlsNoWFheW7bUBAgLKzs5WZmelUjdebI0eO6Ouvv5aPj0++6/Ts2VOLFi2SuewrQxcvXqyIiAi1bt1a0p+jvi+++KJ2796tZcuWKTExMc9TEp977jm9+uqr2rFjh0qVKpXrPejw4cNatmyZVqxYoRUrViguLk4vvfSSffn58+c1bNgwbd++XWvWrJGXl5fuv//+IhsVHT9+vPbu3av//Oc/eS5PT09Xx44dVaZMGW3fvl2ffPKJVq9erX/+85/2dV599VW9//77eu+997RhwwadOXNGS5cuddjPmDFjNGfOHM2YMUP79u3TU089pYcfflhxcXFF8riKnbuTGopGnz59jLe3twkKCnK4vfDCC8aYP//LKcmcOXPGqf1u2rTJ+Pj4mJUrVxa4Xs5/85KTk01ISIj54IMPjDG5R5Sscv6L+/nnn9vbJJkxY8bY76elpRmbzWa++uorY4wxzz77rKlVq5bJzs62r/PWW2+Z4OBgk5WV5dTjg6OS0o+WLVtmqlWrZrKzs828efNM48aNjTGmwBGld99914SEhJjffvstz32PGzfO+Pj4mOTkZHvbypUrjbe3t8Po1b59+4wks23bNqce4/Usr9/7//3f/+W57scff2zKlStnvz9nzhwjycTHx9vbEhISjCSzfft2e9tPP/1kJDn8178w+7b+Z/7QoUPGZrOZY8eOObTffffdZvTo0YV5uHkaNGiQqVatmvnjjz/sbV9++aX5z3/+Y/bs2WNWrVplWrdubSIiIszp06fz3U9AQIAZPHjwFY9n/W/51q1bTbly5cxDDz1kjPGsEaUbrW9t3rzZzJ8/38THx5v169ebBx54wAQEBJiDBw/mu02dOnXMfffdd8V9W0eUEhISTPXq1e0jCZ42opTTd/z9/e2jf6+99prDepe/D+SMHq1fv96+vEWLFmbEiBH5Hmfbtm1GUq4Rx9WrV9vX+eKLL4wk+9+HcePGmcDAQIcRpBEjRphbb7013+MkJycbSWbv3r2FevxyckTJGGOeeeYZU7NmTXPp0qVcI0ozZ840ZcqUsY9q5zwuLy8v+1kUlSpVMi+99JJ9+aVLl0zlypXtf6vS0tKMv7+/2bRpk0MN/fv3N927dy/U4yrpShVnKEPxatOmjWbMmOHQlvPfUXPZf1cKa9++fYqNjdXzzz+vdu3aFWqb8PBwDR8+XM8//3ye/5VPTk7W888/r2+//Vb//e9/lZWVpfT0dCUlJTms17BhQ/vPQUFBCgkJsf/HMCEhQS1atJDNZrOv06pVK6WlpenXX39VlSpVnH6s+J+S0I/uvfdePfbYY1q/fr3ef//9K44mSVJ8fLwaN25c4KhVdHS0wsPD7fcTEhIUFRWlqKgoe1vdunVVunRpJSQkqHnz5oWq1xNYf+85Ix9r167V5MmTtX//fqWmpiozM1MXLlzQ+fPn7ev4+vo6vGZ//PFHlSpVSk2aNLG3Va9eXWXKlHE4ZmH2bfX999/LGKOaNWs6tGdkZKhcuXJX9dinTp2qRYsWad26dQ7XkVx+gXiDBg3UokULVatWTfPmzdOwYcPy3JcxxuFvU0FWrFih4OBgZWZm6tKlS4qNjdUbb7xxVY+hJLvR+tZtt92m2267zX6/VatWatKkid544w39+9//znMbZ/rN3r17FRwcrKysLGVkZOiuu+7SzJkzC13f9SSn76Snp2v27Nk6ePCgnnzyyXzXDw8PV7t27bRgwQLdcccdSkxM1ObNmx36365duzR+/HjFx8frzJkz9hGepKQk1a1b177e5f2uUqVKkv78DJPzGSMmJkYhISEO61w+snn48GGNHTtWW7Zs0enTpx2OU79+/Wt5WvI1atQovfvuu3r//ff10EMPOSxLSEhQo0aNHPp/q1atlJ2drR9//FH+/v46ceKEWrRoYV9eqlQpNWvWzP7ev3//fl24cCHXe/nFixfzHEW/HhGUPFhQUJCqV6+e57KcP/wHDhxweBHkZ//+/frrX/+qRx99VGPGjHGqjmHDhuntt9/W22+/nWtZ3759derUKU2bNk3R0dHy8/NTixYtdPHiRYf1rEPrNpvN/kcmrzeUnBdxYd9okL+S0I9KlSqlXr16ady4cdq6dWuuof+8BAQEXHEd6wek/D6cOPOhxVPk9Xv/5Zdf1KlTJw0cOFAvvviiypYtqw0bNqh///4Op4gFBAQ4PF/5BerL2wu7b6vs7Gx5e3tr586d8vb2dlgWHBzs1GOWpFdeeUWTJ0/W6tWrHT4Y5SUoKEgNGjQo8DSsmjVrKiEhoVDHzvkQ6OPjo8jISIe/e6GhoZL+PGXVekrr77//XuCpWCXNjdq3cnh5eal58+Yu6ze1atXS8uXL5e3trcjISIeJDHL6RUpKSq7tfv/9d0VHRztZvXtd3nf+/e9/q02bNpowYYJefPHFfLfp2bOnhgwZojfeeEMLFy5UvXr11KhRI0l/ng7Xvn17tW/fXh9++KHCw8OVlJSkDh06FPg5JKcPXn7aXEGfUySpc+fOioqK0qxZsxQZGans7GzVr18/13FcqXTp0ho9erQmTJigv/3tbw7LCnpfK+z7Xc7j++KLL/SXv/zFYZmnTKjBNUo3qPbt26t8+fKaOnVqnssvn4J23759atOmjfr06aNJkyY5fazg4GCNHTtWkyZNUmpqqsOy7777ToMHD1anTp1Ur149+fn56fTp007tv27dutq0aZPDG+OmTZsUEhKS64UL1yrOftSvXz/FxcUpNjY213+L89KwYUP7fwgLq27dukpKStLRo0ftbfv371dKSorq1KnjdM2eZseOHcrMzNSrr76q2267TTVr1tTx48evuF3t2rWVmZnpcF3GoUOHHPpHYfbt6+urrKwsh7bGjRsrKytLycnJql69usOtMFN3X+5f//qXXnzxRX399ddq1qzZFdfPyMhQQkKC/b/LeenRo4dWr16d5zUpmZmZ9um/pf99CIyOjs71oatGjRry8vLS9u3bHdpPnDihY8eOqVatWlestyTz9L51OWOM4uPjr9hvDh48qM8++yzP7S8PPr6+vqpevbqqVq2a68NpmTJlFB4enqvf/PHHH9q3b99132/GjRunV155pcC+0qVLF124cEFff/21Fi5cqIcffti+7MCBAzp9+rReeukl3XHHHapdu3au69tc4bffflNCQoLGjBmju+++W3Xq1Mk1rXlRefLJJ+Xl5ZXr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JUL16tW1Y8cOffPNNzp48KDGjh2r7du325cnJiZq9OjR2rx5s3755RetXLlSBw8etF+nFBMTo8TERMXHx+v06dPKyMjI91i33nqrAgMD9eyzz+rQoUNauHChfZa8HOPGjdOiRYs0btw4JSQkaO/evZo6dap9eUxMjNavX69jx47p9OnTkv6cDe/UqVOaOnWqDh8+rLfeektfffXVFR97z549Vb58ecXGxuq7775TYmKi4uLiNGTIEP3666/OPI0AABchKAEASoSBAweqa9eu6tatm2699Vb99ttvDqNLgYGBOnDggB544AHVrFlTAwYM0D//+U899thjkqQHHnhAHTt2VJs2bRQeHq5Fixble6yyZcvqww8/1JdffqkGDRpo0aJFDtOaS3+Gnk8++UTLly/XzTffrL/+9a/aunWrffkLL7ygn3/+WdWqVVN4eLikPyeXePvtt/XWW2+pUaNG2rZtm4YPH37Fxx4YGKj169erSpUq6tq1q+rUqaN+/frpjz/+YIQJANzEZqwnUwMAAADADY4RJQAAAACwICgBAAAAgAVBCQAAAAAsCEoAAAAAYEFQAgAAAAALghIAAAAAWBCUAAAAAMCCoAQAAAAAFgQlAAAAALAgKAEAAACABUEJAAAAACz+H16bEj/nEy1YAAAAAElFTkSuQmCC" + }, + "metadata": {}, + "output_type": "display_data" + } + ] + }, + { + "cell_type": "code", + "source": [ + "from IPython.core.display import SVG\n", + "from matplotlib import markers\n", + "import matplotlib.pyplot as plt\n", + "\n", + "#data loading\n", + "\n", + "world_size = ['4|148', '6|222', '8|296', '10|370', '12|444', '14|518']\n", + "baremetal_cylon = [18.93717813, 19.75821758, 19.84387813, 20.68476873, 21.04591821, 21.59903709]\n", + "rp_cylon = [19.27405391, 20.4443211, 20.7198427, 21.2812939, 21.50566909, 21.78800784]\n", + "\n", + "rp_cylon_err = [0.2107801437, 0.3222160003, 1.022121528, 0.349553999, 0.3169727816, 1.534950139]\n", + "bm_cylon_err = [0.6005659103, 1.614059141, 0.8212216271, 0.2230492727, 0.1857792821, 2.082797966]\n", + "\n", + "plt.plot(world_size, baremetal_cylon, marker='o', color='b', label='BM-Cylon')\n", + "plt.plot(world_size, rp_cylon, marker='o', color='g', label='RP-Cylon')\n", + "\n", + "\n", + "plt.errorbar(world_size, baremetal_cylon, yerr=bm_cylon_err, fmt='x', color='b', ecolor='b', capsize=5)\n", + "plt.errorbar(world_size, rp_cylon, yerr=rp_cylon_err, fmt='o', color='g', ecolor='g', capsize=5)\n", + "\n", + "\n", + "custom_text = \"35m rows\"\n", + "plt.text(4, 24, custom_text, fontsize=10, color='orange', ha='center')\n", + "\n", + "plt.ylim(15, 25)\n", + "\n", + "plt.xticks(world_size)\n", + "\n", + "plt.xlabel('nodes | parallelism')\n", + "plt.ylabel('average time (s)')\n", + "plt.title('Weak Scaling of Sort Operation')\n", + "\n", + "plt.legend()\n", + "\n", + "#save the figure\n", + "plt.savefig('sort-w-scaling.svg', format='svg')\n", + "\n", + "#display the graph\n", + "\n", + "plt.show()\n" + ], + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 473 + }, + "id": "eg1zeZcSLRAI", + "outputId": "3ab2569d-7c8c-4317-8a24-ea9de8c62b34" + }, + "execution_count": 17, + "outputs": [ + { + "ename": "ValueError", + "evalue": "'x' and 'y' must have the same size", + "output_type": "error", + "traceback": [ + "\u001B[0;31m---------------------------------------------------------------------------\u001B[0m", + "\u001B[0;31mValueError\u001B[0m Traceback (most recent call last)", + "Cell \u001B[0;32mIn[17], line 20\u001B[0m\n\u001B[1;32m 18\u001B[0m plt\u001B[38;5;241m.\u001B[39merrorbar(world_size, baremetal_cylon, yerr\u001B[38;5;241m=\u001B[39mbm_cylon_err, fmt\u001B[38;5;241m=\u001B[39m\u001B[38;5;124m'\u001B[39m\u001B[38;5;124mx\u001B[39m\u001B[38;5;124m'\u001B[39m, color\u001B[38;5;241m=\u001B[39m\u001B[38;5;124m'\u001B[39m\u001B[38;5;124mb\u001B[39m\u001B[38;5;124m'\u001B[39m, ecolor\u001B[38;5;241m=\u001B[39m\u001B[38;5;124m'\u001B[39m\u001B[38;5;124mb\u001B[39m\u001B[38;5;124m'\u001B[39m, capsize\u001B[38;5;241m=\u001B[39m\u001B[38;5;241m5\u001B[39m)\n\u001B[1;32m 19\u001B[0m plt\u001B[38;5;241m.\u001B[39merrorbar(world_size, rp_cylon, yerr\u001B[38;5;241m=\u001B[39mrp_cylon_err, fmt\u001B[38;5;241m=\u001B[39m\u001B[38;5;124m'\u001B[39m\u001B[38;5;124mo\u001B[39m\u001B[38;5;124m'\u001B[39m, color\u001B[38;5;241m=\u001B[39m\u001B[38;5;124m'\u001B[39m\u001B[38;5;124mg\u001B[39m\u001B[38;5;124m'\u001B[39m, ecolor\u001B[38;5;241m=\u001B[39m\u001B[38;5;124m'\u001B[39m\u001B[38;5;124mg\u001B[39m\u001B[38;5;124m'\u001B[39m, capsize\u001B[38;5;241m=\u001B[39m\u001B[38;5;241m5\u001B[39m)\n\u001B[0;32m---> 20\u001B[0m \u001B[43mplt\u001B[49m\u001B[38;5;241;43m.\u001B[39;49m\u001B[43merrorbar\u001B[49m\u001B[43m(\u001B[49m\u001B[43mworld_size\u001B[49m\u001B[43m,\u001B[49m\u001B[43m \u001B[49m\u001B[43mfargate_4_26\u001B[49m\u001B[43m,\u001B[49m\u001B[43m \u001B[49m\u001B[43myerr\u001B[49m\u001B[38;5;241;43m=\u001B[39;49m\u001B[43mfargate_4_26_err\u001B[49m\u001B[43m,\u001B[49m\u001B[43m \u001B[49m\u001B[43mfmt\u001B[49m\u001B[38;5;241;43m=\u001B[39;49m\u001B[38;5;124;43m'\u001B[39;49m\u001B[38;5;124;43mx\u001B[39;49m\u001B[38;5;124;43m'\u001B[39;49m\u001B[43m,\u001B[49m\u001B[43m \u001B[49m\u001B[43mcolor\u001B[49m\u001B[38;5;241;43m=\u001B[39;49m\u001B[38;5;124;43m'\u001B[39;49m\u001B[38;5;124;43mr\u001B[39;49m\u001B[38;5;124;43m'\u001B[39;49m\u001B[43m,\u001B[49m\u001B[43m \u001B[49m\u001B[43mecolor\u001B[49m\u001B[38;5;241;43m=\u001B[39;49m\u001B[38;5;124;43m'\u001B[39;49m\u001B[38;5;124;43mr\u001B[39;49m\u001B[38;5;124;43m'\u001B[39;49m\u001B[43m,\u001B[49m\u001B[43m \u001B[49m\u001B[43mcapsize\u001B[49m\u001B[38;5;241;43m=\u001B[39;49m\u001B[38;5;241;43m5\u001B[39;49m\u001B[43m)\u001B[49m\n\u001B[1;32m 22\u001B[0m custom_text \u001B[38;5;241m=\u001B[39m \u001B[38;5;124m\"\u001B[39m\u001B[38;5;124m35m rows\u001B[39m\u001B[38;5;124m\"\u001B[39m\n\u001B[1;32m 23\u001B[0m plt\u001B[38;5;241m.\u001B[39mtext(\u001B[38;5;241m4\u001B[39m, \u001B[38;5;241m24\u001B[39m, custom_text, fontsize\u001B[38;5;241m=\u001B[39m\u001B[38;5;241m10\u001B[39m, color\u001B[38;5;241m=\u001B[39m\u001B[38;5;124m'\u001B[39m\u001B[38;5;124morange\u001B[39m\u001B[38;5;124m'\u001B[39m, ha\u001B[38;5;241m=\u001B[39m\u001B[38;5;124m'\u001B[39m\u001B[38;5;124mcenter\u001B[39m\u001B[38;5;124m'\u001B[39m)\n", + "File \u001B[0;32m~/Documents/phd/code/cylon_experiments/venv/lib/python3.9/site-packages/matplotlib/pyplot.py:3030\u001B[0m, in \u001B[0;36merrorbar\u001B[0;34m(x, y, yerr, xerr, fmt, ecolor, elinewidth, capsize, barsabove, lolims, uplims, xlolims, xuplims, errorevery, capthick, data, **kwargs)\u001B[0m\n\u001B[1;32m 3009\u001B[0m \u001B[38;5;129m@_copy_docstring_and_deprecators\u001B[39m(Axes\u001B[38;5;241m.\u001B[39merrorbar)\n\u001B[1;32m 3010\u001B[0m \u001B[38;5;28;01mdef\u001B[39;00m \u001B[38;5;21merrorbar\u001B[39m(\n\u001B[1;32m 3011\u001B[0m x: \u001B[38;5;28mfloat\u001B[39m \u001B[38;5;241m|\u001B[39m ArrayLike,\n\u001B[0;32m (...)\u001B[0m\n\u001B[1;32m 3028\u001B[0m \u001B[38;5;241m*\u001B[39m\u001B[38;5;241m*\u001B[39mkwargs,\n\u001B[1;32m 3029\u001B[0m ) \u001B[38;5;241m-\u001B[39m\u001B[38;5;241m>\u001B[39m ErrorbarContainer:\n\u001B[0;32m-> 3030\u001B[0m \u001B[38;5;28;01mreturn\u001B[39;00m \u001B[43mgca\u001B[49m\u001B[43m(\u001B[49m\u001B[43m)\u001B[49m\u001B[38;5;241;43m.\u001B[39;49m\u001B[43merrorbar\u001B[49m\u001B[43m(\u001B[49m\n\u001B[1;32m 3031\u001B[0m \u001B[43m \u001B[49m\u001B[43mx\u001B[49m\u001B[43m,\u001B[49m\n\u001B[1;32m 3032\u001B[0m \u001B[43m \u001B[49m\u001B[43my\u001B[49m\u001B[43m,\u001B[49m\n\u001B[1;32m 3033\u001B[0m \u001B[43m \u001B[49m\u001B[43myerr\u001B[49m\u001B[38;5;241;43m=\u001B[39;49m\u001B[43myerr\u001B[49m\u001B[43m,\u001B[49m\n\u001B[1;32m 3034\u001B[0m \u001B[43m \u001B[49m\u001B[43mxerr\u001B[49m\u001B[38;5;241;43m=\u001B[39;49m\u001B[43mxerr\u001B[49m\u001B[43m,\u001B[49m\n\u001B[1;32m 3035\u001B[0m \u001B[43m \u001B[49m\u001B[43mfmt\u001B[49m\u001B[38;5;241;43m=\u001B[39;49m\u001B[43mfmt\u001B[49m\u001B[43m,\u001B[49m\n\u001B[1;32m 3036\u001B[0m \u001B[43m \u001B[49m\u001B[43mecolor\u001B[49m\u001B[38;5;241;43m=\u001B[39;49m\u001B[43mecolor\u001B[49m\u001B[43m,\u001B[49m\n\u001B[1;32m 3037\u001B[0m \u001B[43m \u001B[49m\u001B[43melinewidth\u001B[49m\u001B[38;5;241;43m=\u001B[39;49m\u001B[43melinewidth\u001B[49m\u001B[43m,\u001B[49m\n\u001B[1;32m 3038\u001B[0m \u001B[43m \u001B[49m\u001B[43mcapsize\u001B[49m\u001B[38;5;241;43m=\u001B[39;49m\u001B[43mcapsize\u001B[49m\u001B[43m,\u001B[49m\n\u001B[1;32m 3039\u001B[0m \u001B[43m \u001B[49m\u001B[43mbarsabove\u001B[49m\u001B[38;5;241;43m=\u001B[39;49m\u001B[43mbarsabove\u001B[49m\u001B[43m,\u001B[49m\n\u001B[1;32m 3040\u001B[0m \u001B[43m \u001B[49m\u001B[43mlolims\u001B[49m\u001B[38;5;241;43m=\u001B[39;49m\u001B[43mlolims\u001B[49m\u001B[43m,\u001B[49m\n\u001B[1;32m 3041\u001B[0m \u001B[43m \u001B[49m\u001B[43muplims\u001B[49m\u001B[38;5;241;43m=\u001B[39;49m\u001B[43muplims\u001B[49m\u001B[43m,\u001B[49m\n\u001B[1;32m 3042\u001B[0m \u001B[43m \u001B[49m\u001B[43mxlolims\u001B[49m\u001B[38;5;241;43m=\u001B[39;49m\u001B[43mxlolims\u001B[49m\u001B[43m,\u001B[49m\n\u001B[1;32m 3043\u001B[0m \u001B[43m \u001B[49m\u001B[43mxuplims\u001B[49m\u001B[38;5;241;43m=\u001B[39;49m\u001B[43mxuplims\u001B[49m\u001B[43m,\u001B[49m\n\u001B[1;32m 3044\u001B[0m \u001B[43m \u001B[49m\u001B[43merrorevery\u001B[49m\u001B[38;5;241;43m=\u001B[39;49m\u001B[43merrorevery\u001B[49m\u001B[43m,\u001B[49m\n\u001B[1;32m 3045\u001B[0m \u001B[43m \u001B[49m\u001B[43mcapthick\u001B[49m\u001B[38;5;241;43m=\u001B[39;49m\u001B[43mcapthick\u001B[49m\u001B[43m,\u001B[49m\n\u001B[1;32m 3046\u001B[0m \u001B[43m \u001B[49m\u001B[38;5;241;43m*\u001B[39;49m\u001B[38;5;241;43m*\u001B[39;49m\u001B[43m(\u001B[49m\u001B[43m{\u001B[49m\u001B[38;5;124;43m\"\u001B[39;49m\u001B[38;5;124;43mdata\u001B[39;49m\u001B[38;5;124;43m\"\u001B[39;49m\u001B[43m:\u001B[49m\u001B[43m \u001B[49m\u001B[43mdata\u001B[49m\u001B[43m}\u001B[49m\u001B[43m \u001B[49m\u001B[38;5;28;43;01mif\u001B[39;49;00m\u001B[43m \u001B[49m\u001B[43mdata\u001B[49m\u001B[43m \u001B[49m\u001B[38;5;129;43;01mis\u001B[39;49;00m\u001B[43m \u001B[49m\u001B[38;5;129;43;01mnot\u001B[39;49;00m\u001B[43m \u001B[49m\u001B[38;5;28;43;01mNone\u001B[39;49;00m\u001B[43m \u001B[49m\u001B[38;5;28;43;01melse\u001B[39;49;00m\u001B[43m \u001B[49m\u001B[43m{\u001B[49m\u001B[43m}\u001B[49m\u001B[43m)\u001B[49m\u001B[43m,\u001B[49m\n\u001B[1;32m 3047\u001B[0m \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\u001B[1;32m 3048\u001B[0m \u001B[43m \u001B[49m\u001B[43m)\u001B[49m\n", + "File \u001B[0;32m~/Documents/phd/code/cylon_experiments/venv/lib/python3.9/site-packages/matplotlib/__init__.py:1465\u001B[0m, in \u001B[0;36m_preprocess_data..inner\u001B[0;34m(ax, data, *args, **kwargs)\u001B[0m\n\u001B[1;32m 1462\u001B[0m \u001B[38;5;129m@functools\u001B[39m\u001B[38;5;241m.\u001B[39mwraps(func)\n\u001B[1;32m 1463\u001B[0m \u001B[38;5;28;01mdef\u001B[39;00m \u001B[38;5;21minner\u001B[39m(ax, \u001B[38;5;241m*\u001B[39margs, data\u001B[38;5;241m=\u001B[39m\u001B[38;5;28;01mNone\u001B[39;00m, \u001B[38;5;241m*\u001B[39m\u001B[38;5;241m*\u001B[39mkwargs):\n\u001B[1;32m 1464\u001B[0m \u001B[38;5;28;01mif\u001B[39;00m data \u001B[38;5;129;01mis\u001B[39;00m \u001B[38;5;28;01mNone\u001B[39;00m:\n\u001B[0;32m-> 1465\u001B[0m \u001B[38;5;28;01mreturn\u001B[39;00m \u001B[43mfunc\u001B[49m\u001B[43m(\u001B[49m\u001B[43max\u001B[49m\u001B[43m,\u001B[49m\u001B[43m \u001B[49m\u001B[38;5;241;43m*\u001B[39;49m\u001B[38;5;28;43mmap\u001B[39;49m\u001B[43m(\u001B[49m\u001B[43msanitize_sequence\u001B[49m\u001B[43m,\u001B[49m\u001B[43m \u001B[49m\u001B[43margs\u001B[49m\u001B[43m)\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\u001B[1;32m 1467\u001B[0m bound \u001B[38;5;241m=\u001B[39m new_sig\u001B[38;5;241m.\u001B[39mbind(ax, \u001B[38;5;241m*\u001B[39margs, \u001B[38;5;241m*\u001B[39m\u001B[38;5;241m*\u001B[39mkwargs)\n\u001B[1;32m 1468\u001B[0m auto_label \u001B[38;5;241m=\u001B[39m (bound\u001B[38;5;241m.\u001B[39marguments\u001B[38;5;241m.\u001B[39mget(label_namer)\n\u001B[1;32m 1469\u001B[0m \u001B[38;5;129;01mor\u001B[39;00m bound\u001B[38;5;241m.\u001B[39mkwargs\u001B[38;5;241m.\u001B[39mget(label_namer))\n", + "File \u001B[0;32m~/Documents/phd/code/cylon_experiments/venv/lib/python3.9/site-packages/matplotlib/axes/_axes.py:3569\u001B[0m, in \u001B[0;36mAxes.errorbar\u001B[0;34m(self, x, y, yerr, xerr, fmt, ecolor, elinewidth, capsize, barsabove, lolims, uplims, xlolims, xuplims, errorevery, capthick, **kwargs)\u001B[0m\n\u001B[1;32m 3567\u001B[0m x, y \u001B[38;5;241m=\u001B[39m np\u001B[38;5;241m.\u001B[39matleast_1d(x, y) \u001B[38;5;66;03m# Make sure all the args are iterable.\u001B[39;00m\n\u001B[1;32m 3568\u001B[0m \u001B[38;5;28;01mif\u001B[39;00m \u001B[38;5;28mlen\u001B[39m(x) \u001B[38;5;241m!=\u001B[39m \u001B[38;5;28mlen\u001B[39m(y):\n\u001B[0;32m-> 3569\u001B[0m \u001B[38;5;28;01mraise\u001B[39;00m \u001B[38;5;167;01mValueError\u001B[39;00m(\u001B[38;5;124m\"\u001B[39m\u001B[38;5;124m'\u001B[39m\u001B[38;5;124mx\u001B[39m\u001B[38;5;124m'\u001B[39m\u001B[38;5;124m and \u001B[39m\u001B[38;5;124m'\u001B[39m\u001B[38;5;124my\u001B[39m\u001B[38;5;124m'\u001B[39m\u001B[38;5;124m must have the same size\u001B[39m\u001B[38;5;124m\"\u001B[39m)\n\u001B[1;32m 3571\u001B[0m everymask \u001B[38;5;241m=\u001B[39m \u001B[38;5;28mself\u001B[39m\u001B[38;5;241m.\u001B[39m_errorevery_to_mask(x, errorevery)\n\u001B[1;32m 3573\u001B[0m label \u001B[38;5;241m=\u001B[39m kwargs\u001B[38;5;241m.\u001B[39mpop(\u001B[38;5;124m\"\u001B[39m\u001B[38;5;124mlabel\u001B[39m\u001B[38;5;124m\"\u001B[39m, \u001B[38;5;28;01mNone\u001B[39;00m)\n", + "\u001B[0;31mValueError\u001B[0m: 'x' and 'y' must have the same size" + ] + }, + { + "data": { + "text/plain": "
", + "image/png": "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" + }, + "metadata": {}, + "output_type": "display_data" + } + ] + }, + { + "cell_type": "code", + "source": [ + "from IPython.core.display import SVG\n", + "from matplotlib import markers\n", + "import matplotlib.pyplot as plt\n", + "\n", + "#data loading\n", + "\n", + "world_size = ['4|148', '6|222', '8|296', '10|370', '12|444', '14|518']\n", + "baremetal_cylon = [12.48204808, 8.280943102, 6.334967629, 5.099316477, 4.445687452, 3.851617681]\n", + "rp_cylon = [12.55294192, 8.420808574, 6.376633428, 5.131316051, 4.446267159, 3.95247161]\n", + "\n", + "rp_cylon_err = [0.6438074455, 0.6394383387, 0.8082996274, 1.177945473, 1.520513786, 1.981052724]\n", + "bm_cylon_err = [0.5287349256, 0.5657937827, 0.3046811328, 1.282029453, 1.70061018, 1.693347512]\n", + "\n", + "# Create a line chart\n", + "plt.plot(world_size, baremetal_cylon, marker='o', color='b', label='BM-Cylon')\n", + "plt.plot(world_size, rp_cylon, marker='o', color='g', label='RP-Cylon')\n", + "\n", + "plt.errorbar(world_size, baremetal_cylon, yerr=bm_cylon_err, fmt='x', color='b', ecolor='b', capsize=5)\n", + "plt.errorbar(world_size, rp_cylon, yerr=rp_cylon_err, fmt='o', color='g', ecolor='g', capsize=5)\n", + "\n", + "custom_text = \"3.5B rows\"\n", + "plt.text(0.3, 14, custom_text, fontsize=10, color='orange', ha='center')\n", + "\n", + "plt.ylim(1, 15)\n", + "\n", + "plt.xticks(world_size)\n", + "\n", + "plt.xlabel('nodes | parallelism')\n", + "plt.ylabel('average time (s)')\n", + "plt.title('Strong Scaling of Sort Operation')\n", + "\n", + "plt.legend()\n", + "\n", + "#save the figure\n", + "plt.savefig('sort-s-scaling.svg', format='svg')\n", + "\n", + "#display the graph\n", + "\n", + "plt.show()" + ], + "metadata": { + "colab": { + "base_uri": "https://localhost:8080/", + "height": 473 + }, + "id": "dFHyhBGqR8cL", + "outputId": "2f2f0768-20ff-4b13-baee-fd61c2c97c8a" + }, + "execution_count": null, + "outputs": [ + { + "output_type": "display_data", + "data": { + "text/plain": [ + "
" + ], + "image/png": "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ktAIIYQQwuhJQpOKoKAgunTpYugwcoUFCxZQp04dQ4eR48l5NowuXboQFBRk6DByPDnPWSc7n+tcn9CMGzcOlUpF//7906wTFxdHly5dKFOmDGZmZrRs2fK1bR44cAAzMzPKlSunU56cnMzw4cMpWLAg1tbWFC5cmFGjRun9nApjdPfuXT777DNcXFywtramTJkyHD9+PM36p0+fpkOHDnh7e2NtbU2JEiWYOnWqTp01a9bQsGFDXF1dcXBwoGrVqmzdulWnztixY6lcuTL29va4ubnRsmVLLl26lCnHaGhv87nS5zwDTJ8+nRIlSmBtbY2fnx9//vlnijrPnj2jV69eeHh4YGlpSbFixdi8eXOGHqMh7N27l2bNmuHp6YlKpWLdunU66xVF4ccff8TDwwNra2saNGhASEjIa9vcv38/1atX1/57KF68OJMnT9ap4+vri0qlSrH06tVLWycuLo5evXrh4uKCnZ0dbdq04cGDBxl27Fnpdec5MTGRIUOGUKZMGWxtbfH09KRz587cu3dP7/bT+n38sjd9DyiKQuPGjVP9HBiTN32mX/bVV1+hUqmYMmXKa9vcvXt3qp/X+/fvp2u/UVFR9O7dGy8vL6ytrSlZsiS///57uo4vx88U/DrHjh1j1qxZ+Pv7v7ZecnIy1tbW9O3bl9WrV7+27rNnz+jcuTP169dP8Qvm559/ZubMmSxcuJBSpUpx/PhxunbtiqOjI3379n3n48luwsLCqF69OnXr1mXLli24uroSEhJCnjx50tzmxIkTuLm5sXjxYry9vTl48CBffvklpqam9O7dG9D842jYsCFjxozBycmJ+fPn06xZM44cOUL58uUB2LNnD7169aJy5cokJSXx3Xff8cEHH3D+/HlsbW2z5Pizytt8rvQ5zzNnzmTYsGHMmTOHypUrc/ToUb744gvy5MlDs2bNAEhISKBhw4a4ubmxatUq8ufPz82bN3Fycsqqw8800dHRlC1blm7dutG6desU68ePH8+vv/7KwoULKViwIMOHD6dRo0acP38eKyurVNu0tbWld+/e+Pv7Y2try/79++nRowe2trZ8+eWXgOb3UnJysnabs2fP0rBhQz7++GNt2YABA9i0aRMrV67E0dGR3r1707p1aw4cOJDBZyHzve48x8TEcPLkSYYPH07ZsmUJCwujX79+NG/e/LV/GD33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\n" + }, + "metadata": {} + } + ] + } + ] +} diff --git a/aws/scripts/cylon_scaling.py b/aws/scripts/cylon_scaling.py index 34ba2015b..402eee730 100644 --- a/aws/scripts/cylon_scaling.py +++ b/aws/scripts/cylon_scaling.py @@ -84,6 +84,8 @@ def cylon_join(data=None): df1 = DataFrame(pd.DataFrame(data1).add_prefix("col")) df2 = DataFrame(pd.DataFrame(data2).add_prefix("col")) + timing = {'scaling': [], 'world': [], 'rows': [], 'max_value': [], 'rank': [], 'avg_t':[], 'tot_l':[]} + for i in range(data['it']): env.barrier() StopWatch.start(f"join_{i}_{data['host']}_{data['rows']}_{data['it']}") @@ -100,7 +102,13 @@ def cylon_join(data=None): if env.rank == 0: avg_t = sum_t / env.world_size print("### ", data['scaling'], env.world_size, num_rows, max_val, i, avg_t, tot_l) - print("### ", data['scaling'], env.world_size, num_rows, max_val, i, avg_t, tot_l, file=open(data['output_summary_filename'], 'a')) + timing['scaling'].append(data['scaling']) + timing['world'].append(env.world_size) + timing['rows'].append(num_rows) + timing['max_value'].append(max_val) + timing['rank'].append(i) + timing['avg_t'].append(avg_t) + timing['tot_l'].append(tot_l) StopWatch.stop(f"join_{i}_{data['host']}_{data['rows']}_{data['it']}") StopWatch.stop(f"join_total_{data['host']}_{data['rows']}_{data['it']}") @@ -108,6 +116,14 @@ def cylon_join(data=None): if env.rank == 0: StopWatch.benchmark(tag=str(data), filename=data['output_scaling_filename']) upload_file(file_name=data['output_scaling_filename'], bucket=data['s3_bucket'], object_name=data['s3_stopwatch_object_name']) + + + if os.path.exists(data['output_summary_filename']): + pd.DataFrame(timing).to_csv(data['output_summary_filename'], mode='a', index=False, header=False) + else: + pd.DataFrame(timing).to_csv(data['output_summary_filename'], mode='w', index=False, header=True) + + upload_file(file_name=data['output_summary_filename'], bucket=data['s3_bucket'], object_name=data['s3_summary_object_name']) @@ -151,6 +167,8 @@ def cylon_sort(data=None): if env.rank == 0: print("Task# ", data['task']) + timing = {'scaling': [], 'world': [], 'rows': [], 'max_value': [], 'rank': [], 'avg_t': [], 'tot_l': []} + for i in range(data['it']): env.barrier() StopWatch.start(f"sort_{i}_{data['host']}_{data['rows']}_{data['it']}") @@ -166,8 +184,15 @@ def cylon_sort(data=None): if env.rank == 0: avg_t = sum_t / env.world_size print("### ", data['scaling'], env.world_size, num_rows, max_val, i, avg_t, tot_l) - print("### ", data['scaling'], env.world_size, num_rows, max_val, i, avg_t, tot_l, - file=open(data['output_summary_filename'], 'a')) + timing['scaling'].append(data['scaling']) + timing['world'].append(env.world_size) + timing['rows'].append(num_rows) + timing['max_value'].append(max_val) + timing['rank'].append(i) + timing['avg_t'].append(avg_t) + timing['tot_l'].append(tot_l) + #print("### ", data['scaling'], env.world_size, num_rows, max_val, i, avg_t, tot_l, + # file=open(data['output_summary_filename'], 'a')) StopWatch.stop(f"sort_{i}_{data['host']}_{data['rows']}_{data['it']}") @@ -178,9 +203,14 @@ def cylon_sort(data=None): StopWatch.benchmark(tag=str(data), filename=data['output_scaling_filename']) upload_file(file_name=data['output_scaling_filename'], bucket=data['s3_bucket'], object_name=data['s3_stopwatch_object_name']) + + if os.path.exists(data['output_summary_filename']): + pd.DataFrame(timing).to_csv(data['output_summary_filename'], mode='a', index=False, header=False) + else: + pd.DataFrame(timing).to_csv(data['output_summary_filename'], mode='w', index=False, header=True) + upload_file(file_name=data['output_summary_filename'], bucket=data['s3_bucket'], object_name=data['s3_summary_object_name']) - redis_context.clearDB() def cylon_slice(data=None): @@ -222,6 +252,7 @@ def cylon_slice(data=None): if env.rank == 0: print("Task# ", data['task']) + timing = {'scaling': [], 'world': [], 'rows': [], 'max_value': [], 'rank': [], 'avg_t': [], 'tot_l': []} for i in range(data['it']): env.barrier() StopWatch.start(f"slice_{i}_{data['host']}_{data['rows']}_{data['it']}") @@ -239,8 +270,15 @@ def cylon_slice(data=None): if env.rank == 0: avg_t = sum_t / env.world_size print("### ", data['scaling'], env.world_size, num_rows, max_val, i, avg_t, tot_l) - print("### ", data['scaling'], env.world_size, num_rows, max_val, i, avg_t, tot_l, - file=open(data['output_summary_filename'], 'a')) + #print("### ", data['scaling'], env.world_size, num_rows, max_val, i, avg_t, tot_l, + # file=open(data['output_summary_filename'], 'a')) + timing['scaling'].append(data['scaling']) + timing['world'].append(env.world_size) + timing['rows'].append(num_rows) + timing['max_value'].append(max_val) + timing['rank'].append(i) + timing['avg_t'].append(avg_t) + timing['tot_l'].append(tot_l) StopWatch.stop(f"slice_{i}_{data['host']}_{data['rows']}_{data['it']}") StopWatch.stop(f"slice_total_{data['host']}_{data['rows']}_{data['it']}") @@ -249,6 +287,12 @@ def cylon_slice(data=None): StopWatch.benchmark(tag=str(data), filename=data['output_scaling_filename']) upload_file(file_name=data['output_scaling_filename'], bucket=data['s3_bucket'], object_name=data['s3_stopwatch_object_name']) + + if os.path.exists(data['output_summary_filename']): + pd.DataFrame(timing).to_csv(data['output_summary_filename'], mode='a', index=False, header=False) + else: + pd.DataFrame(timing).to_csv(data['output_summary_filename'], mode='w', index=False, header=True) + upload_file(file_name=data['output_summary_filename'], bucket=data['s3_bucket'], object_name=data['s3_summary_object_name']) @@ -257,28 +301,43 @@ def cylon_slice(data=None): if __name__ == "__main__": parser = argparse.ArgumentParser(description="cylon scaling") + parser.add_argument('-n', dest='rows', type=int, **environ_or_required('ROWS')) + parser.add_argument('-i', dest='it', type=int, **environ_or_required('PARTITIONS')) #10 + parser.add_argument('-u', dest='unique', type=float, **environ_or_required('UNIQUENESS'), help="unique factor") #0.9 + parser.add_argument('-s', dest='scaling', type=str, **environ_or_required('SCALING'), choices=['s', 'w'], help="s=strong w=weak") #w + parser.add_argument('-o', dest='operation', type=str, **environ_or_required('CYLON_OPERATION'), choices=['join', 'sort', 'slice'], help="s=strong w=weak") # w + parser.add_argument('-w', dest='world_size', type=int, help="world size", **environ_or_required('WORLD_SIZE')) + parser.add_argument("-r", dest='redis_host', type=str, help="redis address, default to 127.0.0.1", **environ_or_required('REDIS_HOST')) #127.0.0.1 + parser.add_argument("-p1", dest='redis_port', type=int, help="name of redis port", **environ_or_required('REDIS_PORT')) #6379 + parser.add_argument('-f1', dest='output_scaling_filename', type=str, help="Output filename for scaling results", **environ_or_required('OUTPUT_SCALING_FILENAME')) + parser.add_argument('-f2', dest='output_summary_filename', type=str, help="Output filename for scaling summary results", **environ_or_required('OUTPUT_SUMMARY_FILENAME')) + parser.add_argument('-b', dest='s3_bucket', type=str, help="S3 Bucket Name", **environ_or_required('S3_BUCKET')) + parser.add_argument('-o1', dest='s3_stopwatch_object_name', type=str, help="S3 Object Name", **environ_or_required('S3_STOPWATCH_OBJECT_NAME')) + parser.add_argument('-o2', dest='s3_summary_object_name', type=str, help="S3 Object Name", **environ_or_required('S3_SUMMARY_OBJECT_NAME')) args = vars(parser.parse_args()) + args['host'] = "aws" + if args['operation'] == 'join': print("executing cylon join operation") cylon_join(args) diff --git a/aws/scripts/cylon_scaling_fargate.py b/aws/scripts/cylon_scaling_fargate.py new file mode 100644 index 000000000..df50262da --- /dev/null +++ b/aws/scripts/cylon_scaling_fargate.py @@ -0,0 +1,380 @@ +import time +import argparse + +import pandas as pd +from numpy.random import default_rng +from pycylon.frame import CylonEnv, DataFrame +from cloudmesh.common.StopWatch import StopWatch +from cloudmesh.common.dotdict import dotdict +from cloudmesh.common.Shell import Shell +from cloudmesh.common.util import writefile +from pycylon.net.ucc_config import UCCConfig +from pycylon.net.redis_ucc_oob_context import UCCRedisOOBContext +from pycylon.net.reduce_op import ReduceOp +import boto3 +from botocore.exceptions import ClientError +import os +import requests +import json + +import logging + +def environ_or_required(key): + return ( + {'default': os.environ.get(key)} if os.environ.get(key) + else {'required': True} + ) +def upload_file(file_name, bucket, object_name=None): + """Upload a file to an S3 bucket + + :param file_name: File to upload + :param bucket: Bucket to upload to + :param object_name: S3 object name. If not specified then file_name is used + :return: True if file was uploaded, else False + """ + + # If S3 object_name was not specified, use file_name + if object_name is None: + object_name = os.path.basename(file_name) + + # Upload the file + s3_client = boto3.client('s3') + try: + response = s3_client.upload_file(file_name, bucket, object_name) + except ClientError as e: + logging.error(e) + return False + return True + + +def cylon_join(data=None, ipAddress = None): + global ucc_config + StopWatch.start(f"join_total_{data['host']}_{data['rows']}_{data['it']}") + + if ipAddress is not None: + print("setting UCX_TCP_REMOTE_ADDRESS_OVERRIDE", ipAddress) + os.environ['UCX_TCP_REMOTE_ADDRESS_OVERRIDE'] = ipAddress + + redis_context = UCCRedisOOBContext(data['world_size'], f"tcp://{data['redis_host']}:{data['redis_port']}") + + if redis_context is not None: + ucc_config = UCCConfig(redis_context) + + if ucc_config is None: + print("unable to initialize uccconfig") + + + + env = CylonEnv(config=ucc_config, distributed=True) + + context = env.context + + if context is None: + print("unable to retrieve cylon context") + + communicator = context.get_communicator() + + u = data['unique'] + + if data['scaling'] == 'w': # weak + num_rows = data['rows'] + max_val = num_rows * env.world_size + else: # 's' strong + max_val = data['rows'] + num_rows = int(data['rows'] / env.world_size) + + rng = default_rng(seed=env.rank) + data1 = rng.integers(0, int(max_val * u), size=(num_rows, 2)) + data2 = rng.integers(0, int(max_val * u), size=(num_rows, 2)) + + df1 = DataFrame(pd.DataFrame(data1).add_prefix("col")) + df2 = DataFrame(pd.DataFrame(data2).add_prefix("col")) + + timing = {'scaling': [], 'world': [], 'rows': [], 'max_value': [], 'rank': [], 'avg_t': [], 'tot_l': []} + + for i in range(data['it']): + env.barrier() + StopWatch.start(f"join_{i}_{data['host']}_{data['rows']}_{data['it']}") + t1 = time.time() + df3 = df1.merge(df2, on=[0], algorithm='sort', env=env) + env.barrier() + t2 = time.time() + t = (t2 - t1) * 1000 + # sum_t = comm.reduce(t) + sum_t = communicator.allreduce(t, ReduceOp.SUM) + # tot_l = comm.reduce(len(df3)) + tot_l = communicator.allreduce(len(df3), ReduceOp.SUM) + + if env.rank == 0: + avg_t = sum_t / env.world_size + print("### ", data['scaling'], env.world_size, num_rows, max_val, i, avg_t, tot_l) + timing['scaling'].append(data['scaling']) + timing['world'].append(env.world_size) + timing['rows'].append(num_rows) + timing['max_value'].append(max_val) + timing['rank'].append(i) + timing['avg_t'].append(avg_t) + timing['tot_l'].append(tot_l) + #print("### ", data['scaling'], env.world_size, num_rows, max_val, i, avg_t, tot_l, file=open(data['output_summary_filename'], 'a')) + StopWatch.stop(f"join_{i}_{data['host']}_{data['rows']}_{data['it']}") + + StopWatch.stop(f"join_total_{data['host']}_{data['rows']}_{data['it']}") + + if env.rank == 0: + StopWatch.benchmark(tag=str(data), filename=data['output_scaling_filename']) + upload_file(file_name=data['output_scaling_filename'], bucket=data['s3_bucket'], + object_name=data['s3_stopwatch_object_name']) + + if os.path.exists(data['output_summary_filename']): + pd.DataFrame(timing).to_csv(data['output_summary_filename'], mode='a', index=False, header=False) + else: + pd.DataFrame(timing).to_csv(data['output_summary_filename'], mode='w', index=False, header=True) + + upload_file(file_name=data['output_summary_filename'], bucket=data['s3_bucket'], + object_name=data['s3_summary_object_name']) + + env.finalize() + + +def cylon_sort(data=None): + StopWatch.start(f"sort_total_{data['host']}_{data['rows']}_{data['it']}") + + redis_context = UCCRedisOOBContext(data['world_size'], f"tcp://{data['redis_host']}:{data['redis_port']}") + + if redis_context is not None: + ucc_config = UCCConfig(redis_context) + + if ucc_config is None: + print("unable to initialize uccconfig") + + env = CylonEnv(config=ucc_config, distributed=True) + + context = env.context + + if context is None: + print("unable to retrieve cylon context") + + communicator = context.get_communicator() + + u = data['unique'] + + if data['scaling'] == 'w': # weak + num_rows = data['rows'] + max_val = num_rows * env.world_size + else: # 's' strong + max_val = data['rows'] + num_rows = int(data['rows'] / env.world_size) + + rng = default_rng(seed=env.rank) + data1 = rng.integers(0, int(max_val * u), size=(num_rows, 2)) + + df1 = DataFrame(pd.DataFrame(data1).add_prefix("col")) + + if env.rank == 0: + print("Task# ", data['task']) + + for i in range(data['it']): + env.barrier() + StopWatch.start(f"sort_{i}_{data['host']}_{data['rows']}_{data['it']}") + t1 = time.time() + df3 = df1.sort_values(by=[0], env=env) + env.barrier() + t2 = time.time() + t = (t2 - t1) + sum_t = communicator.allreduce(t, ReduceOp.SUM) + # tot_l = comm.reduce(len(df3)) + tot_l = communicator.allreduce(len(df3), ReduceOp.SUM) + + if env.rank == 0: + avg_t = sum_t / env.world_size + print("### ", data['scaling'], env.world_size, num_rows, max_val, i, avg_t, tot_l) + print("### ", data['scaling'], env.world_size, num_rows, max_val, i, avg_t, tot_l, + file=open(data['output_summary_filename'], 'a')) + + + StopWatch.stop(f"sort_{i}_{data['host']}_{data['rows']}_{data['it']}") + + StopWatch.stop(f"sort_total_{data['host']}_{data['rows']}_{data['it']}") + + if env.rank == 0: + StopWatch.benchmark(tag=str(data), filename=data['output_scaling_filename']) + upload_file(file_name=data['output_scaling_filename'], bucket=data['s3_bucket'], + object_name=data['s3_stopwatch_object_name']) + upload_file(file_name=data['output_summary_filename'], bucket=data['s3_bucket'], + object_name=data['s3_summary_object_name']) + redis_context.clearDB() + + +def cylon_slice(data=None): + StopWatch.start(f"slice_total_{data['host']}_{data['rows']}_{data['it']}") + + redis_context = UCCRedisOOBContext(data['world_size'], f"tcp://{data['redis_host']}:{data['redis_port']}") + + if redis_context is not None: + ucc_config = UCCConfig(redis_context) + + if ucc_config is None: + print("unable to initialize uccconfig") + + env = CylonEnv(config=ucc_config, distributed=True) + + context = env.context + + if context is None: + print("unable to retrieve cylon context") + + communicator = context.get_communicator() + + u = data['unique'] + + if data['scaling'] == 'w': # weak + num_rows = data['rows'] + max_val = num_rows * env.world_size + else: # 's' strong + max_val = data['rows'] + num_rows = int(data['rows'] / env.world_size) + + rng = default_rng(seed=env.rank) + data1 = rng.integers(0, int(max_val * u), size=(num_rows, 2)) + data2 = rng.integers(0, int(max_val * u), size=(num_rows, 2)) + + df1 = DataFrame(pd.DataFrame(data1).add_prefix("col")) + df2 = DataFrame(pd.DataFrame(data2).add_prefix("col")) + + if env.rank == 0: + print("Task# ", data['task']) + + for i in range(data['it']): + env.barrier() + StopWatch.start(f"slice_{i}_{data['host']}_{data['rows']}_{data['it']}") + t1 = time.time() + df3 = df1[0:20000000, env] # distributed slice + # print(df3) + # df3 = df1.merge(df2, on=[0], algorithm='sort', env=env) + env.barrier() + t2 = time.time() + t = (t2 - t1) + sum_t = communicator.allreduce(t, ReduceOp.SUM) + # tot_l = comm.reduce(len(df3)) + tot_l = communicator.allreduce(len(df3), ReduceOp.SUM) + + if env.rank == 0: + avg_t = sum_t / env.world_size + print("### ", data['scaling'], env.world_size, num_rows, max_val, i, avg_t, tot_l) + print("### ", data['scaling'], env.world_size, num_rows, max_val, i, avg_t, tot_l, + file=open(data['output_summary_filename'], 'a')) + StopWatch.stop(f"slice_{i}_{data['host']}_{data['rows']}_{data['it']}") + + StopWatch.stop(f"slice_total_{data['host']}_{data['rows']}_{data['it']}") + + if env.rank == 0: + StopWatch.benchmark(tag=str(data), filename=data['output_scaling_filename']) + upload_file(file_name=data['output_scaling_filename'], bucket=data['s3_bucket'], + object_name=data['s3_stopwatch_object_name']) + upload_file(file_name=data['output_summary_filename'], bucket=data['s3_bucket'], + object_name=data['s3_summary_object_name']) + + env.finalize() + +def get_service_ips(cluster, tasks): + client = boto3.client("ecs", region_name="us-east-1") + + tasks_detail = client.describe_tasks( + cluster=cluster, + tasks=tasks + ) + + # first get the ENIs + enis = [] + for task in tasks_detail.get("tasks", []): + for attachment in task.get("attachments", []): + for detail in attachment.get("details", []): + if detail.get("name") == "networkInterfaceId": + enis.append(detail.get("value")) + + # now the ips + + print("eni: ", enis) + ips = [] + for eni in enis: + eni_resource = boto3.resource("ec2").NetworkInterface(eni) + print("eni_resource", eni_resource) + ips.append(eni_resource.private_ip_address) + + return ips + +def get_ecs_task_arn_cluster(host): + path = "/task" + url = host + path + headers = {"Content-Type": "application/json"} + r = requests.get(url, headers=headers) + print(f"r: {r}") + d_r = json.loads(r.text) + print(d_r) + cluster = d_r["TaskARN"] + taskArn = d_r["Cluster"] + dict = { + "TaskARN": cluster, + "Cluster": taskArn + } + return dict + +if __name__ == "__main__": + parser = argparse.ArgumentParser(description="cylon scaling") + + parser.add_argument('-n', dest='rows', type=int, **environ_or_required('ROWS')) + + parser.add_argument('-i', dest='it', type=int, **environ_or_required('PARTITIONS')) #10 + + parser.add_argument('-u', dest='unique', type=float, **environ_or_required('UNIQUENESS'), help="unique factor") #0.9 + + parser.add_argument('-s', dest='scaling', type=str, **environ_or_required('SCALING'), choices=['s', 'w'], + help="s=strong w=weak") #w + + parser.add_argument('-o', dest='operation', type=str, **environ_or_required('CYLON_OPERATION'), choices=['join', 'sort', 'slice'], + help="s=strong w=weak") # w + + parser.add_argument('-w', dest='world_size', type=int, help="world size", **environ_or_required('WORLD_SIZE')) + + parser.add_argument("-r", dest='redis_host', type=str, help="redis address, default to 127.0.0.1", + **environ_or_required('REDIS_HOST')) #127.0.0.1 + + parser.add_argument("-p1", dest='redis_port', type=int, help="name of redis port", **environ_or_required('REDIS_PORT')) #6379 + + parser.add_argument('-f1', dest='output_scaling_filename', type=str, help="Output filename for scaling results", + **environ_or_required('OUTPUT_SCALING_FILENAME')) + + parser.add_argument('-f2', dest='output_summary_filename', type=str, help="Output filename for scaling summary results", + **environ_or_required('OUTPUT_SUMMARY_FILENAME')) + + parser.add_argument('-b', dest='s3_bucket', type=str, help="S3 Bucket Name", **environ_or_required('S3_BUCKET')) + + parser.add_argument('-o1', dest='s3_stopwatch_object_name', type=str, help="S3 Object Name", **environ_or_required('S3_STOPWATCH_OBJECT_NAME')) + + parser.add_argument('-o2', dest='s3_summary_object_name', type=str, help="S3 Object Name", + **environ_or_required('S3_SUMMARY_OBJECT_NAME')) + + args = vars(parser.parse_args()) + + args['host'] = "aws" + + host = os.environ["ECS_CONTAINER_METADATA_URI_V4"] + data = get_ecs_task_arn_cluster(host) + # This print statement passes the string back to the bash wrapper, don't remove + print("taskARN/Cluster: ", data) + + ips = get_service_ips(data['Cluster'], [data["TaskARN"]]) + + if args['operation'] == 'join': + print("executing cylon join operation") + cylon_join(args, ips[0]) + elif args['operation'] == 'sort': + print("executing cylon sort operation") + cylon_sort(args) + else: + print ("executing cylon slice operation") + cylon_slice(args) + + + # os.system(f"{git} branch | fgrep '*' ") + # os.system(f"{git} rev-parse HEAD") diff --git a/aws/scripts/results-145000000/cylon_scaling_ec2_strong_145000000_16node.txt b/aws/scripts/results-145000000/cylon_scaling_ec2_strong_145000000_16node.txt deleted file mode 100644 index 0aa62291c..000000000 --- a/aws/scripts/results-145000000/cylon_scaling_ec2_strong_145000000_16node.txt +++ /dev/null @@ -1,75 +0,0 @@ - -+---------------------+-------------------------------------------------------------------+ -| Attribute | Value | -|---------------------+-------------------------------------------------------------------| -| BUG_REPORT_URL | "https://bugs.launchpad.net/ubuntu/" | -| DISTRIB_CODENAME | jammy | -| DISTRIB_DESCRIPTION | "Ubuntu 22.04.2 LTS" | -| DISTRIB_ID | Ubuntu | -| DISTRIB_RELEASE | 22.04 | -| HOME_URL | "https://www.ubuntu.com/" | -| ID | ubuntu | -| ID_LIKE | debian | -| NAME | "Ubuntu" | -| PRETTY_NAME | "Ubuntu 22.04.2 LTS" | -| PRIVACY_POLICY_URL | "https://www.ubuntu.com/legal/terms-and-policies/privacy-policy" | -| SUPPORT_URL | "https://help.ubuntu.com/" | -| UBUNTU_CODENAME | jammy | -| VERSION | "22.04.2 LTS (Jammy Jellyfish)" | -| VERSION_CODENAME | jammy | -| VERSION_ID | "22.04" | -| cpu | Intel(R) Xeon(R) Platinum 8124M CPU @ 3.00GHz | -| cpu_cores | 8 | -| cpu_count | 16 | -| cpu_threads | 16 | -| date | 2023-08-17 20:26:30.358977 | -| frequency | scpufreq(current=3409.9529375, min=0.0, max=0.0) | -| mem.active | 1.4 GiB | -| mem.available | 28.5 GiB | -| mem.free | 23.6 GiB | -| mem.inactive | 4.7 GiB | -| mem.percent | 6.4 % | -| mem.total | 30.4 GiB | -| mem.used | 1.5 GiB | -| platform.version | #1 SMP Tue Jun 27 21:49:00 UTC 2023 | -| python | 3.9.17 | packaged by conda-forge | (main, Aug 10 2023, 07:02:31) | -| | [GCC 12.3.0] | -| python.pip | 23.2.1 | -| python.version | 3.9.17 | -| sys.platform | linux | -| uname.machine | x86_64 | -| uname.node | ip-172-31-84-64.ec2.internal | -| uname.processor | x86_64 | -| uname.release | 4.14.318-241.531.amzn2.x86_64 | -| uname.system | Linux | -| uname.version | #1 SMP Tue Jun 27 21:49:00 UTC 2023 | -| user | root | -+---------------------+-------------------------------------------------------------------+ - -+-----------------------------+----------+---------+---------+---------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+-------+------------------------------+--------+-------+-------------------------------------+ -| Name | Status | Time | Sum | Start | tag | msg | Node | User | OS | Version | -|-----------------------------+----------+---------+---------+---------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+-------+------------------------------+--------+-------+-------------------------------------| -| join_total_aws_145000000_10 | ok | 117.427 | 117.427 | 2023-08-17 20:24:32 | {'rows': 145000000, 'it': 10, 'unique': 0.9, 'scaling': 's', 'operation': 'join', 'world_size': 16, 'redis_host': 'cylon-redis.mveu6e.0001.use1.cache.amazonaws.com', 'redis_port': 6379, 'output_scaling_filename': 'cylon_scaling_test_ec2_strong_145000000_16node', 'output_summary_filename': 'cylon_summary_test_ec2_strong_1450000000_16node', 's3_bucket': 'staylor.dev2', 's3_stopwatch_object_name': 'cylon/scaling/ec2/strong/145000000/cylon_scaling_ec2_strong_145000000_16node.txt', 's3_summary_object_name': 'cylon/scaling/ec2/strong/145000000/cylon_summary_test_ec2_strong_145000000_16node.txt', 'host': 'aws'} | | ip-172-31-84-64.ec2.internal | root | Linux | #1 SMP Tue Jun 27 21:49:00 UTC 2023 | -| join_0_aws_145000000_10 | ok | 4.032 | 4.032 | 2023-08-17 20:25:50 | {'rows': 145000000, 'it': 10, 'unique': 0.9, 'scaling': 's', 'operation': 'join', 'world_size': 16, 'redis_host': 'cylon-redis.mveu6e.0001.use1.cache.amazonaws.com', 'redis_port': 6379, 'output_scaling_filename': 'cylon_scaling_test_ec2_strong_145000000_16node', 'output_summary_filename': 'cylon_summary_test_ec2_strong_1450000000_16node', 's3_bucket': 'staylor.dev2', 's3_stopwatch_object_name': 'cylon/scaling/ec2/strong/145000000/cylon_scaling_ec2_strong_145000000_16node.txt', 's3_summary_object_name': 'cylon/scaling/ec2/strong/145000000/cylon_summary_test_ec2_strong_145000000_16node.txt', 'host': 'aws'} | | ip-172-31-84-64.ec2.internal | root | Linux | #1 SMP Tue Jun 27 21:49:00 UTC 2023 | -| join_1_aws_145000000_10 | ok | 3.958 | 3.958 | 2023-08-17 20:25:54 | {'rows': 145000000, 'it': 10, 'unique': 0.9, 'scaling': 's', 'operation': 'join', 'world_size': 16, 'redis_host': 'cylon-redis.mveu6e.0001.use1.cache.amazonaws.com', 'redis_port': 6379, 'output_scaling_filename': 'cylon_scaling_test_ec2_strong_145000000_16node', 'output_summary_filename': 'cylon_summary_test_ec2_strong_1450000000_16node', 's3_bucket': 'staylor.dev2', 's3_stopwatch_object_name': 'cylon/scaling/ec2/strong/145000000/cylon_scaling_ec2_strong_145000000_16node.txt', 's3_summary_object_name': 'cylon/scaling/ec2/strong/145000000/cylon_summary_test_ec2_strong_145000000_16node.txt', 'host': 'aws'} | | ip-172-31-84-64.ec2.internal | root | Linux | #1 SMP Tue Jun 27 21:49:00 UTC 2023 | -| join_2_aws_145000000_10 | ok | 4.009 | 4.009 | 2023-08-17 20:25:58 | {'rows': 145000000, 'it': 10, 'unique': 0.9, 'scaling': 's', 'operation': 'join', 'world_size': 16, 'redis_host': 'cylon-redis.mveu6e.0001.use1.cache.amazonaws.com', 'redis_port': 6379, 'output_scaling_filename': 'cylon_scaling_test_ec2_strong_145000000_16node', 'output_summary_filename': 'cylon_summary_test_ec2_strong_1450000000_16node', 's3_bucket': 'staylor.dev2', 's3_stopwatch_object_name': 'cylon/scaling/ec2/strong/145000000/cylon_scaling_ec2_strong_145000000_16node.txt', 's3_summary_object_name': 'cylon/scaling/ec2/strong/145000000/cylon_summary_test_ec2_strong_145000000_16node.txt', 'host': 'aws'} | | ip-172-31-84-64.ec2.internal | root | Linux | #1 SMP Tue Jun 27 21:49:00 UTC 2023 | -| join_3_aws_145000000_10 | ok | 4.168 | 4.168 | 2023-08-17 20:26:02 | {'rows': 145000000, 'it': 10, 'unique': 0.9, 'scaling': 's', 'operation': 'join', 'world_size': 16, 'redis_host': 'cylon-redis.mveu6e.0001.use1.cache.amazonaws.com', 'redis_port': 6379, 'output_scaling_filename': 'cylon_scaling_test_ec2_strong_145000000_16node', 'output_summary_filename': 'cylon_summary_test_ec2_strong_1450000000_16node', 's3_bucket': 'staylor.dev2', 's3_stopwatch_object_name': 'cylon/scaling/ec2/strong/145000000/cylon_scaling_ec2_strong_145000000_16node.txt', 's3_summary_object_name': 'cylon/scaling/ec2/strong/145000000/cylon_summary_test_ec2_strong_145000000_16node.txt', 'host': 'aws'} | | ip-172-31-84-64.ec2.internal | root | Linux | #1 SMP Tue Jun 27 21:49:00 UTC 2023 | -| join_4_aws_145000000_10 | ok | 3.938 | 3.938 | 2023-08-17 20:26:06 | {'rows': 145000000, 'it': 10, 'unique': 0.9, 'scaling': 's', 'operation': 'join', 'world_size': 16, 'redis_host': 'cylon-redis.mveu6e.0001.use1.cache.amazonaws.com', 'redis_port': 6379, 'output_scaling_filename': 'cylon_scaling_test_ec2_strong_145000000_16node', 'output_summary_filename': 'cylon_summary_test_ec2_strong_1450000000_16node', 's3_bucket': 'staylor.dev2', 's3_stopwatch_object_name': 'cylon/scaling/ec2/strong/145000000/cylon_scaling_ec2_strong_145000000_16node.txt', 's3_summary_object_name': 'cylon/scaling/ec2/strong/145000000/cylon_summary_test_ec2_strong_145000000_16node.txt', 'host': 'aws'} | | ip-172-31-84-64.ec2.internal | root | Linux | #1 SMP Tue Jun 27 21:49:00 UTC 2023 | -| join_5_aws_145000000_10 | ok | 3.96 | 3.96 | 2023-08-17 20:26:10 | {'rows': 145000000, 'it': 10, 'unique': 0.9, 'scaling': 's', 'operation': 'join', 'world_size': 16, 'redis_host': 'cylon-redis.mveu6e.0001.use1.cache.amazonaws.com', 'redis_port': 6379, 'output_scaling_filename': 'cylon_scaling_test_ec2_strong_145000000_16node', 'output_summary_filename': 'cylon_summary_test_ec2_strong_1450000000_16node', 's3_bucket': 'staylor.dev2', 's3_stopwatch_object_name': 'cylon/scaling/ec2/strong/145000000/cylon_scaling_ec2_strong_145000000_16node.txt', 's3_summary_object_name': 'cylon/scaling/ec2/strong/145000000/cylon_summary_test_ec2_strong_145000000_16node.txt', 'host': 'aws'} | | ip-172-31-84-64.ec2.internal | root | Linux | #1 SMP Tue Jun 27 21:49:00 UTC 2023 | -| join_6_aws_145000000_10 | ok | 3.95 | 3.95 | 2023-08-17 20:26:14 | {'rows': 145000000, 'it': 10, 'unique': 0.9, 'scaling': 's', 'operation': 'join', 'world_size': 16, 'redis_host': 'cylon-redis.mveu6e.0001.use1.cache.amazonaws.com', 'redis_port': 6379, 'output_scaling_filename': 'cylon_scaling_test_ec2_strong_145000000_16node', 'output_summary_filename': 'cylon_summary_test_ec2_strong_1450000000_16node', 's3_bucket': 'staylor.dev2', 's3_stopwatch_object_name': 'cylon/scaling/ec2/strong/145000000/cylon_scaling_ec2_strong_145000000_16node.txt', 's3_summary_object_name': 'cylon/scaling/ec2/strong/145000000/cylon_summary_test_ec2_strong_145000000_16node.txt', 'host': 'aws'} | | ip-172-31-84-64.ec2.internal | root | Linux | #1 SMP Tue Jun 27 21:49:00 UTC 2023 | -| join_7_aws_145000000_10 | ok | 3.934 | 3.934 | 2023-08-17 20:26:18 | {'rows': 145000000, 'it': 10, 'unique': 0.9, 'scaling': 's', 'operation': 'join', 'world_size': 16, 'redis_host': 'cylon-redis.mveu6e.0001.use1.cache.amazonaws.com', 'redis_port': 6379, 'output_scaling_filename': 'cylon_scaling_test_ec2_strong_145000000_16node', 'output_summary_filename': 'cylon_summary_test_ec2_strong_1450000000_16node', 's3_bucket': 'staylor.dev2', 's3_stopwatch_object_name': 'cylon/scaling/ec2/strong/145000000/cylon_scaling_ec2_strong_145000000_16node.txt', 's3_summary_object_name': 'cylon/scaling/ec2/strong/145000000/cylon_summary_test_ec2_strong_145000000_16node.txt', 'host': 'aws'} | | ip-172-31-84-64.ec2.internal | root | Linux | #1 SMP Tue Jun 27 21:49:00 UTC 2023 | -| join_8_aws_145000000_10 | ok | 4.016 | 4.016 | 2023-08-17 20:26:22 | {'rows': 145000000, 'it': 10, 'unique': 0.9, 'scaling': 's', 'operation': 'join', 'world_size': 16, 'redis_host': 'cylon-redis.mveu6e.0001.use1.cache.amazonaws.com', 'redis_port': 6379, 'output_scaling_filename': 'cylon_scaling_test_ec2_strong_145000000_16node', 'output_summary_filename': 'cylon_summary_test_ec2_strong_1450000000_16node', 's3_bucket': 'staylor.dev2', 's3_stopwatch_object_name': 'cylon/scaling/ec2/strong/145000000/cylon_scaling_ec2_strong_145000000_16node.txt', 's3_summary_object_name': 'cylon/scaling/ec2/strong/145000000/cylon_summary_test_ec2_strong_145000000_16node.txt', 'host': 'aws'} | | ip-172-31-84-64.ec2.internal | root | Linux | #1 SMP Tue Jun 27 21:49:00 UTC 2023 | -| join_9_aws_145000000_10 | ok | 3.966 | 3.966 | 2023-08-17 20:26:26 | {'rows': 145000000, 'it': 10, 'unique': 0.9, 'scaling': 's', 'operation': 'join', 'world_size': 16, 'redis_host': 'cylon-redis.mveu6e.0001.use1.cache.amazonaws.com', 'redis_port': 6379, 'output_scaling_filename': 'cylon_scaling_test_ec2_strong_145000000_16node', 'output_summary_filename': 'cylon_summary_test_ec2_strong_1450000000_16node', 's3_bucket': 'staylor.dev2', 's3_stopwatch_object_name': 'cylon/scaling/ec2/strong/145000000/cylon_scaling_ec2_strong_145000000_16node.txt', 's3_summary_object_name': 'cylon/scaling/ec2/strong/145000000/cylon_summary_test_ec2_strong_145000000_16node.txt', 'host': 'aws'} | | ip-172-31-84-64.ec2.internal | root | Linux | #1 SMP Tue Jun 27 21:49:00 UTC 2023 | -+-----------------------------+----------+---------+---------+---------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+-------+------------------------------+--------+-------+-------------------------------------+ -# csv,timer,status,time,sum,start,tag,msg,uname.node,user,uname.system,platform.version -# csv,join_total_aws_145000000_10,ok,117.427,117.427,2023-08-17 20:24:32,{'rows': 145000000, 'it': 10, 'unique': 0.9, 'scaling': 's', 'operation': 'join', 'world_size': 16, 'redis_host': 'cylon-redis.mveu6e.0001.use1.cache.amazonaws.com', 'redis_port': 6379, 'output_scaling_filename': 'cylon_scaling_test_ec2_strong_145000000_16node', 'output_summary_filename': 'cylon_summary_test_ec2_strong_1450000000_16node', 's3_bucket': 'staylor.dev2', 's3_stopwatch_object_name': 'cylon/scaling/ec2/strong/145000000/cylon_scaling_ec2_strong_145000000_16node.txt', 's3_summary_object_name': 'cylon/scaling/ec2/strong/145000000/cylon_summary_test_ec2_strong_145000000_16node.txt', 'host': 'aws'},None,ip-172-31-84-64.ec2.internal,root,Linux,#1 SMP Tue Jun 27 21:49:00 UTC 2023 -# csv,join_0_aws_145000000_10,ok,4.032,4.032,2023-08-17 20:25:50,{'rows': 145000000, 'it': 10, 'unique': 0.9, 'scaling': 's', 'operation': 'join', 'world_size': 16, 'redis_host': 'cylon-redis.mveu6e.0001.use1.cache.amazonaws.com', 'redis_port': 6379, 'output_scaling_filename': 'cylon_scaling_test_ec2_strong_145000000_16node', 'output_summary_filename': 'cylon_summary_test_ec2_strong_1450000000_16node', 's3_bucket': 'staylor.dev2', 's3_stopwatch_object_name': 'cylon/scaling/ec2/strong/145000000/cylon_scaling_ec2_strong_145000000_16node.txt', 's3_summary_object_name': 'cylon/scaling/ec2/strong/145000000/cylon_summary_test_ec2_strong_145000000_16node.txt', 'host': 'aws'},None,ip-172-31-84-64.ec2.internal,root,Linux,#1 SMP Tue Jun 27 21:49:00 UTC 2023 -# csv,join_1_aws_145000000_10,ok,3.958,3.958,2023-08-17 20:25:54,{'rows': 145000000, 'it': 10, 'unique': 0.9, 'scaling': 's', 'operation': 'join', 'world_size': 16, 'redis_host': 'cylon-redis.mveu6e.0001.use1.cache.amazonaws.com', 'redis_port': 6379, 'output_scaling_filename': 'cylon_scaling_test_ec2_strong_145000000_16node', 'output_summary_filename': 'cylon_summary_test_ec2_strong_1450000000_16node', 's3_bucket': 'staylor.dev2', 's3_stopwatch_object_name': 'cylon/scaling/ec2/strong/145000000/cylon_scaling_ec2_strong_145000000_16node.txt', 's3_summary_object_name': 'cylon/scaling/ec2/strong/145000000/cylon_summary_test_ec2_strong_145000000_16node.txt', 'host': 'aws'},None,ip-172-31-84-64.ec2.internal,root,Linux,#1 SMP Tue Jun 27 21:49:00 UTC 2023 -# csv,join_2_aws_145000000_10,ok,4.009,4.009,2023-08-17 20:25:58,{'rows': 145000000, 'it': 10, 'unique': 0.9, 'scaling': 's', 'operation': 'join', 'world_size': 16, 'redis_host': 'cylon-redis.mveu6e.0001.use1.cache.amazonaws.com', 'redis_port': 6379, 'output_scaling_filename': 'cylon_scaling_test_ec2_strong_145000000_16node', 'output_summary_filename': 'cylon_summary_test_ec2_strong_1450000000_16node', 's3_bucket': 'staylor.dev2', 's3_stopwatch_object_name': 'cylon/scaling/ec2/strong/145000000/cylon_scaling_ec2_strong_145000000_16node.txt', 's3_summary_object_name': 'cylon/scaling/ec2/strong/145000000/cylon_summary_test_ec2_strong_145000000_16node.txt', 'host': 'aws'},None,ip-172-31-84-64.ec2.internal,root,Linux,#1 SMP Tue Jun 27 21:49:00 UTC 2023 -# csv,join_3_aws_145000000_10,ok,4.168,4.168,2023-08-17 20:26:02,{'rows': 145000000, 'it': 10, 'unique': 0.9, 'scaling': 's', 'operation': 'join', 'world_size': 16, 'redis_host': 'cylon-redis.mveu6e.0001.use1.cache.amazonaws.com', 'redis_port': 6379, 'output_scaling_filename': 'cylon_scaling_test_ec2_strong_145000000_16node', 'output_summary_filename': 'cylon_summary_test_ec2_strong_1450000000_16node', 's3_bucket': 'staylor.dev2', 's3_stopwatch_object_name': 'cylon/scaling/ec2/strong/145000000/cylon_scaling_ec2_strong_145000000_16node.txt', 's3_summary_object_name': 'cylon/scaling/ec2/strong/145000000/cylon_summary_test_ec2_strong_145000000_16node.txt', 'host': 'aws'},None,ip-172-31-84-64.ec2.internal,root,Linux,#1 SMP Tue Jun 27 21:49:00 UTC 2023 -# csv,join_4_aws_145000000_10,ok,3.938,3.938,2023-08-17 20:26:06,{'rows': 145000000, 'it': 10, 'unique': 0.9, 'scaling': 's', 'operation': 'join', 'world_size': 16, 'redis_host': 'cylon-redis.mveu6e.0001.use1.cache.amazonaws.com', 'redis_port': 6379, 'output_scaling_filename': 'cylon_scaling_test_ec2_strong_145000000_16node', 'output_summary_filename': 'cylon_summary_test_ec2_strong_1450000000_16node', 's3_bucket': 'staylor.dev2', 's3_stopwatch_object_name': 'cylon/scaling/ec2/strong/145000000/cylon_scaling_ec2_strong_145000000_16node.txt', 's3_summary_object_name': 'cylon/scaling/ec2/strong/145000000/cylon_summary_test_ec2_strong_145000000_16node.txt', 'host': 'aws'},None,ip-172-31-84-64.ec2.internal,root,Linux,#1 SMP Tue Jun 27 21:49:00 UTC 2023 -# csv,join_5_aws_145000000_10,ok,3.96,3.96,2023-08-17 20:26:10,{'rows': 145000000, 'it': 10, 'unique': 0.9, 'scaling': 's', 'operation': 'join', 'world_size': 16, 'redis_host': 'cylon-redis.mveu6e.0001.use1.cache.amazonaws.com', 'redis_port': 6379, 'output_scaling_filename': 'cylon_scaling_test_ec2_strong_145000000_16node', 'output_summary_filename': 'cylon_summary_test_ec2_strong_1450000000_16node', 's3_bucket': 'staylor.dev2', 's3_stopwatch_object_name': 'cylon/scaling/ec2/strong/145000000/cylon_scaling_ec2_strong_145000000_16node.txt', 's3_summary_object_name': 'cylon/scaling/ec2/strong/145000000/cylon_summary_test_ec2_strong_145000000_16node.txt', 'host': 'aws'},None,ip-172-31-84-64.ec2.internal,root,Linux,#1 SMP Tue Jun 27 21:49:00 UTC 2023 -# csv,join_6_aws_145000000_10,ok,3.95,3.95,2023-08-17 20:26:14,{'rows': 145000000, 'it': 10, 'unique': 0.9, 'scaling': 's', 'operation': 'join', 'world_size': 16, 'redis_host': 'cylon-redis.mveu6e.0001.use1.cache.amazonaws.com', 'redis_port': 6379, 'output_scaling_filename': 'cylon_scaling_test_ec2_strong_145000000_16node', 'output_summary_filename': 'cylon_summary_test_ec2_strong_1450000000_16node', 's3_bucket': 'staylor.dev2', 's3_stopwatch_object_name': 'cylon/scaling/ec2/strong/145000000/cylon_scaling_ec2_strong_145000000_16node.txt', 's3_summary_object_name': 'cylon/scaling/ec2/strong/145000000/cylon_summary_test_ec2_strong_145000000_16node.txt', 'host': 'aws'},None,ip-172-31-84-64.ec2.internal,root,Linux,#1 SMP Tue Jun 27 21:49:00 UTC 2023 -# csv,join_7_aws_145000000_10,ok,3.934,3.934,2023-08-17 20:26:18,{'rows': 145000000, 'it': 10, 'unique': 0.9, 'scaling': 's', 'operation': 'join', 'world_size': 16, 'redis_host': 'cylon-redis.mveu6e.0001.use1.cache.amazonaws.com', 'redis_port': 6379, 'output_scaling_filename': 'cylon_scaling_test_ec2_strong_145000000_16node', 'output_summary_filename': 'cylon_summary_test_ec2_strong_1450000000_16node', 's3_bucket': 'staylor.dev2', 's3_stopwatch_object_name': 'cylon/scaling/ec2/strong/145000000/cylon_scaling_ec2_strong_145000000_16node.txt', 's3_summary_object_name': 'cylon/scaling/ec2/strong/145000000/cylon_summary_test_ec2_strong_145000000_16node.txt', 'host': 'aws'},None,ip-172-31-84-64.ec2.internal,root,Linux,#1 SMP Tue Jun 27 21:49:00 UTC 2023 -# csv,join_8_aws_145000000_10,ok,4.016,4.016,2023-08-17 20:26:22,{'rows': 145000000, 'it': 10, 'unique': 0.9, 'scaling': 's', 'operation': 'join', 'world_size': 16, 'redis_host': 'cylon-redis.mveu6e.0001.use1.cache.amazonaws.com', 'redis_port': 6379, 'output_scaling_filename': 'cylon_scaling_test_ec2_strong_145000000_16node', 'output_summary_filename': 'cylon_summary_test_ec2_strong_1450000000_16node', 's3_bucket': 'staylor.dev2', 's3_stopwatch_object_name': 'cylon/scaling/ec2/strong/145000000/cylon_scaling_ec2_strong_145000000_16node.txt', 's3_summary_object_name': 'cylon/scaling/ec2/strong/145000000/cylon_summary_test_ec2_strong_145000000_16node.txt', 'host': 'aws'},None,ip-172-31-84-64.ec2.internal,root,Linux,#1 SMP Tue Jun 27 21:49:00 UTC 2023 -# csv,join_9_aws_145000000_10,ok,3.966,3.966,2023-08-17 20:26:26,{'rows': 145000000, 'it': 10, 'unique': 0.9, 'scaling': 's', 'operation': 'join', 'world_size': 16, 'redis_host': 'cylon-redis.mveu6e.0001.use1.cache.amazonaws.com', 'redis_port': 6379, 'output_scaling_filename': 'cylon_scaling_test_ec2_strong_145000000_16node', 'output_summary_filename': 'cylon_summary_test_ec2_strong_1450000000_16node', 's3_bucket': 'staylor.dev2', 's3_stopwatch_object_name': 'cylon/scaling/ec2/strong/145000000/cylon_scaling_ec2_strong_145000000_16node.txt', 's3_summary_object_name': 'cylon/scaling/ec2/strong/145000000/cylon_summary_test_ec2_strong_145000000_16node.txt', 'host': 'aws'},None,ip-172-31-84-64.ec2.internal,root,Linux,#1 SMP Tue Jun 27 21:49:00 UTC 2023 diff --git a/aws/scripts/results-145000000/cylon_scaling_ec2_strong_145000000_1node.txt b/aws/scripts/results-145000000/cylon_scaling_ec2_strong_145000000_1node.txt deleted file mode 100644 index 735e9b9ec..000000000 --- a/aws/scripts/results-145000000/cylon_scaling_ec2_strong_145000000_1node.txt +++ /dev/null @@ -1,75 +0,0 @@ - -+---------------------+-------------------------------------------------------------------+ -| Attribute | Value | -|---------------------+-------------------------------------------------------------------| -| BUG_REPORT_URL | "https://bugs.launchpad.net/ubuntu/" | -| DISTRIB_CODENAME | jammy | -| DISTRIB_DESCRIPTION | "Ubuntu 22.04.2 LTS" | -| DISTRIB_ID | Ubuntu | -| DISTRIB_RELEASE | 22.04 | -| HOME_URL | "https://www.ubuntu.com/" | -| ID | ubuntu | -| ID_LIKE | debian | -| NAME | "Ubuntu" | -| PRETTY_NAME | "Ubuntu 22.04.2 LTS" | -| PRIVACY_POLICY_URL | "https://www.ubuntu.com/legal/terms-and-policies/privacy-policy" | -| SUPPORT_URL | "https://help.ubuntu.com/" | -| UBUNTU_CODENAME | jammy | -| VERSION | "22.04.2 LTS (Jammy Jellyfish)" | -| VERSION_CODENAME | jammy | -| VERSION_ID | "22.04" | -| cpu | Intel(R) Xeon(R) Platinum 8124M CPU @ 3.00GHz | -| cpu_cores | 8 | -| cpu_count | 16 | -| cpu_threads | 16 | -| date | 2023-08-17 19:51:44.964867 | -| frequency | scpufreq(current=3407.9141250000002, min=0.0, max=0.0) | -| mem.active | 14.0 GiB | -| mem.available | 15.8 GiB | -| mem.free | 10.9 GiB | -| mem.inactive | 4.7 GiB | -| mem.percent | 48.1 % | -| mem.total | 30.4 GiB | -| mem.used | 14.2 GiB | -| platform.version | #1 SMP Tue Jun 27 21:49:00 UTC 2023 | -| python | 3.9.17 | packaged by conda-forge | (main, Aug 10 2023, 07:02:31) | -| | [GCC 12.3.0] | -| python.pip | 23.2.1 | -| python.version | 3.9.17 | -| sys.platform | linux | -| uname.machine | x86_64 | -| uname.node | ip-172-31-85-157.ec2.internal | -| uname.processor | x86_64 | -| uname.release | 4.14.318-241.531.amzn2.x86_64 | -| uname.system | Linux | -| uname.version | #1 SMP Tue Jun 27 21:49:00 UTC 2023 | -| user | root | -+---------------------+-------------------------------------------------------------------+ - -+-----------------------------+----------+---------+---------+---------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+-------+-------------------------------+--------+-------+-------------------------------------+ -| Name | Status | Time | Sum | Start | tag | msg | Node | User | OS | Version | -|-----------------------------+----------+---------+---------+---------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+-------+-------------------------------+--------+-------+-------------------------------------| -| join_total_aws_145000000_10 | ok | 570.749 | 570.749 | 2023-08-17 19:42:13 | {'rows': 145000000, 'it': 10, 'unique': 0.9, 'scaling': 's', 'operation': 'join', 'world_size': 1, 'redis_host': 'cylon-redis.mveu6e.0001.use1.cache.amazonaws.com', 'redis_port': 6379, 'output_scaling_filename': 'cylon_scaling_test_ec2_strong_145000000_1node', 'output_summary_filename': 'cylon_summary_test_ec2_strong_145000000_1node', 's3_bucket': 'staylor.dev2', 's3_stopwatch_object_name': 'cylon/scaling/ec2/strong/145000000/cylon_scaling_ec2_strong_145000000_1node.txt', 's3_summary_object_name': 'cylon/scaling/ec2/strong/145000000/cylon_summary_test_ec2_strong_145000000_1node.txt', 'host': 'aws'} | | ip-172-31-85-157.ec2.internal | root | Linux | #1 SMP Tue Jun 27 21:49:00 UTC 2023 | -| join_0_aws_145000000_10 | ok | 56.413 | 56.413 | 2023-08-17 19:42:18 | {'rows': 145000000, 'it': 10, 'unique': 0.9, 'scaling': 's', 'operation': 'join', 'world_size': 1, 'redis_host': 'cylon-redis.mveu6e.0001.use1.cache.amazonaws.com', 'redis_port': 6379, 'output_scaling_filename': 'cylon_scaling_test_ec2_strong_145000000_1node', 'output_summary_filename': 'cylon_summary_test_ec2_strong_145000000_1node', 's3_bucket': 'staylor.dev2', 's3_stopwatch_object_name': 'cylon/scaling/ec2/strong/145000000/cylon_scaling_ec2_strong_145000000_1node.txt', 's3_summary_object_name': 'cylon/scaling/ec2/strong/145000000/cylon_summary_test_ec2_strong_145000000_1node.txt', 'host': 'aws'} | | ip-172-31-85-157.ec2.internal | root | Linux | #1 SMP Tue Jun 27 21:49:00 UTC 2023 | -| join_1_aws_145000000_10 | ok | 56.52 | 56.52 | 2023-08-17 19:43:14 | {'rows': 145000000, 'it': 10, 'unique': 0.9, 'scaling': 's', 'operation': 'join', 'world_size': 1, 'redis_host': 'cylon-redis.mveu6e.0001.use1.cache.amazonaws.com', 'redis_port': 6379, 'output_scaling_filename': 'cylon_scaling_test_ec2_strong_145000000_1node', 'output_summary_filename': 'cylon_summary_test_ec2_strong_145000000_1node', 's3_bucket': 'staylor.dev2', 's3_stopwatch_object_name': 'cylon/scaling/ec2/strong/145000000/cylon_scaling_ec2_strong_145000000_1node.txt', 's3_summary_object_name': 'cylon/scaling/ec2/strong/145000000/cylon_summary_test_ec2_strong_145000000_1node.txt', 'host': 'aws'} | | ip-172-31-85-157.ec2.internal | root | Linux | #1 SMP Tue Jun 27 21:49:00 UTC 2023 | -| join_2_aws_145000000_10 | ok | 56.702 | 56.702 | 2023-08-17 19:44:11 | {'rows': 145000000, 'it': 10, 'unique': 0.9, 'scaling': 's', 'operation': 'join', 'world_size': 1, 'redis_host': 'cylon-redis.mveu6e.0001.use1.cache.amazonaws.com', 'redis_port': 6379, 'output_scaling_filename': 'cylon_scaling_test_ec2_strong_145000000_1node', 'output_summary_filename': 'cylon_summary_test_ec2_strong_145000000_1node', 's3_bucket': 'staylor.dev2', 's3_stopwatch_object_name': 'cylon/scaling/ec2/strong/145000000/cylon_scaling_ec2_strong_145000000_1node.txt', 's3_summary_object_name': 'cylon/scaling/ec2/strong/145000000/cylon_summary_test_ec2_strong_145000000_1node.txt', 'host': 'aws'} | | ip-172-31-85-157.ec2.internal | root | Linux | #1 SMP Tue Jun 27 21:49:00 UTC 2023 | -| join_3_aws_145000000_10 | ok | 56.717 | 56.717 | 2023-08-17 19:45:08 | {'rows': 145000000, 'it': 10, 'unique': 0.9, 'scaling': 's', 'operation': 'join', 'world_size': 1, 'redis_host': 'cylon-redis.mveu6e.0001.use1.cache.amazonaws.com', 'redis_port': 6379, 'output_scaling_filename': 'cylon_scaling_test_ec2_strong_145000000_1node', 'output_summary_filename': 'cylon_summary_test_ec2_strong_145000000_1node', 's3_bucket': 'staylor.dev2', 's3_stopwatch_object_name': 'cylon/scaling/ec2/strong/145000000/cylon_scaling_ec2_strong_145000000_1node.txt', 's3_summary_object_name': 'cylon/scaling/ec2/strong/145000000/cylon_summary_test_ec2_strong_145000000_1node.txt', 'host': 'aws'} | | ip-172-31-85-157.ec2.internal | root | Linux | #1 SMP Tue Jun 27 21:49:00 UTC 2023 | -| join_4_aws_145000000_10 | ok | 56.617 | 56.617 | 2023-08-17 19:46:04 | {'rows': 145000000, 'it': 10, 'unique': 0.9, 'scaling': 's', 'operation': 'join', 'world_size': 1, 'redis_host': 'cylon-redis.mveu6e.0001.use1.cache.amazonaws.com', 'redis_port': 6379, 'output_scaling_filename': 'cylon_scaling_test_ec2_strong_145000000_1node', 'output_summary_filename': 'cylon_summary_test_ec2_strong_145000000_1node', 's3_bucket': 'staylor.dev2', 's3_stopwatch_object_name': 'cylon/scaling/ec2/strong/145000000/cylon_scaling_ec2_strong_145000000_1node.txt', 's3_summary_object_name': 'cylon/scaling/ec2/strong/145000000/cylon_summary_test_ec2_strong_145000000_1node.txt', 'host': 'aws'} | | ip-172-31-85-157.ec2.internal | root | Linux | #1 SMP Tue Jun 27 21:49:00 UTC 2023 | -| join_5_aws_145000000_10 | ok | 56.766 | 56.766 | 2023-08-17 19:47:01 | {'rows': 145000000, 'it': 10, 'unique': 0.9, 'scaling': 's', 'operation': 'join', 'world_size': 1, 'redis_host': 'cylon-redis.mveu6e.0001.use1.cache.amazonaws.com', 'redis_port': 6379, 'output_scaling_filename': 'cylon_scaling_test_ec2_strong_145000000_1node', 'output_summary_filename': 'cylon_summary_test_ec2_strong_145000000_1node', 's3_bucket': 'staylor.dev2', 's3_stopwatch_object_name': 'cylon/scaling/ec2/strong/145000000/cylon_scaling_ec2_strong_145000000_1node.txt', 's3_summary_object_name': 'cylon/scaling/ec2/strong/145000000/cylon_summary_test_ec2_strong_145000000_1node.txt', 'host': 'aws'} | | ip-172-31-85-157.ec2.internal | root | Linux | #1 SMP Tue Jun 27 21:49:00 UTC 2023 | -| join_6_aws_145000000_10 | ok | 56.604 | 56.604 | 2023-08-17 19:47:58 | {'rows': 145000000, 'it': 10, 'unique': 0.9, 'scaling': 's', 'operation': 'join', 'world_size': 1, 'redis_host': 'cylon-redis.mveu6e.0001.use1.cache.amazonaws.com', 'redis_port': 6379, 'output_scaling_filename': 'cylon_scaling_test_ec2_strong_145000000_1node', 'output_summary_filename': 'cylon_summary_test_ec2_strong_145000000_1node', 's3_bucket': 'staylor.dev2', 's3_stopwatch_object_name': 'cylon/scaling/ec2/strong/145000000/cylon_scaling_ec2_strong_145000000_1node.txt', 's3_summary_object_name': 'cylon/scaling/ec2/strong/145000000/cylon_summary_test_ec2_strong_145000000_1node.txt', 'host': 'aws'} | | ip-172-31-85-157.ec2.internal | root | Linux | #1 SMP Tue Jun 27 21:49:00 UTC 2023 | -| join_7_aws_145000000_10 | ok | 56.641 | 56.641 | 2023-08-17 19:48:54 | {'rows': 145000000, 'it': 10, 'unique': 0.9, 'scaling': 's', 'operation': 'join', 'world_size': 1, 'redis_host': 'cylon-redis.mveu6e.0001.use1.cache.amazonaws.com', 'redis_port': 6379, 'output_scaling_filename': 'cylon_scaling_test_ec2_strong_145000000_1node', 'output_summary_filename': 'cylon_summary_test_ec2_strong_145000000_1node', 's3_bucket': 'staylor.dev2', 's3_stopwatch_object_name': 'cylon/scaling/ec2/strong/145000000/cylon_scaling_ec2_strong_145000000_1node.txt', 's3_summary_object_name': 'cylon/scaling/ec2/strong/145000000/cylon_summary_test_ec2_strong_145000000_1node.txt', 'host': 'aws'} | | ip-172-31-85-157.ec2.internal | root | Linux | #1 SMP Tue Jun 27 21:49:00 UTC 2023 | -| join_8_aws_145000000_10 | ok | 56.554 | 56.554 | 2023-08-17 19:49:51 | {'rows': 145000000, 'it': 10, 'unique': 0.9, 'scaling': 's', 'operation': 'join', 'world_size': 1, 'redis_host': 'cylon-redis.mveu6e.0001.use1.cache.amazonaws.com', 'redis_port': 6379, 'output_scaling_filename': 'cylon_scaling_test_ec2_strong_145000000_1node', 'output_summary_filename': 'cylon_summary_test_ec2_strong_145000000_1node', 's3_bucket': 'staylor.dev2', 's3_stopwatch_object_name': 'cylon/scaling/ec2/strong/145000000/cylon_scaling_ec2_strong_145000000_1node.txt', 's3_summary_object_name': 'cylon/scaling/ec2/strong/145000000/cylon_summary_test_ec2_strong_145000000_1node.txt', 'host': 'aws'} | | ip-172-31-85-157.ec2.internal | root | Linux | #1 SMP Tue Jun 27 21:49:00 UTC 2023 | -| join_9_aws_145000000_10 | ok | 56.589 | 56.589 | 2023-08-17 19:50:48 | {'rows': 145000000, 'it': 10, 'unique': 0.9, 'scaling': 's', 'operation': 'join', 'world_size': 1, 'redis_host': 'cylon-redis.mveu6e.0001.use1.cache.amazonaws.com', 'redis_port': 6379, 'output_scaling_filename': 'cylon_scaling_test_ec2_strong_145000000_1node', 'output_summary_filename': 'cylon_summary_test_ec2_strong_145000000_1node', 's3_bucket': 'staylor.dev2', 's3_stopwatch_object_name': 'cylon/scaling/ec2/strong/145000000/cylon_scaling_ec2_strong_145000000_1node.txt', 's3_summary_object_name': 'cylon/scaling/ec2/strong/145000000/cylon_summary_test_ec2_strong_145000000_1node.txt', 'host': 'aws'} | | ip-172-31-85-157.ec2.internal | root | Linux | #1 SMP Tue Jun 27 21:49:00 UTC 2023 | -+-----------------------------+----------+---------+---------+---------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+-------+-------------------------------+--------+-------+-------------------------------------+ -# csv,timer,status,time,sum,start,tag,msg,uname.node,user,uname.system,platform.version -# csv,join_total_aws_145000000_10,ok,570.749,570.749,2023-08-17 19:42:13,{'rows': 145000000, 'it': 10, 'unique': 0.9, 'scaling': 's', 'operation': 'join', 'world_size': 1, 'redis_host': 'cylon-redis.mveu6e.0001.use1.cache.amazonaws.com', 'redis_port': 6379, 'output_scaling_filename': 'cylon_scaling_test_ec2_strong_145000000_1node', 'output_summary_filename': 'cylon_summary_test_ec2_strong_145000000_1node', 's3_bucket': 'staylor.dev2', 's3_stopwatch_object_name': 'cylon/scaling/ec2/strong/145000000/cylon_scaling_ec2_strong_145000000_1node.txt', 's3_summary_object_name': 'cylon/scaling/ec2/strong/145000000/cylon_summary_test_ec2_strong_145000000_1node.txt', 'host': 'aws'},None,ip-172-31-85-157.ec2.internal,root,Linux,#1 SMP Tue Jun 27 21:49:00 UTC 2023 -# csv,join_0_aws_145000000_10,ok,56.413,56.413,2023-08-17 19:42:18,{'rows': 145000000, 'it': 10, 'unique': 0.9, 'scaling': 's', 'operation': 'join', 'world_size': 1, 'redis_host': 'cylon-redis.mveu6e.0001.use1.cache.amazonaws.com', 'redis_port': 6379, 'output_scaling_filename': 'cylon_scaling_test_ec2_strong_145000000_1node', 'output_summary_filename': 'cylon_summary_test_ec2_strong_145000000_1node', 's3_bucket': 'staylor.dev2', 's3_stopwatch_object_name': 'cylon/scaling/ec2/strong/145000000/cylon_scaling_ec2_strong_145000000_1node.txt', 's3_summary_object_name': 'cylon/scaling/ec2/strong/145000000/cylon_summary_test_ec2_strong_145000000_1node.txt', 'host': 'aws'},None,ip-172-31-85-157.ec2.internal,root,Linux,#1 SMP Tue Jun 27 21:49:00 UTC 2023 -# csv,join_1_aws_145000000_10,ok,56.52,56.52,2023-08-17 19:43:14,{'rows': 145000000, 'it': 10, 'unique': 0.9, 'scaling': 's', 'operation': 'join', 'world_size': 1, 'redis_host': 'cylon-redis.mveu6e.0001.use1.cache.amazonaws.com', 'redis_port': 6379, 'output_scaling_filename': 'cylon_scaling_test_ec2_strong_145000000_1node', 'output_summary_filename': 'cylon_summary_test_ec2_strong_145000000_1node', 's3_bucket': 'staylor.dev2', 's3_stopwatch_object_name': 'cylon/scaling/ec2/strong/145000000/cylon_scaling_ec2_strong_145000000_1node.txt', 's3_summary_object_name': 'cylon/scaling/ec2/strong/145000000/cylon_summary_test_ec2_strong_145000000_1node.txt', 'host': 'aws'},None,ip-172-31-85-157.ec2.internal,root,Linux,#1 SMP Tue Jun 27 21:49:00 UTC 2023 -# csv,join_2_aws_145000000_10,ok,56.702,56.702,2023-08-17 19:44:11,{'rows': 145000000, 'it': 10, 'unique': 0.9, 'scaling': 's', 'operation': 'join', 'world_size': 1, 'redis_host': 'cylon-redis.mveu6e.0001.use1.cache.amazonaws.com', 'redis_port': 6379, 'output_scaling_filename': 'cylon_scaling_test_ec2_strong_145000000_1node', 'output_summary_filename': 'cylon_summary_test_ec2_strong_145000000_1node', 's3_bucket': 'staylor.dev2', 's3_stopwatch_object_name': 'cylon/scaling/ec2/strong/145000000/cylon_scaling_ec2_strong_145000000_1node.txt', 's3_summary_object_name': 'cylon/scaling/ec2/strong/145000000/cylon_summary_test_ec2_strong_145000000_1node.txt', 'host': 'aws'},None,ip-172-31-85-157.ec2.internal,root,Linux,#1 SMP Tue Jun 27 21:49:00 UTC 2023 -# csv,join_3_aws_145000000_10,ok,56.717,56.717,2023-08-17 19:45:08,{'rows': 145000000, 'it': 10, 'unique': 0.9, 'scaling': 's', 'operation': 'join', 'world_size': 1, 'redis_host': 'cylon-redis.mveu6e.0001.use1.cache.amazonaws.com', 'redis_port': 6379, 'output_scaling_filename': 'cylon_scaling_test_ec2_strong_145000000_1node', 'output_summary_filename': 'cylon_summary_test_ec2_strong_145000000_1node', 's3_bucket': 'staylor.dev2', 's3_stopwatch_object_name': 'cylon/scaling/ec2/strong/145000000/cylon_scaling_ec2_strong_145000000_1node.txt', 's3_summary_object_name': 'cylon/scaling/ec2/strong/145000000/cylon_summary_test_ec2_strong_145000000_1node.txt', 'host': 'aws'},None,ip-172-31-85-157.ec2.internal,root,Linux,#1 SMP Tue Jun 27 21:49:00 UTC 2023 -# csv,join_4_aws_145000000_10,ok,56.617,56.617,2023-08-17 19:46:04,{'rows': 145000000, 'it': 10, 'unique': 0.9, 'scaling': 's', 'operation': 'join', 'world_size': 1, 'redis_host': 'cylon-redis.mveu6e.0001.use1.cache.amazonaws.com', 'redis_port': 6379, 'output_scaling_filename': 'cylon_scaling_test_ec2_strong_145000000_1node', 'output_summary_filename': 'cylon_summary_test_ec2_strong_145000000_1node', 's3_bucket': 'staylor.dev2', 's3_stopwatch_object_name': 'cylon/scaling/ec2/strong/145000000/cylon_scaling_ec2_strong_145000000_1node.txt', 's3_summary_object_name': 'cylon/scaling/ec2/strong/145000000/cylon_summary_test_ec2_strong_145000000_1node.txt', 'host': 'aws'},None,ip-172-31-85-157.ec2.internal,root,Linux,#1 SMP Tue Jun 27 21:49:00 UTC 2023 -# csv,join_5_aws_145000000_10,ok,56.766,56.766,2023-08-17 19:47:01,{'rows': 145000000, 'it': 10, 'unique': 0.9, 'scaling': 's', 'operation': 'join', 'world_size': 1, 'redis_host': 'cylon-redis.mveu6e.0001.use1.cache.amazonaws.com', 'redis_port': 6379, 'output_scaling_filename': 'cylon_scaling_test_ec2_strong_145000000_1node', 'output_summary_filename': 'cylon_summary_test_ec2_strong_145000000_1node', 's3_bucket': 'staylor.dev2', 's3_stopwatch_object_name': 'cylon/scaling/ec2/strong/145000000/cylon_scaling_ec2_strong_145000000_1node.txt', 's3_summary_object_name': 'cylon/scaling/ec2/strong/145000000/cylon_summary_test_ec2_strong_145000000_1node.txt', 'host': 'aws'},None,ip-172-31-85-157.ec2.internal,root,Linux,#1 SMP Tue Jun 27 21:49:00 UTC 2023 -# csv,join_6_aws_145000000_10,ok,56.604,56.604,2023-08-17 19:47:58,{'rows': 145000000, 'it': 10, 'unique': 0.9, 'scaling': 's', 'operation': 'join', 'world_size': 1, 'redis_host': 'cylon-redis.mveu6e.0001.use1.cache.amazonaws.com', 'redis_port': 6379, 'output_scaling_filename': 'cylon_scaling_test_ec2_strong_145000000_1node', 'output_summary_filename': 'cylon_summary_test_ec2_strong_145000000_1node', 's3_bucket': 'staylor.dev2', 's3_stopwatch_object_name': 'cylon/scaling/ec2/strong/145000000/cylon_scaling_ec2_strong_145000000_1node.txt', 's3_summary_object_name': 'cylon/scaling/ec2/strong/145000000/cylon_summary_test_ec2_strong_145000000_1node.txt', 'host': 'aws'},None,ip-172-31-85-157.ec2.internal,root,Linux,#1 SMP Tue Jun 27 21:49:00 UTC 2023 -# csv,join_7_aws_145000000_10,ok,56.641,56.641,2023-08-17 19:48:54,{'rows': 145000000, 'it': 10, 'unique': 0.9, 'scaling': 's', 'operation': 'join', 'world_size': 1, 'redis_host': 'cylon-redis.mveu6e.0001.use1.cache.amazonaws.com', 'redis_port': 6379, 'output_scaling_filename': 'cylon_scaling_test_ec2_strong_145000000_1node', 'output_summary_filename': 'cylon_summary_test_ec2_strong_145000000_1node', 's3_bucket': 'staylor.dev2', 's3_stopwatch_object_name': 'cylon/scaling/ec2/strong/145000000/cylon_scaling_ec2_strong_145000000_1node.txt', 's3_summary_object_name': 'cylon/scaling/ec2/strong/145000000/cylon_summary_test_ec2_strong_145000000_1node.txt', 'host': 'aws'},None,ip-172-31-85-157.ec2.internal,root,Linux,#1 SMP Tue Jun 27 21:49:00 UTC 2023 -# csv,join_8_aws_145000000_10,ok,56.554,56.554,2023-08-17 19:49:51,{'rows': 145000000, 'it': 10, 'unique': 0.9, 'scaling': 's', 'operation': 'join', 'world_size': 1, 'redis_host': 'cylon-redis.mveu6e.0001.use1.cache.amazonaws.com', 'redis_port': 6379, 'output_scaling_filename': 'cylon_scaling_test_ec2_strong_145000000_1node', 'output_summary_filename': 'cylon_summary_test_ec2_strong_145000000_1node', 's3_bucket': 'staylor.dev2', 's3_stopwatch_object_name': 'cylon/scaling/ec2/strong/145000000/cylon_scaling_ec2_strong_145000000_1node.txt', 's3_summary_object_name': 'cylon/scaling/ec2/strong/145000000/cylon_summary_test_ec2_strong_145000000_1node.txt', 'host': 'aws'},None,ip-172-31-85-157.ec2.internal,root,Linux,#1 SMP Tue Jun 27 21:49:00 UTC 2023 -# csv,join_9_aws_145000000_10,ok,56.589,56.589,2023-08-17 19:50:48,{'rows': 145000000, 'it': 10, 'unique': 0.9, 'scaling': 's', 'operation': 'join', 'world_size': 1, 'redis_host': 'cylon-redis.mveu6e.0001.use1.cache.amazonaws.com', 'redis_port': 6379, 'output_scaling_filename': 'cylon_scaling_test_ec2_strong_145000000_1node', 'output_summary_filename': 'cylon_summary_test_ec2_strong_145000000_1node', 's3_bucket': 'staylor.dev2', 's3_stopwatch_object_name': 'cylon/scaling/ec2/strong/145000000/cylon_scaling_ec2_strong_145000000_1node.txt', 's3_summary_object_name': 'cylon/scaling/ec2/strong/145000000/cylon_summary_test_ec2_strong_145000000_1node.txt', 'host': 'aws'},None,ip-172-31-85-157.ec2.internal,root,Linux,#1 SMP Tue Jun 27 21:49:00 UTC 2023 diff --git a/aws/scripts/results-145000000/cylon_scaling_ec2_strong_145000000_2node.txt b/aws/scripts/results-145000000/cylon_scaling_ec2_strong_145000000_2node.txt deleted file mode 100644 index 48316cd02..000000000 --- a/aws/scripts/results-145000000/cylon_scaling_ec2_strong_145000000_2node.txt +++ /dev/null @@ -1,75 +0,0 @@ - -+---------------------+-------------------------------------------------------------------+ -| Attribute | Value | -|---------------------+-------------------------------------------------------------------| -| BUG_REPORT_URL | "https://bugs.launchpad.net/ubuntu/" | -| DISTRIB_CODENAME | jammy | -| DISTRIB_DESCRIPTION | "Ubuntu 22.04.2 LTS" | -| DISTRIB_ID | Ubuntu | -| DISTRIB_RELEASE | 22.04 | -| HOME_URL | "https://www.ubuntu.com/" | -| ID | ubuntu | -| ID_LIKE | debian | -| NAME | "Ubuntu" | -| PRETTY_NAME | "Ubuntu 22.04.2 LTS" | -| PRIVACY_POLICY_URL | "https://www.ubuntu.com/legal/terms-and-policies/privacy-policy" | -| SUPPORT_URL | "https://help.ubuntu.com/" | -| UBUNTU_CODENAME | jammy | -| VERSION | "22.04.2 LTS (Jammy Jellyfish)" | -| VERSION_CODENAME | jammy | -| VERSION_ID | "22.04" | -| cpu | Intel(R) Xeon(R) Platinum 8124M CPU @ 3.00GHz | -| cpu_cores | 8 | -| cpu_count | 16 | -| cpu_threads | 16 | -| date | 2023-08-17 20:00:57.494629 | -| frequency | scpufreq(current=3412.046875, min=0.0, max=0.0) | -| mem.active | 7.3 GiB | -| mem.available | 22.5 GiB | -| mem.free | 17.7 GiB | -| mem.inactive | 4.7 GiB | -| mem.percent | 25.9 % | -| mem.total | 30.4 GiB | -| mem.used | 7.4 GiB | -| platform.version | #1 SMP Tue Jun 27 21:49:00 UTC 2023 | -| python | 3.9.17 | packaged by conda-forge | (main, Aug 10 2023, 07:02:31) | -| | [GCC 12.3.0] | -| python.pip | 23.2.1 | -| python.version | 3.9.17 | -| sys.platform | linux | -| uname.machine | x86_64 | -| uname.node | ip-172-31-80-245.ec2.internal | -| uname.processor | x86_64 | -| uname.release | 4.14.318-241.531.amzn2.x86_64 | -| uname.system | Linux | -| uname.version | #1 SMP Tue Jun 27 21:49:00 UTC 2023 | -| user | root | -+---------------------+-------------------------------------------------------------------+ - -+-----------------------------+----------+---------+---------+---------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+-------+-------------------------------+--------+-------+-------------------------------------+ -| Name | Status | Time | Sum | Start | tag | msg | Node | User | OS | Version | -|-----------------------------+----------+---------+---------+---------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+-------+-------------------------------+--------+-------+-------------------------------------| -| join_total_aws_145000000_10 | ok | 408.51 | 408.51 | 2023-08-17 19:54:08 | {'rows': 145000000, 'it': 10, 'unique': 0.9, 'scaling': 's', 'operation': 'join', 'world_size': 2, 'redis_host': 'cylon-redis.mveu6e.0001.use1.cache.amazonaws.com', 'redis_port': 6379, 'output_scaling_filename': 'cylon_scaling_test_ec2_strong_145000000_2node', 'output_summary_filename': 'cylon_summary_test_ec2_strong_145000000_2node', 's3_bucket': 'staylor.dev2', 's3_stopwatch_object_name': 'cylon/scaling/ec2/strong/145000000/cylon_scaling_ec2_strong_145000000_2node.txt', 's3_summary_object_name': 'cylon/scaling/ec2/strong/145000000/cylon_summary_test_ec2_strong_145000000_2node.txt', 'host': 'aws'} | | ip-172-31-80-245.ec2.internal | root | Linux | #1 SMP Tue Jun 27 21:49:00 UTC 2023 | -| join_0_aws_145000000_10 | ok | 33.83 | 33.83 | 2023-08-17 19:55:18 | {'rows': 145000000, 'it': 10, 'unique': 0.9, 'scaling': 's', 'operation': 'join', 'world_size': 2, 'redis_host': 'cylon-redis.mveu6e.0001.use1.cache.amazonaws.com', 'redis_port': 6379, 'output_scaling_filename': 'cylon_scaling_test_ec2_strong_145000000_2node', 'output_summary_filename': 'cylon_summary_test_ec2_strong_145000000_2node', 's3_bucket': 'staylor.dev2', 's3_stopwatch_object_name': 'cylon/scaling/ec2/strong/145000000/cylon_scaling_ec2_strong_145000000_2node.txt', 's3_summary_object_name': 'cylon/scaling/ec2/strong/145000000/cylon_summary_test_ec2_strong_145000000_2node.txt', 'host': 'aws'} | | ip-172-31-80-245.ec2.internal | root | Linux | #1 SMP Tue Jun 27 21:49:00 UTC 2023 | -| join_1_aws_145000000_10 | ok | 33.802 | 33.802 | 2023-08-17 19:55:52 | {'rows': 145000000, 'it': 10, 'unique': 0.9, 'scaling': 's', 'operation': 'join', 'world_size': 2, 'redis_host': 'cylon-redis.mveu6e.0001.use1.cache.amazonaws.com', 'redis_port': 6379, 'output_scaling_filename': 'cylon_scaling_test_ec2_strong_145000000_2node', 'output_summary_filename': 'cylon_summary_test_ec2_strong_145000000_2node', 's3_bucket': 'staylor.dev2', 's3_stopwatch_object_name': 'cylon/scaling/ec2/strong/145000000/cylon_scaling_ec2_strong_145000000_2node.txt', 's3_summary_object_name': 'cylon/scaling/ec2/strong/145000000/cylon_summary_test_ec2_strong_145000000_2node.txt', 'host': 'aws'} | | ip-172-31-80-245.ec2.internal | root | Linux | #1 SMP Tue Jun 27 21:49:00 UTC 2023 | -| join_2_aws_145000000_10 | ok | 34.12 | 34.12 | 2023-08-17 19:56:26 | {'rows': 145000000, 'it': 10, 'unique': 0.9, 'scaling': 's', 'operation': 'join', 'world_size': 2, 'redis_host': 'cylon-redis.mveu6e.0001.use1.cache.amazonaws.com', 'redis_port': 6379, 'output_scaling_filename': 'cylon_scaling_test_ec2_strong_145000000_2node', 'output_summary_filename': 'cylon_summary_test_ec2_strong_145000000_2node', 's3_bucket': 'staylor.dev2', 's3_stopwatch_object_name': 'cylon/scaling/ec2/strong/145000000/cylon_scaling_ec2_strong_145000000_2node.txt', 's3_summary_object_name': 'cylon/scaling/ec2/strong/145000000/cylon_summary_test_ec2_strong_145000000_2node.txt', 'host': 'aws'} | | ip-172-31-80-245.ec2.internal | root | Linux | #1 SMP Tue Jun 27 21:49:00 UTC 2023 | -| join_3_aws_145000000_10 | ok | 33.824 | 33.824 | 2023-08-17 19:57:00 | {'rows': 145000000, 'it': 10, 'unique': 0.9, 'scaling': 's', 'operation': 'join', 'world_size': 2, 'redis_host': 'cylon-redis.mveu6e.0001.use1.cache.amazonaws.com', 'redis_port': 6379, 'output_scaling_filename': 'cylon_scaling_test_ec2_strong_145000000_2node', 'output_summary_filename': 'cylon_summary_test_ec2_strong_145000000_2node', 's3_bucket': 'staylor.dev2', 's3_stopwatch_object_name': 'cylon/scaling/ec2/strong/145000000/cylon_scaling_ec2_strong_145000000_2node.txt', 's3_summary_object_name': 'cylon/scaling/ec2/strong/145000000/cylon_summary_test_ec2_strong_145000000_2node.txt', 'host': 'aws'} | | ip-172-31-80-245.ec2.internal | root | Linux | #1 SMP Tue Jun 27 21:49:00 UTC 2023 | -| join_4_aws_145000000_10 | ok | 33.869 | 33.869 | 2023-08-17 19:57:34 | {'rows': 145000000, 'it': 10, 'unique': 0.9, 'scaling': 's', 'operation': 'join', 'world_size': 2, 'redis_host': 'cylon-redis.mveu6e.0001.use1.cache.amazonaws.com', 'redis_port': 6379, 'output_scaling_filename': 'cylon_scaling_test_ec2_strong_145000000_2node', 'output_summary_filename': 'cylon_summary_test_ec2_strong_145000000_2node', 's3_bucket': 'staylor.dev2', 's3_stopwatch_object_name': 'cylon/scaling/ec2/strong/145000000/cylon_scaling_ec2_strong_145000000_2node.txt', 's3_summary_object_name': 'cylon/scaling/ec2/strong/145000000/cylon_summary_test_ec2_strong_145000000_2node.txt', 'host': 'aws'} | | ip-172-31-80-245.ec2.internal | root | Linux | #1 SMP Tue Jun 27 21:49:00 UTC 2023 | -| join_5_aws_145000000_10 | ok | 33.84 | 33.84 | 2023-08-17 19:58:07 | {'rows': 145000000, 'it': 10, 'unique': 0.9, 'scaling': 's', 'operation': 'join', 'world_size': 2, 'redis_host': 'cylon-redis.mveu6e.0001.use1.cache.amazonaws.com', 'redis_port': 6379, 'output_scaling_filename': 'cylon_scaling_test_ec2_strong_145000000_2node', 'output_summary_filename': 'cylon_summary_test_ec2_strong_145000000_2node', 's3_bucket': 'staylor.dev2', 's3_stopwatch_object_name': 'cylon/scaling/ec2/strong/145000000/cylon_scaling_ec2_strong_145000000_2node.txt', 's3_summary_object_name': 'cylon/scaling/ec2/strong/145000000/cylon_summary_test_ec2_strong_145000000_2node.txt', 'host': 'aws'} | | ip-172-31-80-245.ec2.internal | root | Linux | #1 SMP Tue Jun 27 21:49:00 UTC 2023 | -| join_6_aws_145000000_10 | ok | 33.806 | 33.806 | 2023-08-17 19:58:41 | {'rows': 145000000, 'it': 10, 'unique': 0.9, 'scaling': 's', 'operation': 'join', 'world_size': 2, 'redis_host': 'cylon-redis.mveu6e.0001.use1.cache.amazonaws.com', 'redis_port': 6379, 'output_scaling_filename': 'cylon_scaling_test_ec2_strong_145000000_2node', 'output_summary_filename': 'cylon_summary_test_ec2_strong_145000000_2node', 's3_bucket': 'staylor.dev2', 's3_stopwatch_object_name': 'cylon/scaling/ec2/strong/145000000/cylon_scaling_ec2_strong_145000000_2node.txt', 's3_summary_object_name': 'cylon/scaling/ec2/strong/145000000/cylon_summary_test_ec2_strong_145000000_2node.txt', 'host': 'aws'} | | ip-172-31-80-245.ec2.internal | root | Linux | #1 SMP Tue Jun 27 21:49:00 UTC 2023 | -| join_7_aws_145000000_10 | ok | 33.812 | 33.812 | 2023-08-17 19:59:15 | {'rows': 145000000, 'it': 10, 'unique': 0.9, 'scaling': 's', 'operation': 'join', 'world_size': 2, 'redis_host': 'cylon-redis.mveu6e.0001.use1.cache.amazonaws.com', 'redis_port': 6379, 'output_scaling_filename': 'cylon_scaling_test_ec2_strong_145000000_2node', 'output_summary_filename': 'cylon_summary_test_ec2_strong_145000000_2node', 's3_bucket': 'staylor.dev2', 's3_stopwatch_object_name': 'cylon/scaling/ec2/strong/145000000/cylon_scaling_ec2_strong_145000000_2node.txt', 's3_summary_object_name': 'cylon/scaling/ec2/strong/145000000/cylon_summary_test_ec2_strong_145000000_2node.txt', 'host': 'aws'} | | ip-172-31-80-245.ec2.internal | root | Linux | #1 SMP Tue Jun 27 21:49:00 UTC 2023 | -| join_8_aws_145000000_10 | ok | 33.872 | 33.872 | 2023-08-17 19:59:49 | {'rows': 145000000, 'it': 10, 'unique': 0.9, 'scaling': 's', 'operation': 'join', 'world_size': 2, 'redis_host': 'cylon-redis.mveu6e.0001.use1.cache.amazonaws.com', 'redis_port': 6379, 'output_scaling_filename': 'cylon_scaling_test_ec2_strong_145000000_2node', 'output_summary_filename': 'cylon_summary_test_ec2_strong_145000000_2node', 's3_bucket': 'staylor.dev2', 's3_stopwatch_object_name': 'cylon/scaling/ec2/strong/145000000/cylon_scaling_ec2_strong_145000000_2node.txt', 's3_summary_object_name': 'cylon/scaling/ec2/strong/145000000/cylon_summary_test_ec2_strong_145000000_2node.txt', 'host': 'aws'} | | ip-172-31-80-245.ec2.internal | root | Linux | #1 SMP Tue Jun 27 21:49:00 UTC 2023 | -| join_9_aws_145000000_10 | ok | 34.1 | 34.1 | 2023-08-17 20:00:23 | {'rows': 145000000, 'it': 10, 'unique': 0.9, 'scaling': 's', 'operation': 'join', 'world_size': 2, 'redis_host': 'cylon-redis.mveu6e.0001.use1.cache.amazonaws.com', 'redis_port': 6379, 'output_scaling_filename': 'cylon_scaling_test_ec2_strong_145000000_2node', 'output_summary_filename': 'cylon_summary_test_ec2_strong_145000000_2node', 's3_bucket': 'staylor.dev2', 's3_stopwatch_object_name': 'cylon/scaling/ec2/strong/145000000/cylon_scaling_ec2_strong_145000000_2node.txt', 's3_summary_object_name': 'cylon/scaling/ec2/strong/145000000/cylon_summary_test_ec2_strong_145000000_2node.txt', 'host': 'aws'} | | ip-172-31-80-245.ec2.internal | root | Linux | #1 SMP Tue Jun 27 21:49:00 UTC 2023 | -+-----------------------------+----------+---------+---------+---------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+-------+-------------------------------+--------+-------+-------------------------------------+ -# csv,timer,status,time,sum,start,tag,msg,uname.node,user,uname.system,platform.version -# csv,join_total_aws_145000000_10,ok,408.51,408.51,2023-08-17 19:54:08,{'rows': 145000000, 'it': 10, 'unique': 0.9, 'scaling': 's', 'operation': 'join', 'world_size': 2, 'redis_host': 'cylon-redis.mveu6e.0001.use1.cache.amazonaws.com', 'redis_port': 6379, 'output_scaling_filename': 'cylon_scaling_test_ec2_strong_145000000_2node', 'output_summary_filename': 'cylon_summary_test_ec2_strong_145000000_2node', 's3_bucket': 'staylor.dev2', 's3_stopwatch_object_name': 'cylon/scaling/ec2/strong/145000000/cylon_scaling_ec2_strong_145000000_2node.txt', 's3_summary_object_name': 'cylon/scaling/ec2/strong/145000000/cylon_summary_test_ec2_strong_145000000_2node.txt', 'host': 'aws'},None,ip-172-31-80-245.ec2.internal,root,Linux,#1 SMP Tue Jun 27 21:49:00 UTC 2023 -# csv,join_0_aws_145000000_10,ok,33.83,33.83,2023-08-17 19:55:18,{'rows': 145000000, 'it': 10, 'unique': 0.9, 'scaling': 's', 'operation': 'join', 'world_size': 2, 'redis_host': 'cylon-redis.mveu6e.0001.use1.cache.amazonaws.com', 'redis_port': 6379, 'output_scaling_filename': 'cylon_scaling_test_ec2_strong_145000000_2node', 'output_summary_filename': 'cylon_summary_test_ec2_strong_145000000_2node', 's3_bucket': 'staylor.dev2', 's3_stopwatch_object_name': 'cylon/scaling/ec2/strong/145000000/cylon_scaling_ec2_strong_145000000_2node.txt', 's3_summary_object_name': 'cylon/scaling/ec2/strong/145000000/cylon_summary_test_ec2_strong_145000000_2node.txt', 'host': 'aws'},None,ip-172-31-80-245.ec2.internal,root,Linux,#1 SMP Tue Jun 27 21:49:00 UTC 2023 -# csv,join_1_aws_145000000_10,ok,33.802,33.802,2023-08-17 19:55:52,{'rows': 145000000, 'it': 10, 'unique': 0.9, 'scaling': 's', 'operation': 'join', 'world_size': 2, 'redis_host': 'cylon-redis.mveu6e.0001.use1.cache.amazonaws.com', 'redis_port': 6379, 'output_scaling_filename': 'cylon_scaling_test_ec2_strong_145000000_2node', 'output_summary_filename': 'cylon_summary_test_ec2_strong_145000000_2node', 's3_bucket': 'staylor.dev2', 's3_stopwatch_object_name': 'cylon/scaling/ec2/strong/145000000/cylon_scaling_ec2_strong_145000000_2node.txt', 's3_summary_object_name': 'cylon/scaling/ec2/strong/145000000/cylon_summary_test_ec2_strong_145000000_2node.txt', 'host': 'aws'},None,ip-172-31-80-245.ec2.internal,root,Linux,#1 SMP Tue Jun 27 21:49:00 UTC 2023 -# csv,join_2_aws_145000000_10,ok,34.12,34.12,2023-08-17 19:56:26,{'rows': 145000000, 'it': 10, 'unique': 0.9, 'scaling': 's', 'operation': 'join', 'world_size': 2, 'redis_host': 'cylon-redis.mveu6e.0001.use1.cache.amazonaws.com', 'redis_port': 6379, 'output_scaling_filename': 'cylon_scaling_test_ec2_strong_145000000_2node', 'output_summary_filename': 'cylon_summary_test_ec2_strong_145000000_2node', 's3_bucket': 'staylor.dev2', 's3_stopwatch_object_name': 'cylon/scaling/ec2/strong/145000000/cylon_scaling_ec2_strong_145000000_2node.txt', 's3_summary_object_name': 'cylon/scaling/ec2/strong/145000000/cylon_summary_test_ec2_strong_145000000_2node.txt', 'host': 'aws'},None,ip-172-31-80-245.ec2.internal,root,Linux,#1 SMP Tue Jun 27 21:49:00 UTC 2023 -# csv,join_3_aws_145000000_10,ok,33.824,33.824,2023-08-17 19:57:00,{'rows': 145000000, 'it': 10, 'unique': 0.9, 'scaling': 's', 'operation': 'join', 'world_size': 2, 'redis_host': 'cylon-redis.mveu6e.0001.use1.cache.amazonaws.com', 'redis_port': 6379, 'output_scaling_filename': 'cylon_scaling_test_ec2_strong_145000000_2node', 'output_summary_filename': 'cylon_summary_test_ec2_strong_145000000_2node', 's3_bucket': 'staylor.dev2', 's3_stopwatch_object_name': 'cylon/scaling/ec2/strong/145000000/cylon_scaling_ec2_strong_145000000_2node.txt', 's3_summary_object_name': 'cylon/scaling/ec2/strong/145000000/cylon_summary_test_ec2_strong_145000000_2node.txt', 'host': 'aws'},None,ip-172-31-80-245.ec2.internal,root,Linux,#1 SMP Tue Jun 27 21:49:00 UTC 2023 -# csv,join_4_aws_145000000_10,ok,33.869,33.869,2023-08-17 19:57:34,{'rows': 145000000, 'it': 10, 'unique': 0.9, 'scaling': 's', 'operation': 'join', 'world_size': 2, 'redis_host': 'cylon-redis.mveu6e.0001.use1.cache.amazonaws.com', 'redis_port': 6379, 'output_scaling_filename': 'cylon_scaling_test_ec2_strong_145000000_2node', 'output_summary_filename': 'cylon_summary_test_ec2_strong_145000000_2node', 's3_bucket': 'staylor.dev2', 's3_stopwatch_object_name': 'cylon/scaling/ec2/strong/145000000/cylon_scaling_ec2_strong_145000000_2node.txt', 's3_summary_object_name': 'cylon/scaling/ec2/strong/145000000/cylon_summary_test_ec2_strong_145000000_2node.txt', 'host': 'aws'},None,ip-172-31-80-245.ec2.internal,root,Linux,#1 SMP Tue Jun 27 21:49:00 UTC 2023 -# csv,join_5_aws_145000000_10,ok,33.84,33.84,2023-08-17 19:58:07,{'rows': 145000000, 'it': 10, 'unique': 0.9, 'scaling': 's', 'operation': 'join', 'world_size': 2, 'redis_host': 'cylon-redis.mveu6e.0001.use1.cache.amazonaws.com', 'redis_port': 6379, 'output_scaling_filename': 'cylon_scaling_test_ec2_strong_145000000_2node', 'output_summary_filename': 'cylon_summary_test_ec2_strong_145000000_2node', 's3_bucket': 'staylor.dev2', 's3_stopwatch_object_name': 'cylon/scaling/ec2/strong/145000000/cylon_scaling_ec2_strong_145000000_2node.txt', 's3_summary_object_name': 'cylon/scaling/ec2/strong/145000000/cylon_summary_test_ec2_strong_145000000_2node.txt', 'host': 'aws'},None,ip-172-31-80-245.ec2.internal,root,Linux,#1 SMP Tue Jun 27 21:49:00 UTC 2023 -# csv,join_6_aws_145000000_10,ok,33.806,33.806,2023-08-17 19:58:41,{'rows': 145000000, 'it': 10, 'unique': 0.9, 'scaling': 's', 'operation': 'join', 'world_size': 2, 'redis_host': 'cylon-redis.mveu6e.0001.use1.cache.amazonaws.com', 'redis_port': 6379, 'output_scaling_filename': 'cylon_scaling_test_ec2_strong_145000000_2node', 'output_summary_filename': 'cylon_summary_test_ec2_strong_145000000_2node', 's3_bucket': 'staylor.dev2', 's3_stopwatch_object_name': 'cylon/scaling/ec2/strong/145000000/cylon_scaling_ec2_strong_145000000_2node.txt', 's3_summary_object_name': 'cylon/scaling/ec2/strong/145000000/cylon_summary_test_ec2_strong_145000000_2node.txt', 'host': 'aws'},None,ip-172-31-80-245.ec2.internal,root,Linux,#1 SMP Tue Jun 27 21:49:00 UTC 2023 -# csv,join_7_aws_145000000_10,ok,33.812,33.812,2023-08-17 19:59:15,{'rows': 145000000, 'it': 10, 'unique': 0.9, 'scaling': 's', 'operation': 'join', 'world_size': 2, 'redis_host': 'cylon-redis.mveu6e.0001.use1.cache.amazonaws.com', 'redis_port': 6379, 'output_scaling_filename': 'cylon_scaling_test_ec2_strong_145000000_2node', 'output_summary_filename': 'cylon_summary_test_ec2_strong_145000000_2node', 's3_bucket': 'staylor.dev2', 's3_stopwatch_object_name': 'cylon/scaling/ec2/strong/145000000/cylon_scaling_ec2_strong_145000000_2node.txt', 's3_summary_object_name': 'cylon/scaling/ec2/strong/145000000/cylon_summary_test_ec2_strong_145000000_2node.txt', 'host': 'aws'},None,ip-172-31-80-245.ec2.internal,root,Linux,#1 SMP Tue Jun 27 21:49:00 UTC 2023 -# csv,join_8_aws_145000000_10,ok,33.872,33.872,2023-08-17 19:59:49,{'rows': 145000000, 'it': 10, 'unique': 0.9, 'scaling': 's', 'operation': 'join', 'world_size': 2, 'redis_host': 'cylon-redis.mveu6e.0001.use1.cache.amazonaws.com', 'redis_port': 6379, 'output_scaling_filename': 'cylon_scaling_test_ec2_strong_145000000_2node', 'output_summary_filename': 'cylon_summary_test_ec2_strong_145000000_2node', 's3_bucket': 'staylor.dev2', 's3_stopwatch_object_name': 'cylon/scaling/ec2/strong/145000000/cylon_scaling_ec2_strong_145000000_2node.txt', 's3_summary_object_name': 'cylon/scaling/ec2/strong/145000000/cylon_summary_test_ec2_strong_145000000_2node.txt', 'host': 'aws'},None,ip-172-31-80-245.ec2.internal,root,Linux,#1 SMP Tue Jun 27 21:49:00 UTC 2023 -# csv,join_9_aws_145000000_10,ok,34.1,34.1,2023-08-17 20:00:23,{'rows': 145000000, 'it': 10, 'unique': 0.9, 'scaling': 's', 'operation': 'join', 'world_size': 2, 'redis_host': 'cylon-redis.mveu6e.0001.use1.cache.amazonaws.com', 'redis_port': 6379, 'output_scaling_filename': 'cylon_scaling_test_ec2_strong_145000000_2node', 'output_summary_filename': 'cylon_summary_test_ec2_strong_145000000_2node', 's3_bucket': 'staylor.dev2', 's3_stopwatch_object_name': 'cylon/scaling/ec2/strong/145000000/cylon_scaling_ec2_strong_145000000_2node.txt', 's3_summary_object_name': 'cylon/scaling/ec2/strong/145000000/cylon_summary_test_ec2_strong_145000000_2node.txt', 'host': 'aws'},None,ip-172-31-80-245.ec2.internal,root,Linux,#1 SMP Tue Jun 27 21:49:00 UTC 2023 diff --git a/aws/scripts/results-145000000/cylon_scaling_ec2_strong_145000000_4node.txt b/aws/scripts/results-145000000/cylon_scaling_ec2_strong_145000000_4node.txt deleted file mode 100644 index 80ebe27db..000000000 --- a/aws/scripts/results-145000000/cylon_scaling_ec2_strong_145000000_4node.txt +++ /dev/null @@ -1,75 +0,0 @@ - -+---------------------+-------------------------------------------------------------------+ -| Attribute | Value | -|---------------------+-------------------------------------------------------------------| -| BUG_REPORT_URL | "https://bugs.launchpad.net/ubuntu/" | -| DISTRIB_CODENAME | jammy | -| DISTRIB_DESCRIPTION | "Ubuntu 22.04.2 LTS" | -| DISTRIB_ID | Ubuntu | -| DISTRIB_RELEASE | 22.04 | -| HOME_URL | "https://www.ubuntu.com/" | -| ID | ubuntu | -| ID_LIKE | debian | -| NAME | "Ubuntu" | -| PRETTY_NAME | "Ubuntu 22.04.2 LTS" | -| PRIVACY_POLICY_URL | "https://www.ubuntu.com/legal/terms-and-policies/privacy-policy" | -| SUPPORT_URL | "https://help.ubuntu.com/" | -| UBUNTU_CODENAME | jammy | -| VERSION | "22.04.2 LTS (Jammy Jellyfish)" | -| VERSION_CODENAME | jammy | -| VERSION_ID | "22.04" | -| cpu | Intel(R) Xeon(R) Platinum 8124M CPU @ 3.00GHz | -| cpu_cores | 8 | -| cpu_count | 16 | -| cpu_threads | 16 | -| date | 2023-08-17 20:13:37.510078 | -| frequency | scpufreq(current=3408.3013124999998, min=0.0, max=0.0) | -| mem.active | 3.9 GiB | -| mem.available | 25.9 GiB | -| mem.free | 21.1 GiB | -| mem.inactive | 4.7 GiB | -| mem.percent | 14.7 % | -| mem.total | 30.4 GiB | -| mem.used | 4.0 GiB | -| platform.version | #1 SMP Tue Jun 27 21:49:00 UTC 2023 | -| python | 3.9.17 | packaged by conda-forge | (main, Aug 10 2023, 07:02:31) | -| | [GCC 12.3.0] | -| python.pip | 23.2.1 | -| python.version | 3.9.17 | -| sys.platform | linux | -| uname.machine | x86_64 | -| uname.node | ip-172-31-81-123.ec2.internal | -| uname.processor | x86_64 | -| uname.release | 4.14.318-241.531.amzn2.x86_64 | -| uname.system | Linux | -| uname.version | #1 SMP Tue Jun 27 21:49:00 UTC 2023 | -| user | root | -+---------------------+-------------------------------------------------------------------+ - -+-----------------------------+----------+---------+---------+---------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+-------+-------------------------------+--------+-------+-------------------------------------+ -| Name | Status | Time | Sum | Start | tag | msg | Node | User | OS | Version | -|-----------------------------+----------+---------+---------+---------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+-------+-------------------------------+--------+-------+-------------------------------------| -| join_total_aws_145000000_10 | ok | 226.103 | 226.103 | 2023-08-17 20:09:51 | {'rows': 145000000, 'it': 10, 'unique': 0.9, 'scaling': 's', 'operation': 'join', 'world_size': 4, 'redis_host': 'cylon-redis.mveu6e.0001.use1.cache.amazonaws.com', 'redis_port': 6379, 'output_scaling_filename': 'cylon_scaling_test_ec2_strong_145000000_4node', 'output_summary_filename': 'cylon_summary_test_ec2_strong_145000000_4node', 's3_bucket': 'staylor.dev2', 's3_stopwatch_object_name': 'cylon/scaling/ec2/strong/145000000/cylon_scaling_ec2_strong_145000000_4node.txt', 's3_summary_object_name': 'cylon/scaling/ec2/strong/145000000/cylon_summary_test_ec2_strongt_145000000_4node.txt', 'host': 'aws'} | | ip-172-31-81-123.ec2.internal | root | Linux | #1 SMP Tue Jun 27 21:49:00 UTC 2023 | -| join_0_aws_145000000_10 | ok | 16.183 | 16.183 | 2023-08-17 20:10:55 | {'rows': 145000000, 'it': 10, 'unique': 0.9, 'scaling': 's', 'operation': 'join', 'world_size': 4, 'redis_host': 'cylon-redis.mveu6e.0001.use1.cache.amazonaws.com', 'redis_port': 6379, 'output_scaling_filename': 'cylon_scaling_test_ec2_strong_145000000_4node', 'output_summary_filename': 'cylon_summary_test_ec2_strong_145000000_4node', 's3_bucket': 'staylor.dev2', 's3_stopwatch_object_name': 'cylon/scaling/ec2/strong/145000000/cylon_scaling_ec2_strong_145000000_4node.txt', 's3_summary_object_name': 'cylon/scaling/ec2/strong/145000000/cylon_summary_test_ec2_strongt_145000000_4node.txt', 'host': 'aws'} | | ip-172-31-81-123.ec2.internal | root | Linux | #1 SMP Tue Jun 27 21:49:00 UTC 2023 | -| join_1_aws_145000000_10 | ok | 16.174 | 16.174 | 2023-08-17 20:11:11 | {'rows': 145000000, 'it': 10, 'unique': 0.9, 'scaling': 's', 'operation': 'join', 'world_size': 4, 'redis_host': 'cylon-redis.mveu6e.0001.use1.cache.amazonaws.com', 'redis_port': 6379, 'output_scaling_filename': 'cylon_scaling_test_ec2_strong_145000000_4node', 'output_summary_filename': 'cylon_summary_test_ec2_strong_145000000_4node', 's3_bucket': 'staylor.dev2', 's3_stopwatch_object_name': 'cylon/scaling/ec2/strong/145000000/cylon_scaling_ec2_strong_145000000_4node.txt', 's3_summary_object_name': 'cylon/scaling/ec2/strong/145000000/cylon_summary_test_ec2_strongt_145000000_4node.txt', 'host': 'aws'} | | ip-172-31-81-123.ec2.internal | root | Linux | #1 SMP Tue Jun 27 21:49:00 UTC 2023 | -| join_2_aws_145000000_10 | ok | 16.17 | 16.17 | 2023-08-17 20:11:28 | {'rows': 145000000, 'it': 10, 'unique': 0.9, 'scaling': 's', 'operation': 'join', 'world_size': 4, 'redis_host': 'cylon-redis.mveu6e.0001.use1.cache.amazonaws.com', 'redis_port': 6379, 'output_scaling_filename': 'cylon_scaling_test_ec2_strong_145000000_4node', 'output_summary_filename': 'cylon_summary_test_ec2_strong_145000000_4node', 's3_bucket': 'staylor.dev2', 's3_stopwatch_object_name': 'cylon/scaling/ec2/strong/145000000/cylon_scaling_ec2_strong_145000000_4node.txt', 's3_summary_object_name': 'cylon/scaling/ec2/strong/145000000/cylon_summary_test_ec2_strongt_145000000_4node.txt', 'host': 'aws'} | | ip-172-31-81-123.ec2.internal | root | Linux | #1 SMP Tue Jun 27 21:49:00 UTC 2023 | -| join_3_aws_145000000_10 | ok | 16.14 | 16.14 | 2023-08-17 20:11:44 | {'rows': 145000000, 'it': 10, 'unique': 0.9, 'scaling': 's', 'operation': 'join', 'world_size': 4, 'redis_host': 'cylon-redis.mveu6e.0001.use1.cache.amazonaws.com', 'redis_port': 6379, 'output_scaling_filename': 'cylon_scaling_test_ec2_strong_145000000_4node', 'output_summary_filename': 'cylon_summary_test_ec2_strong_145000000_4node', 's3_bucket': 'staylor.dev2', 's3_stopwatch_object_name': 'cylon/scaling/ec2/strong/145000000/cylon_scaling_ec2_strong_145000000_4node.txt', 's3_summary_object_name': 'cylon/scaling/ec2/strong/145000000/cylon_summary_test_ec2_strongt_145000000_4node.txt', 'host': 'aws'} | | ip-172-31-81-123.ec2.internal | root | Linux | #1 SMP Tue Jun 27 21:49:00 UTC 2023 | -| join_4_aws_145000000_10 | ok | 16.133 | 16.133 | 2023-08-17 20:12:00 | {'rows': 145000000, 'it': 10, 'unique': 0.9, 'scaling': 's', 'operation': 'join', 'world_size': 4, 'redis_host': 'cylon-redis.mveu6e.0001.use1.cache.amazonaws.com', 'redis_port': 6379, 'output_scaling_filename': 'cylon_scaling_test_ec2_strong_145000000_4node', 'output_summary_filename': 'cylon_summary_test_ec2_strong_145000000_4node', 's3_bucket': 'staylor.dev2', 's3_stopwatch_object_name': 'cylon/scaling/ec2/strong/145000000/cylon_scaling_ec2_strong_145000000_4node.txt', 's3_summary_object_name': 'cylon/scaling/ec2/strong/145000000/cylon_summary_test_ec2_strongt_145000000_4node.txt', 'host': 'aws'} | | ip-172-31-81-123.ec2.internal | root | Linux | #1 SMP Tue Jun 27 21:49:00 UTC 2023 | -| join_5_aws_145000000_10 | ok | 16.126 | 16.126 | 2023-08-17 20:12:16 | {'rows': 145000000, 'it': 10, 'unique': 0.9, 'scaling': 's', 'operation': 'join', 'world_size': 4, 'redis_host': 'cylon-redis.mveu6e.0001.use1.cache.amazonaws.com', 'redis_port': 6379, 'output_scaling_filename': 'cylon_scaling_test_ec2_strong_145000000_4node', 'output_summary_filename': 'cylon_summary_test_ec2_strong_145000000_4node', 's3_bucket': 'staylor.dev2', 's3_stopwatch_object_name': 'cylon/scaling/ec2/strong/145000000/cylon_scaling_ec2_strong_145000000_4node.txt', 's3_summary_object_name': 'cylon/scaling/ec2/strong/145000000/cylon_summary_test_ec2_strongt_145000000_4node.txt', 'host': 'aws'} | | ip-172-31-81-123.ec2.internal | root | Linux | #1 SMP Tue Jun 27 21:49:00 UTC 2023 | -| join_6_aws_145000000_10 | ok | 16.107 | 16.107 | 2023-08-17 20:12:32 | {'rows': 145000000, 'it': 10, 'unique': 0.9, 'scaling': 's', 'operation': 'join', 'world_size': 4, 'redis_host': 'cylon-redis.mveu6e.0001.use1.cache.amazonaws.com', 'redis_port': 6379, 'output_scaling_filename': 'cylon_scaling_test_ec2_strong_145000000_4node', 'output_summary_filename': 'cylon_summary_test_ec2_strong_145000000_4node', 's3_bucket': 'staylor.dev2', 's3_stopwatch_object_name': 'cylon/scaling/ec2/strong/145000000/cylon_scaling_ec2_strong_145000000_4node.txt', 's3_summary_object_name': 'cylon/scaling/ec2/strong/145000000/cylon_summary_test_ec2_strongt_145000000_4node.txt', 'host': 'aws'} | | ip-172-31-81-123.ec2.internal | root | Linux | #1 SMP Tue Jun 27 21:49:00 UTC 2023 | -| join_7_aws_145000000_10 | ok | 16.143 | 16.143 | 2023-08-17 20:12:48 | {'rows': 145000000, 'it': 10, 'unique': 0.9, 'scaling': 's', 'operation': 'join', 'world_size': 4, 'redis_host': 'cylon-redis.mveu6e.0001.use1.cache.amazonaws.com', 'redis_port': 6379, 'output_scaling_filename': 'cylon_scaling_test_ec2_strong_145000000_4node', 'output_summary_filename': 'cylon_summary_test_ec2_strong_145000000_4node', 's3_bucket': 'staylor.dev2', 's3_stopwatch_object_name': 'cylon/scaling/ec2/strong/145000000/cylon_scaling_ec2_strong_145000000_4node.txt', 's3_summary_object_name': 'cylon/scaling/ec2/strong/145000000/cylon_summary_test_ec2_strongt_145000000_4node.txt', 'host': 'aws'} | | ip-172-31-81-123.ec2.internal | root | Linux | #1 SMP Tue Jun 27 21:49:00 UTC 2023 | -| join_8_aws_145000000_10 | ok | 16.114 | 16.114 | 2023-08-17 20:13:04 | {'rows': 145000000, 'it': 10, 'unique': 0.9, 'scaling': 's', 'operation': 'join', 'world_size': 4, 'redis_host': 'cylon-redis.mveu6e.0001.use1.cache.amazonaws.com', 'redis_port': 6379, 'output_scaling_filename': 'cylon_scaling_test_ec2_strong_145000000_4node', 'output_summary_filename': 'cylon_summary_test_ec2_strong_145000000_4node', 's3_bucket': 'staylor.dev2', 's3_stopwatch_object_name': 'cylon/scaling/ec2/strong/145000000/cylon_scaling_ec2_strong_145000000_4node.txt', 's3_summary_object_name': 'cylon/scaling/ec2/strong/145000000/cylon_summary_test_ec2_strongt_145000000_4node.txt', 'host': 'aws'} | | ip-172-31-81-123.ec2.internal | root | Linux | #1 SMP Tue Jun 27 21:49:00 UTC 2023 | -| join_9_aws_145000000_10 | ok | 16.132 | 16.132 | 2023-08-17 20:13:21 | {'rows': 145000000, 'it': 10, 'unique': 0.9, 'scaling': 's', 'operation': 'join', 'world_size': 4, 'redis_host': 'cylon-redis.mveu6e.0001.use1.cache.amazonaws.com', 'redis_port': 6379, 'output_scaling_filename': 'cylon_scaling_test_ec2_strong_145000000_4node', 'output_summary_filename': 'cylon_summary_test_ec2_strong_145000000_4node', 's3_bucket': 'staylor.dev2', 's3_stopwatch_object_name': 'cylon/scaling/ec2/strong/145000000/cylon_scaling_ec2_strong_145000000_4node.txt', 's3_summary_object_name': 'cylon/scaling/ec2/strong/145000000/cylon_summary_test_ec2_strongt_145000000_4node.txt', 'host': 'aws'} | | ip-172-31-81-123.ec2.internal | root | Linux | #1 SMP Tue Jun 27 21:49:00 UTC 2023 | -+-----------------------------+----------+---------+---------+---------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+-------+-------------------------------+--------+-------+-------------------------------------+ -# csv,timer,status,time,sum,start,tag,msg,uname.node,user,uname.system,platform.version -# csv,join_total_aws_145000000_10,ok,226.103,226.103,2023-08-17 20:09:51,{'rows': 145000000, 'it': 10, 'unique': 0.9, 'scaling': 's', 'operation': 'join', 'world_size': 4, 'redis_host': 'cylon-redis.mveu6e.0001.use1.cache.amazonaws.com', 'redis_port': 6379, 'output_scaling_filename': 'cylon_scaling_test_ec2_strong_145000000_4node', 'output_summary_filename': 'cylon_summary_test_ec2_strong_145000000_4node', 's3_bucket': 'staylor.dev2', 's3_stopwatch_object_name': 'cylon/scaling/ec2/strong/145000000/cylon_scaling_ec2_strong_145000000_4node.txt', 's3_summary_object_name': 'cylon/scaling/ec2/strong/145000000/cylon_summary_test_ec2_strongt_145000000_4node.txt', 'host': 'aws'},None,ip-172-31-81-123.ec2.internal,root,Linux,#1 SMP Tue Jun 27 21:49:00 UTC 2023 -# csv,join_0_aws_145000000_10,ok,16.183,16.183,2023-08-17 20:10:55,{'rows': 145000000, 'it': 10, 'unique': 0.9, 'scaling': 's', 'operation': 'join', 'world_size': 4, 'redis_host': 'cylon-redis.mveu6e.0001.use1.cache.amazonaws.com', 'redis_port': 6379, 'output_scaling_filename': 'cylon_scaling_test_ec2_strong_145000000_4node', 'output_summary_filename': 'cylon_summary_test_ec2_strong_145000000_4node', 's3_bucket': 'staylor.dev2', 's3_stopwatch_object_name': 'cylon/scaling/ec2/strong/145000000/cylon_scaling_ec2_strong_145000000_4node.txt', 's3_summary_object_name': 'cylon/scaling/ec2/strong/145000000/cylon_summary_test_ec2_strongt_145000000_4node.txt', 'host': 'aws'},None,ip-172-31-81-123.ec2.internal,root,Linux,#1 SMP Tue Jun 27 21:49:00 UTC 2023 -# csv,join_1_aws_145000000_10,ok,16.174,16.174,2023-08-17 20:11:11,{'rows': 145000000, 'it': 10, 'unique': 0.9, 'scaling': 's', 'operation': 'join', 'world_size': 4, 'redis_host': 'cylon-redis.mveu6e.0001.use1.cache.amazonaws.com', 'redis_port': 6379, 'output_scaling_filename': 'cylon_scaling_test_ec2_strong_145000000_4node', 'output_summary_filename': 'cylon_summary_test_ec2_strong_145000000_4node', 's3_bucket': 'staylor.dev2', 's3_stopwatch_object_name': 'cylon/scaling/ec2/strong/145000000/cylon_scaling_ec2_strong_145000000_4node.txt', 's3_summary_object_name': 'cylon/scaling/ec2/strong/145000000/cylon_summary_test_ec2_strongt_145000000_4node.txt', 'host': 'aws'},None,ip-172-31-81-123.ec2.internal,root,Linux,#1 SMP Tue Jun 27 21:49:00 UTC 2023 -# csv,join_2_aws_145000000_10,ok,16.17,16.17,2023-08-17 20:11:28,{'rows': 145000000, 'it': 10, 'unique': 0.9, 'scaling': 's', 'operation': 'join', 'world_size': 4, 'redis_host': 'cylon-redis.mveu6e.0001.use1.cache.amazonaws.com', 'redis_port': 6379, 'output_scaling_filename': 'cylon_scaling_test_ec2_strong_145000000_4node', 'output_summary_filename': 'cylon_summary_test_ec2_strong_145000000_4node', 's3_bucket': 'staylor.dev2', 's3_stopwatch_object_name': 'cylon/scaling/ec2/strong/145000000/cylon_scaling_ec2_strong_145000000_4node.txt', 's3_summary_object_name': 'cylon/scaling/ec2/strong/145000000/cylon_summary_test_ec2_strongt_145000000_4node.txt', 'host': 'aws'},None,ip-172-31-81-123.ec2.internal,root,Linux,#1 SMP Tue Jun 27 21:49:00 UTC 2023 -# csv,join_3_aws_145000000_10,ok,16.14,16.14,2023-08-17 20:11:44,{'rows': 145000000, 'it': 10, 'unique': 0.9, 'scaling': 's', 'operation': 'join', 'world_size': 4, 'redis_host': 'cylon-redis.mveu6e.0001.use1.cache.amazonaws.com', 'redis_port': 6379, 'output_scaling_filename': 'cylon_scaling_test_ec2_strong_145000000_4node', 'output_summary_filename': 'cylon_summary_test_ec2_strong_145000000_4node', 's3_bucket': 'staylor.dev2', 's3_stopwatch_object_name': 'cylon/scaling/ec2/strong/145000000/cylon_scaling_ec2_strong_145000000_4node.txt', 's3_summary_object_name': 'cylon/scaling/ec2/strong/145000000/cylon_summary_test_ec2_strongt_145000000_4node.txt', 'host': 'aws'},None,ip-172-31-81-123.ec2.internal,root,Linux,#1 SMP Tue Jun 27 21:49:00 UTC 2023 -# csv,join_4_aws_145000000_10,ok,16.133,16.133,2023-08-17 20:12:00,{'rows': 145000000, 'it': 10, 'unique': 0.9, 'scaling': 's', 'operation': 'join', 'world_size': 4, 'redis_host': 'cylon-redis.mveu6e.0001.use1.cache.amazonaws.com', 'redis_port': 6379, 'output_scaling_filename': 'cylon_scaling_test_ec2_strong_145000000_4node', 'output_summary_filename': 'cylon_summary_test_ec2_strong_145000000_4node', 's3_bucket': 'staylor.dev2', 's3_stopwatch_object_name': 'cylon/scaling/ec2/strong/145000000/cylon_scaling_ec2_strong_145000000_4node.txt', 's3_summary_object_name': 'cylon/scaling/ec2/strong/145000000/cylon_summary_test_ec2_strongt_145000000_4node.txt', 'host': 'aws'},None,ip-172-31-81-123.ec2.internal,root,Linux,#1 SMP Tue Jun 27 21:49:00 UTC 2023 -# csv,join_5_aws_145000000_10,ok,16.126,16.126,2023-08-17 20:12:16,{'rows': 145000000, 'it': 10, 'unique': 0.9, 'scaling': 's', 'operation': 'join', 'world_size': 4, 'redis_host': 'cylon-redis.mveu6e.0001.use1.cache.amazonaws.com', 'redis_port': 6379, 'output_scaling_filename': 'cylon_scaling_test_ec2_strong_145000000_4node', 'output_summary_filename': 'cylon_summary_test_ec2_strong_145000000_4node', 's3_bucket': 'staylor.dev2', 's3_stopwatch_object_name': 'cylon/scaling/ec2/strong/145000000/cylon_scaling_ec2_strong_145000000_4node.txt', 's3_summary_object_name': 'cylon/scaling/ec2/strong/145000000/cylon_summary_test_ec2_strongt_145000000_4node.txt', 'host': 'aws'},None,ip-172-31-81-123.ec2.internal,root,Linux,#1 SMP Tue Jun 27 21:49:00 UTC 2023 -# csv,join_6_aws_145000000_10,ok,16.107,16.107,2023-08-17 20:12:32,{'rows': 145000000, 'it': 10, 'unique': 0.9, 'scaling': 's', 'operation': 'join', 'world_size': 4, 'redis_host': 'cylon-redis.mveu6e.0001.use1.cache.amazonaws.com', 'redis_port': 6379, 'output_scaling_filename': 'cylon_scaling_test_ec2_strong_145000000_4node', 'output_summary_filename': 'cylon_summary_test_ec2_strong_145000000_4node', 's3_bucket': 'staylor.dev2', 's3_stopwatch_object_name': 'cylon/scaling/ec2/strong/145000000/cylon_scaling_ec2_strong_145000000_4node.txt', 's3_summary_object_name': 'cylon/scaling/ec2/strong/145000000/cylon_summary_test_ec2_strongt_145000000_4node.txt', 'host': 'aws'},None,ip-172-31-81-123.ec2.internal,root,Linux,#1 SMP Tue Jun 27 21:49:00 UTC 2023 -# csv,join_7_aws_145000000_10,ok,16.143,16.143,2023-08-17 20:12:48,{'rows': 145000000, 'it': 10, 'unique': 0.9, 'scaling': 's', 'operation': 'join', 'world_size': 4, 'redis_host': 'cylon-redis.mveu6e.0001.use1.cache.amazonaws.com', 'redis_port': 6379, 'output_scaling_filename': 'cylon_scaling_test_ec2_strong_145000000_4node', 'output_summary_filename': 'cylon_summary_test_ec2_strong_145000000_4node', 's3_bucket': 'staylor.dev2', 's3_stopwatch_object_name': 'cylon/scaling/ec2/strong/145000000/cylon_scaling_ec2_strong_145000000_4node.txt', 's3_summary_object_name': 'cylon/scaling/ec2/strong/145000000/cylon_summary_test_ec2_strongt_145000000_4node.txt', 'host': 'aws'},None,ip-172-31-81-123.ec2.internal,root,Linux,#1 SMP Tue Jun 27 21:49:00 UTC 2023 -# csv,join_8_aws_145000000_10,ok,16.114,16.114,2023-08-17 20:13:04,{'rows': 145000000, 'it': 10, 'unique': 0.9, 'scaling': 's', 'operation': 'join', 'world_size': 4, 'redis_host': 'cylon-redis.mveu6e.0001.use1.cache.amazonaws.com', 'redis_port': 6379, 'output_scaling_filename': 'cylon_scaling_test_ec2_strong_145000000_4node', 'output_summary_filename': 'cylon_summary_test_ec2_strong_145000000_4node', 's3_bucket': 'staylor.dev2', 's3_stopwatch_object_name': 'cylon/scaling/ec2/strong/145000000/cylon_scaling_ec2_strong_145000000_4node.txt', 's3_summary_object_name': 'cylon/scaling/ec2/strong/145000000/cylon_summary_test_ec2_strongt_145000000_4node.txt', 'host': 'aws'},None,ip-172-31-81-123.ec2.internal,root,Linux,#1 SMP Tue Jun 27 21:49:00 UTC 2023 -# csv,join_9_aws_145000000_10,ok,16.132,16.132,2023-08-17 20:13:21,{'rows': 145000000, 'it': 10, 'unique': 0.9, 'scaling': 's', 'operation': 'join', 'world_size': 4, 'redis_host': 'cylon-redis.mveu6e.0001.use1.cache.amazonaws.com', 'redis_port': 6379, 'output_scaling_filename': 'cylon_scaling_test_ec2_strong_145000000_4node', 'output_summary_filename': 'cylon_summary_test_ec2_strong_145000000_4node', 's3_bucket': 'staylor.dev2', 's3_stopwatch_object_name': 'cylon/scaling/ec2/strong/145000000/cylon_scaling_ec2_strong_145000000_4node.txt', 's3_summary_object_name': 'cylon/scaling/ec2/strong/145000000/cylon_summary_test_ec2_strongt_145000000_4node.txt', 'host': 'aws'},None,ip-172-31-81-123.ec2.internal,root,Linux,#1 SMP Tue Jun 27 21:49:00 UTC 2023 diff --git a/aws/scripts/results-145000000/cylon_scaling_ec2_strong_145000000_8node.txt b/aws/scripts/results-145000000/cylon_scaling_ec2_strong_145000000_8node.txt deleted file mode 100644 index 9bfa3ace4..000000000 --- a/aws/scripts/results-145000000/cylon_scaling_ec2_strong_145000000_8node.txt +++ /dev/null @@ -1,75 +0,0 @@ - -+---------------------+-------------------------------------------------------------------+ -| Attribute | Value | -|---------------------+-------------------------------------------------------------------| -| BUG_REPORT_URL | "https://bugs.launchpad.net/ubuntu/" | -| DISTRIB_CODENAME | jammy | -| DISTRIB_DESCRIPTION | "Ubuntu 22.04.2 LTS" | -| DISTRIB_ID | Ubuntu | -| DISTRIB_RELEASE | 22.04 | -| HOME_URL | "https://www.ubuntu.com/" | -| ID | ubuntu | -| ID_LIKE | debian | -| NAME | "Ubuntu" | -| PRETTY_NAME | "Ubuntu 22.04.2 LTS" | -| PRIVACY_POLICY_URL | "https://www.ubuntu.com/legal/terms-and-policies/privacy-policy" | -| SUPPORT_URL | "https://help.ubuntu.com/" | -| UBUNTU_CODENAME | jammy | -| VERSION | "22.04.2 LTS (Jammy Jellyfish)" | -| VERSION_CODENAME | jammy | -| VERSION_ID | "22.04" | -| cpu | Intel(R) Xeon(R) Platinum 8275CL CPU @ 3.00GHz | -| cpu_cores | 8 | -| cpu_count | 16 | -| cpu_threads | 16 | -| date | 2023-08-17 20:18:16.286547 | -| frequency | scpufreq(current=3613.2064375, min=0.0, max=0.0) | -| mem.active | 2.2 GiB | -| mem.available | 27.8 GiB | -| mem.free | 23.0 GiB | -| mem.inactive | 4.7 GiB | -| mem.percent | 9.1 % | -| mem.total | 30.6 GiB | -| mem.used | 2.3 GiB | -| platform.version | #1 SMP Tue Jun 27 21:49:00 UTC 2023 | -| python | 3.9.17 | packaged by conda-forge | (main, Aug 10 2023, 07:02:31) | -| | [GCC 12.3.0] | -| python.pip | 23.2.1 | -| python.version | 3.9.17 | -| sys.platform | linux | -| uname.machine | x86_64 | -| uname.node | ip-172-31-83-169.ec2.internal | -| uname.processor | x86_64 | -| uname.release | 4.14.318-241.531.amzn2.x86_64 | -| uname.system | Linux | -| uname.version | #1 SMP Tue Jun 27 21:49:00 UTC 2023 | -| user | root | -+---------------------+-------------------------------------------------------------------+ - -+-----------------------------+----------+---------+---------+---------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+-------+-------------------------------+--------+-------+-------------------------------------+ -| Name | Status | Time | Sum | Start | tag | msg | Node | User | OS | Version | -|-----------------------------+----------+---------+---------+---------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+-------+-------------------------------+--------+-------+-------------------------------------| -| join_total_aws_145000000_10 | ok | 142.303 | 142.303 | 2023-08-17 20:15:53 | {'rows': 145000000, 'it': 10, 'unique': 0.9, 'scaling': 's', 'operation': 'join', 'world_size': 8, 'redis_host': 'cylon-redis.mveu6e.0001.use1.cache.amazonaws.com', 'redis_port': 6379, 'output_scaling_filename': 'cylon_scaling_test_ec2_strong_145000000_8node', 'output_summary_filename': 'cylon_summary_test_ec2_strong_145000000_8node', 's3_bucket': 'staylor.dev2', 's3_stopwatch_object_name': 'cylon/scaling/ec2/strong/145000000/cylon_scaling_ec2_strong_145000000_8node.txt', 's3_summary_object_name': 'cylon/scaling/ec2/strong/145000000/cylon_summary_test_ec2_strongt_145000000_8node.txt', 'host': 'aws'} | | ip-172-31-83-169.ec2.internal | root | Linux | #1 SMP Tue Jun 27 21:49:00 UTC 2023 | -| join_0_aws_145000000_10 | ok | 7.954 | 7.954 | 2023-08-17 20:16:56 | {'rows': 145000000, 'it': 10, 'unique': 0.9, 'scaling': 's', 'operation': 'join', 'world_size': 8, 'redis_host': 'cylon-redis.mveu6e.0001.use1.cache.amazonaws.com', 'redis_port': 6379, 'output_scaling_filename': 'cylon_scaling_test_ec2_strong_145000000_8node', 'output_summary_filename': 'cylon_summary_test_ec2_strong_145000000_8node', 's3_bucket': 'staylor.dev2', 's3_stopwatch_object_name': 'cylon/scaling/ec2/strong/145000000/cylon_scaling_ec2_strong_145000000_8node.txt', 's3_summary_object_name': 'cylon/scaling/ec2/strong/145000000/cylon_summary_test_ec2_strongt_145000000_8node.txt', 'host': 'aws'} | | ip-172-31-83-169.ec2.internal | root | Linux | #1 SMP Tue Jun 27 21:49:00 UTC 2023 | -| join_1_aws_145000000_10 | ok | 8.154 | 8.154 | 2023-08-17 20:17:03 | {'rows': 145000000, 'it': 10, 'unique': 0.9, 'scaling': 's', 'operation': 'join', 'world_size': 8, 'redis_host': 'cylon-redis.mveu6e.0001.use1.cache.amazonaws.com', 'redis_port': 6379, 'output_scaling_filename': 'cylon_scaling_test_ec2_strong_145000000_8node', 'output_summary_filename': 'cylon_summary_test_ec2_strong_145000000_8node', 's3_bucket': 'staylor.dev2', 's3_stopwatch_object_name': 'cylon/scaling/ec2/strong/145000000/cylon_scaling_ec2_strong_145000000_8node.txt', 's3_summary_object_name': 'cylon/scaling/ec2/strong/145000000/cylon_summary_test_ec2_strongt_145000000_8node.txt', 'host': 'aws'} | | ip-172-31-83-169.ec2.internal | root | Linux | #1 SMP Tue Jun 27 21:49:00 UTC 2023 | -| join_2_aws_145000000_10 | ok | 7.971 | 7.971 | 2023-08-17 20:17:12 | {'rows': 145000000, 'it': 10, 'unique': 0.9, 'scaling': 's', 'operation': 'join', 'world_size': 8, 'redis_host': 'cylon-redis.mveu6e.0001.use1.cache.amazonaws.com', 'redis_port': 6379, 'output_scaling_filename': 'cylon_scaling_test_ec2_strong_145000000_8node', 'output_summary_filename': 'cylon_summary_test_ec2_strong_145000000_8node', 's3_bucket': 'staylor.dev2', 's3_stopwatch_object_name': 'cylon/scaling/ec2/strong/145000000/cylon_scaling_ec2_strong_145000000_8node.txt', 's3_summary_object_name': 'cylon/scaling/ec2/strong/145000000/cylon_summary_test_ec2_strongt_145000000_8node.txt', 'host': 'aws'} | | ip-172-31-83-169.ec2.internal | root | Linux | #1 SMP Tue Jun 27 21:49:00 UTC 2023 | -| join_3_aws_145000000_10 | ok | 7.972 | 7.972 | 2023-08-17 20:17:20 | {'rows': 145000000, 'it': 10, 'unique': 0.9, 'scaling': 's', 'operation': 'join', 'world_size': 8, 'redis_host': 'cylon-redis.mveu6e.0001.use1.cache.amazonaws.com', 'redis_port': 6379, 'output_scaling_filename': 'cylon_scaling_test_ec2_strong_145000000_8node', 'output_summary_filename': 'cylon_summary_test_ec2_strong_145000000_8node', 's3_bucket': 'staylor.dev2', 's3_stopwatch_object_name': 'cylon/scaling/ec2/strong/145000000/cylon_scaling_ec2_strong_145000000_8node.txt', 's3_summary_object_name': 'cylon/scaling/ec2/strong/145000000/cylon_summary_test_ec2_strongt_145000000_8node.txt', 'host': 'aws'} | | ip-172-31-83-169.ec2.internal | root | Linux | #1 SMP Tue Jun 27 21:49:00 UTC 2023 | -| join_4_aws_145000000_10 | ok | 8.02 | 8.02 | 2023-08-17 20:17:28 | {'rows': 145000000, 'it': 10, 'unique': 0.9, 'scaling': 's', 'operation': 'join', 'world_size': 8, 'redis_host': 'cylon-redis.mveu6e.0001.use1.cache.amazonaws.com', 'redis_port': 6379, 'output_scaling_filename': 'cylon_scaling_test_ec2_strong_145000000_8node', 'output_summary_filename': 'cylon_summary_test_ec2_strong_145000000_8node', 's3_bucket': 'staylor.dev2', 's3_stopwatch_object_name': 'cylon/scaling/ec2/strong/145000000/cylon_scaling_ec2_strong_145000000_8node.txt', 's3_summary_object_name': 'cylon/scaling/ec2/strong/145000000/cylon_summary_test_ec2_strongt_145000000_8node.txt', 'host': 'aws'} | | ip-172-31-83-169.ec2.internal | root | Linux | #1 SMP Tue Jun 27 21:49:00 UTC 2023 | -| join_5_aws_145000000_10 | ok | 7.99 | 7.99 | 2023-08-17 20:17:36 | {'rows': 145000000, 'it': 10, 'unique': 0.9, 'scaling': 's', 'operation': 'join', 'world_size': 8, 'redis_host': 'cylon-redis.mveu6e.0001.use1.cache.amazonaws.com', 'redis_port': 6379, 'output_scaling_filename': 'cylon_scaling_test_ec2_strong_145000000_8node', 'output_summary_filename': 'cylon_summary_test_ec2_strong_145000000_8node', 's3_bucket': 'staylor.dev2', 's3_stopwatch_object_name': 'cylon/scaling/ec2/strong/145000000/cylon_scaling_ec2_strong_145000000_8node.txt', 's3_summary_object_name': 'cylon/scaling/ec2/strong/145000000/cylon_summary_test_ec2_strongt_145000000_8node.txt', 'host': 'aws'} | | ip-172-31-83-169.ec2.internal | root | Linux | #1 SMP Tue Jun 27 21:49:00 UTC 2023 | -| join_6_aws_145000000_10 | ok | 8 | 8 | 2023-08-17 20:17:44 | {'rows': 145000000, 'it': 10, 'unique': 0.9, 'scaling': 's', 'operation': 'join', 'world_size': 8, 'redis_host': 'cylon-redis.mveu6e.0001.use1.cache.amazonaws.com', 'redis_port': 6379, 'output_scaling_filename': 'cylon_scaling_test_ec2_strong_145000000_8node', 'output_summary_filename': 'cylon_summary_test_ec2_strong_145000000_8node', 's3_bucket': 'staylor.dev2', 's3_stopwatch_object_name': 'cylon/scaling/ec2/strong/145000000/cylon_scaling_ec2_strong_145000000_8node.txt', 's3_summary_object_name': 'cylon/scaling/ec2/strong/145000000/cylon_summary_test_ec2_strongt_145000000_8node.txt', 'host': 'aws'} | | ip-172-31-83-169.ec2.internal | root | Linux | #1 SMP Tue Jun 27 21:49:00 UTC 2023 | -| join_7_aws_145000000_10 | ok | 8.073 | 8.073 | 2023-08-17 20:17:52 | {'rows': 145000000, 'it': 10, 'unique': 0.9, 'scaling': 's', 'operation': 'join', 'world_size': 8, 'redis_host': 'cylon-redis.mveu6e.0001.use1.cache.amazonaws.com', 'redis_port': 6379, 'output_scaling_filename': 'cylon_scaling_test_ec2_strong_145000000_8node', 'output_summary_filename': 'cylon_summary_test_ec2_strong_145000000_8node', 's3_bucket': 'staylor.dev2', 's3_stopwatch_object_name': 'cylon/scaling/ec2/strong/145000000/cylon_scaling_ec2_strong_145000000_8node.txt', 's3_summary_object_name': 'cylon/scaling/ec2/strong/145000000/cylon_summary_test_ec2_strongt_145000000_8node.txt', 'host': 'aws'} | | ip-172-31-83-169.ec2.internal | root | Linux | #1 SMP Tue Jun 27 21:49:00 UTC 2023 | -| join_8_aws_145000000_10 | ok | 7.917 | 7.917 | 2023-08-17 20:18:00 | {'rows': 145000000, 'it': 10, 'unique': 0.9, 'scaling': 's', 'operation': 'join', 'world_size': 8, 'redis_host': 'cylon-redis.mveu6e.0001.use1.cache.amazonaws.com', 'redis_port': 6379, 'output_scaling_filename': 'cylon_scaling_test_ec2_strong_145000000_8node', 'output_summary_filename': 'cylon_summary_test_ec2_strong_145000000_8node', 's3_bucket': 'staylor.dev2', 's3_stopwatch_object_name': 'cylon/scaling/ec2/strong/145000000/cylon_scaling_ec2_strong_145000000_8node.txt', 's3_summary_object_name': 'cylon/scaling/ec2/strong/145000000/cylon_summary_test_ec2_strongt_145000000_8node.txt', 'host': 'aws'} | | ip-172-31-83-169.ec2.internal | root | Linux | #1 SMP Tue Jun 27 21:49:00 UTC 2023 | -| join_9_aws_145000000_10 | ok | 8.08 | 8.08 | 2023-08-17 20:18:08 | {'rows': 145000000, 'it': 10, 'unique': 0.9, 'scaling': 's', 'operation': 'join', 'world_size': 8, 'redis_host': 'cylon-redis.mveu6e.0001.use1.cache.amazonaws.com', 'redis_port': 6379, 'output_scaling_filename': 'cylon_scaling_test_ec2_strong_145000000_8node', 'output_summary_filename': 'cylon_summary_test_ec2_strong_145000000_8node', 's3_bucket': 'staylor.dev2', 's3_stopwatch_object_name': 'cylon/scaling/ec2/strong/145000000/cylon_scaling_ec2_strong_145000000_8node.txt', 's3_summary_object_name': 'cylon/scaling/ec2/strong/145000000/cylon_summary_test_ec2_strongt_145000000_8node.txt', 'host': 'aws'} | | ip-172-31-83-169.ec2.internal | root | Linux | #1 SMP Tue Jun 27 21:49:00 UTC 2023 | -+-----------------------------+----------+---------+---------+---------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+-------+-------------------------------+--------+-------+-------------------------------------+ -# csv,timer,status,time,sum,start,tag,msg,uname.node,user,uname.system,platform.version -# csv,join_total_aws_145000000_10,ok,142.303,142.303,2023-08-17 20:15:53,{'rows': 145000000, 'it': 10, 'unique': 0.9, 'scaling': 's', 'operation': 'join', 'world_size': 8, 'redis_host': 'cylon-redis.mveu6e.0001.use1.cache.amazonaws.com', 'redis_port': 6379, 'output_scaling_filename': 'cylon_scaling_test_ec2_strong_145000000_8node', 'output_summary_filename': 'cylon_summary_test_ec2_strong_145000000_8node', 's3_bucket': 'staylor.dev2', 's3_stopwatch_object_name': 'cylon/scaling/ec2/strong/145000000/cylon_scaling_ec2_strong_145000000_8node.txt', 's3_summary_object_name': 'cylon/scaling/ec2/strong/145000000/cylon_summary_test_ec2_strongt_145000000_8node.txt', 'host': 'aws'},None,ip-172-31-83-169.ec2.internal,root,Linux,#1 SMP Tue Jun 27 21:49:00 UTC 2023 -# csv,join_0_aws_145000000_10,ok,7.954,7.954,2023-08-17 20:16:56,{'rows': 145000000, 'it': 10, 'unique': 0.9, 'scaling': 's', 'operation': 'join', 'world_size': 8, 'redis_host': 'cylon-redis.mveu6e.0001.use1.cache.amazonaws.com', 'redis_port': 6379, 'output_scaling_filename': 'cylon_scaling_test_ec2_strong_145000000_8node', 'output_summary_filename': 'cylon_summary_test_ec2_strong_145000000_8node', 's3_bucket': 'staylor.dev2', 's3_stopwatch_object_name': 'cylon/scaling/ec2/strong/145000000/cylon_scaling_ec2_strong_145000000_8node.txt', 's3_summary_object_name': 'cylon/scaling/ec2/strong/145000000/cylon_summary_test_ec2_strongt_145000000_8node.txt', 'host': 'aws'},None,ip-172-31-83-169.ec2.internal,root,Linux,#1 SMP Tue Jun 27 21:49:00 UTC 2023 -# csv,join_1_aws_145000000_10,ok,8.154,8.154,2023-08-17 20:17:03,{'rows': 145000000, 'it': 10, 'unique': 0.9, 'scaling': 's', 'operation': 'join', 'world_size': 8, 'redis_host': 'cylon-redis.mveu6e.0001.use1.cache.amazonaws.com', 'redis_port': 6379, 'output_scaling_filename': 'cylon_scaling_test_ec2_strong_145000000_8node', 'output_summary_filename': 'cylon_summary_test_ec2_strong_145000000_8node', 's3_bucket': 'staylor.dev2', 's3_stopwatch_object_name': 'cylon/scaling/ec2/strong/145000000/cylon_scaling_ec2_strong_145000000_8node.txt', 's3_summary_object_name': 'cylon/scaling/ec2/strong/145000000/cylon_summary_test_ec2_strongt_145000000_8node.txt', 'host': 'aws'},None,ip-172-31-83-169.ec2.internal,root,Linux,#1 SMP Tue Jun 27 21:49:00 UTC 2023 -# csv,join_2_aws_145000000_10,ok,7.971,7.971,2023-08-17 20:17:12,{'rows': 145000000, 'it': 10, 'unique': 0.9, 'scaling': 's', 'operation': 'join', 'world_size': 8, 'redis_host': 'cylon-redis.mveu6e.0001.use1.cache.amazonaws.com', 'redis_port': 6379, 'output_scaling_filename': 'cylon_scaling_test_ec2_strong_145000000_8node', 'output_summary_filename': 'cylon_summary_test_ec2_strong_145000000_8node', 's3_bucket': 'staylor.dev2', 's3_stopwatch_object_name': 'cylon/scaling/ec2/strong/145000000/cylon_scaling_ec2_strong_145000000_8node.txt', 's3_summary_object_name': 'cylon/scaling/ec2/strong/145000000/cylon_summary_test_ec2_strongt_145000000_8node.txt', 'host': 'aws'},None,ip-172-31-83-169.ec2.internal,root,Linux,#1 SMP Tue Jun 27 21:49:00 UTC 2023 -# csv,join_3_aws_145000000_10,ok,7.972,7.972,2023-08-17 20:17:20,{'rows': 145000000, 'it': 10, 'unique': 0.9, 'scaling': 's', 'operation': 'join', 'world_size': 8, 'redis_host': 'cylon-redis.mveu6e.0001.use1.cache.amazonaws.com', 'redis_port': 6379, 'output_scaling_filename': 'cylon_scaling_test_ec2_strong_145000000_8node', 'output_summary_filename': 'cylon_summary_test_ec2_strong_145000000_8node', 's3_bucket': 'staylor.dev2', 's3_stopwatch_object_name': 'cylon/scaling/ec2/strong/145000000/cylon_scaling_ec2_strong_145000000_8node.txt', 's3_summary_object_name': 'cylon/scaling/ec2/strong/145000000/cylon_summary_test_ec2_strongt_145000000_8node.txt', 'host': 'aws'},None,ip-172-31-83-169.ec2.internal,root,Linux,#1 SMP Tue Jun 27 21:49:00 UTC 2023 -# csv,join_4_aws_145000000_10,ok,8.02,8.02,2023-08-17 20:17:28,{'rows': 145000000, 'it': 10, 'unique': 0.9, 'scaling': 's', 'operation': 'join', 'world_size': 8, 'redis_host': 'cylon-redis.mveu6e.0001.use1.cache.amazonaws.com', 'redis_port': 6379, 'output_scaling_filename': 'cylon_scaling_test_ec2_strong_145000000_8node', 'output_summary_filename': 'cylon_summary_test_ec2_strong_145000000_8node', 's3_bucket': 'staylor.dev2', 's3_stopwatch_object_name': 'cylon/scaling/ec2/strong/145000000/cylon_scaling_ec2_strong_145000000_8node.txt', 's3_summary_object_name': 'cylon/scaling/ec2/strong/145000000/cylon_summary_test_ec2_strongt_145000000_8node.txt', 'host': 'aws'},None,ip-172-31-83-169.ec2.internal,root,Linux,#1 SMP Tue Jun 27 21:49:00 UTC 2023 -# csv,join_5_aws_145000000_10,ok,7.99,7.99,2023-08-17 20:17:36,{'rows': 145000000, 'it': 10, 'unique': 0.9, 'scaling': 's', 'operation': 'join', 'world_size': 8, 'redis_host': 'cylon-redis.mveu6e.0001.use1.cache.amazonaws.com', 'redis_port': 6379, 'output_scaling_filename': 'cylon_scaling_test_ec2_strong_145000000_8node', 'output_summary_filename': 'cylon_summary_test_ec2_strong_145000000_8node', 's3_bucket': 'staylor.dev2', 's3_stopwatch_object_name': 'cylon/scaling/ec2/strong/145000000/cylon_scaling_ec2_strong_145000000_8node.txt', 's3_summary_object_name': 'cylon/scaling/ec2/strong/145000000/cylon_summary_test_ec2_strongt_145000000_8node.txt', 'host': 'aws'},None,ip-172-31-83-169.ec2.internal,root,Linux,#1 SMP Tue Jun 27 21:49:00 UTC 2023 -# csv,join_6_aws_145000000_10,ok,8.0,8.0,2023-08-17 20:17:44,{'rows': 145000000, 'it': 10, 'unique': 0.9, 'scaling': 's', 'operation': 'join', 'world_size': 8, 'redis_host': 'cylon-redis.mveu6e.0001.use1.cache.amazonaws.com', 'redis_port': 6379, 'output_scaling_filename': 'cylon_scaling_test_ec2_strong_145000000_8node', 'output_summary_filename': 'cylon_summary_test_ec2_strong_145000000_8node', 's3_bucket': 'staylor.dev2', 's3_stopwatch_object_name': 'cylon/scaling/ec2/strong/145000000/cylon_scaling_ec2_strong_145000000_8node.txt', 's3_summary_object_name': 'cylon/scaling/ec2/strong/145000000/cylon_summary_test_ec2_strongt_145000000_8node.txt', 'host': 'aws'},None,ip-172-31-83-169.ec2.internal,root,Linux,#1 SMP Tue Jun 27 21:49:00 UTC 2023 -# csv,join_7_aws_145000000_10,ok,8.073,8.073,2023-08-17 20:17:52,{'rows': 145000000, 'it': 10, 'unique': 0.9, 'scaling': 's', 'operation': 'join', 'world_size': 8, 'redis_host': 'cylon-redis.mveu6e.0001.use1.cache.amazonaws.com', 'redis_port': 6379, 'output_scaling_filename': 'cylon_scaling_test_ec2_strong_145000000_8node', 'output_summary_filename': 'cylon_summary_test_ec2_strong_145000000_8node', 's3_bucket': 'staylor.dev2', 's3_stopwatch_object_name': 'cylon/scaling/ec2/strong/145000000/cylon_scaling_ec2_strong_145000000_8node.txt', 's3_summary_object_name': 'cylon/scaling/ec2/strong/145000000/cylon_summary_test_ec2_strongt_145000000_8node.txt', 'host': 'aws'},None,ip-172-31-83-169.ec2.internal,root,Linux,#1 SMP Tue Jun 27 21:49:00 UTC 2023 -# csv,join_8_aws_145000000_10,ok,7.917,7.917,2023-08-17 20:18:00,{'rows': 145000000, 'it': 10, 'unique': 0.9, 'scaling': 's', 'operation': 'join', 'world_size': 8, 'redis_host': 'cylon-redis.mveu6e.0001.use1.cache.amazonaws.com', 'redis_port': 6379, 'output_scaling_filename': 'cylon_scaling_test_ec2_strong_145000000_8node', 'output_summary_filename': 'cylon_summary_test_ec2_strong_145000000_8node', 's3_bucket': 'staylor.dev2', 's3_stopwatch_object_name': 'cylon/scaling/ec2/strong/145000000/cylon_scaling_ec2_strong_145000000_8node.txt', 's3_summary_object_name': 'cylon/scaling/ec2/strong/145000000/cylon_summary_test_ec2_strongt_145000000_8node.txt', 'host': 'aws'},None,ip-172-31-83-169.ec2.internal,root,Linux,#1 SMP Tue Jun 27 21:49:00 UTC 2023 -# csv,join_9_aws_145000000_10,ok,8.08,8.08,2023-08-17 20:18:08,{'rows': 145000000, 'it': 10, 'unique': 0.9, 'scaling': 's', 'operation': 'join', 'world_size': 8, 'redis_host': 'cylon-redis.mveu6e.0001.use1.cache.amazonaws.com', 'redis_port': 6379, 'output_scaling_filename': 'cylon_scaling_test_ec2_strong_145000000_8node', 'output_summary_filename': 'cylon_summary_test_ec2_strong_145000000_8node', 's3_bucket': 'staylor.dev2', 's3_stopwatch_object_name': 'cylon/scaling/ec2/strong/145000000/cylon_scaling_ec2_strong_145000000_8node.txt', 's3_summary_object_name': 'cylon/scaling/ec2/strong/145000000/cylon_summary_test_ec2_strongt_145000000_8node.txt', 'host': 'aws'},None,ip-172-31-83-169.ec2.internal,root,Linux,#1 SMP Tue Jun 27 21:49:00 UTC 2023 diff --git a/aws/scripts/results-145000000/cylon_summary_test_ec2_strong_145000000_16node.txt b/aws/scripts/results-145000000/cylon_summary_test_ec2_strong_145000000_16node.txt deleted file mode 100644 index c3063187b..000000000 --- a/aws/scripts/results-145000000/cylon_summary_test_ec2_strong_145000000_16node.txt +++ /dev/null @@ -1,10 +0,0 @@ -### s 16 9062500 145000000 0 4029.546871781349 161101524 -### s 16 9062500 145000000 1 3956.2147110700607 161101524 -### s 16 9062500 145000000 2 4006.7496597766876 161101524 -### s 16 9062500 145000000 3 4166.1305874586105 161101524 -### s 16 9062500 145000000 4 3935.5630427598953 161101524 -### s 16 9062500 145000000 5 3957.828611135483 161101524 -### s 16 9062500 145000000 6 3947.746455669403 161101524 -### s 16 9062500 145000000 7 3931.699424982071 161101524 -### s 16 9062500 145000000 8 4014.2249763011932 161101524 -### s 16 9062500 145000000 9 3963.857814669609 161101524 diff --git a/aws/scripts/results-145000000/cylon_summary_test_ec2_strong_145000000_1node.txt b/aws/scripts/results-145000000/cylon_summary_test_ec2_strong_145000000_1node.txt deleted file mode 100644 index ded10b15b..000000000 --- a/aws/scripts/results-145000000/cylon_summary_test_ec2_strong_145000000_1node.txt +++ /dev/null @@ -1,10 +0,0 @@ -### s 1 145000000 145000000 0 56412.89281845093 161109857 -### s 1 145000000 145000000 1 56519.5152759552 161109857 -### s 1 145000000 145000000 2 56701.70569419861 161109857 -### s 1 145000000 145000000 3 56716.846227645874 161109857 -### s 1 145000000 145000000 4 56616.804361343384 161109857 -### s 1 145000000 145000000 5 56765.65957069397 161109857 -### s 1 145000000 145000000 6 56603.74593734741 161109857 -### s 1 145000000 145000000 7 56640.29383659363 161109857 -### s 1 145000000 145000000 8 56553.63416671753 161109857 -### s 1 145000000 145000000 9 56588.97686004639 161109857 diff --git a/aws/scripts/results-145000000/cylon_summary_test_ec2_strong_145000000_2node.txt b/aws/scripts/results-145000000/cylon_summary_test_ec2_strong_145000000_2node.txt deleted file mode 100644 index 0369d4a15..000000000 --- a/aws/scripts/results-145000000/cylon_summary_test_ec2_strong_145000000_2node.txt +++ /dev/null @@ -1,10 +0,0 @@ -### s 2 72500000 145000000 0 33829.18119430542 161098554 -### s 2 72500000 145000000 1 33800.89461803436 161098554 -### s 2 72500000 145000000 2 34119.54045295715 161098554 -### s 2 72500000 145000000 3 33823.59731197357 161098554 -### s 2 72500000 145000000 4 33868.10278892517 161098554 -### s 2 72500000 145000000 5 33839.05518054962 161098554 -### s 2 72500000 145000000 6 33805.309772491455 161098554 -### s 2 72500000 145000000 7 33811.1287355423 161098554 -### s 2 72500000 145000000 8 33870.83053588867 161098554 -### s 2 72500000 145000000 9 34099.069356918335 161098554 diff --git a/aws/scripts/results-145000000/cylon_summary_test_ec2_strongt_145000000_4node.txt b/aws/scripts/results-145000000/cylon_summary_test_ec2_strongt_145000000_4node.txt deleted file mode 100644 index 9e1f02f59..000000000 --- a/aws/scripts/results-145000000/cylon_summary_test_ec2_strongt_145000000_4node.txt +++ /dev/null @@ -1,10 +0,0 @@ -### s 4 36250000 145000000 0 16181.42455816269 161112331 -### s 4 36250000 145000000 1 16173.18880558014 161112331 -### s 4 36250000 145000000 2 16169.183850288391 161112331 -### s 4 36250000 145000000 3 16138.943433761597 161112331 -### s 4 36250000 145000000 4 16131.615221500397 161112331 -### s 4 36250000 145000000 5 16124.849140644073 161112331 -### s 4 36250000 145000000 6 16106.135249137878 161112331 -### s 4 36250000 145000000 7 16141.386568546295 161112331 -### s 4 36250000 145000000 8 16113.233029842377 161112331 -### s 4 36250000 145000000 9 16130.472183227539 161112331 diff --git a/aws/scripts/results-145000000/cylon_summary_test_ec2_strongt_145000000_8node.txt b/aws/scripts/results-145000000/cylon_summary_test_ec2_strongt_145000000_8node.txt deleted file mode 100644 index 4056d6925..000000000 --- a/aws/scripts/results-145000000/cylon_summary_test_ec2_strongt_145000000_8node.txt +++ /dev/null @@ -1,10 +0,0 @@ -### s 8 18125000 145000000 0 7952.463746070862 161104569 -### s 8 18125000 145000000 1 8151.8765687942505 161104569 -### s 8 18125000 145000000 2 7969.114989042282 161104569 -### s 8 18125000 145000000 3 7970.205038785934 161104569 -### s 8 18125000 145000000 4 8018.117159605026 161104569 -### s 8 18125000 145000000 5 7988.0905747413635 161104569 -### s 8 18125000 145000000 6 7998.181223869324 161104569 -### s 8 18125000 145000000 7 8070.7429349422455 161104569 -### s 8 18125000 145000000 8 7915.852248668671 161104569 -### s 8 18125000 145000000 9 8078.289061784744 161104569 diff --git a/aws/scripts/results-9100000/cylon_scaling_ec2_weak_9100000_16node.txt b/aws/scripts/results-9100000/cylon_scaling_ec2_weak_9100000_16node.txt deleted file mode 100644 index c38ee3162..000000000 --- a/aws/scripts/results-9100000/cylon_scaling_ec2_weak_9100000_16node.txt +++ /dev/null @@ -1,75 +0,0 @@ - -+---------------------+-------------------------------------------------------------------+ -| Attribute | Value | -|---------------------+-------------------------------------------------------------------| -| BUG_REPORT_URL | "https://bugs.launchpad.net/ubuntu/" | -| DISTRIB_CODENAME | jammy | -| DISTRIB_DESCRIPTION | "Ubuntu 22.04.2 LTS" | -| DISTRIB_ID | Ubuntu | -| DISTRIB_RELEASE | 22.04 | -| HOME_URL | "https://www.ubuntu.com/" | -| ID | ubuntu | -| ID_LIKE | debian | -| NAME | "Ubuntu" | -| PRETTY_NAME | "Ubuntu 22.04.2 LTS" | -| PRIVACY_POLICY_URL | "https://www.ubuntu.com/legal/terms-and-policies/privacy-policy" | -| SUPPORT_URL | "https://help.ubuntu.com/" | -| UBUNTU_CODENAME | jammy | -| VERSION | "22.04.2 LTS (Jammy Jellyfish)" | -| VERSION_CODENAME | jammy | -| VERSION_ID | "22.04" | -| cpu | Intel(R) Xeon(R) Platinum 8124M CPU @ 3.00GHz | -| cpu_cores | 8 | -| cpu_count | 16 | -| cpu_threads | 16 | -| date | 2023-08-15 21:07:32.993134 | -| frequency | scpufreq(current=3410.8410625, min=0.0, max=0.0) | -| mem.active | 1.4 GiB | -| mem.available | 28.5 GiB | -| mem.free | 23.6 GiB | -| mem.inactive | 4.7 GiB | -| mem.percent | 6.4 % | -| mem.total | 30.4 GiB | -| mem.used | 1.5 GiB | -| platform.version | #1 SMP Tue Jun 27 21:49:00 UTC 2023 | -| python | 3.9.17 | packaged by conda-forge | (main, Aug 10 2023, 07:02:31) | -| | [GCC 12.3.0] | -| python.pip | 23.2.1 | -| python.version | 3.9.17 | -| sys.platform | linux | -| uname.machine | x86_64 | -| uname.node | ip-172-31-89-59.ec2.internal | -| uname.processor | x86_64 | -| uname.release | 4.14.318-241.531.amzn2.x86_64 | -| uname.system | Linux | -| uname.version | #1 SMP Tue Jun 27 21:49:00 UTC 2023 | -| user | root | -+---------------------+-------------------------------------------------------------------+ - -+---------------------------+----------+---------+---------+---------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+-------+------------------------------+--------+-------+-------------------------------------+ -| Name | Status | Time | Sum | Start | tag | msg | Node | User | OS | Version | -|---------------------------+----------+---------+---------+---------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+-------+------------------------------+--------+-------+-------------------------------------| -| join_total_aws_9100000_10 | ok | 118.549 | 118.549 | 2023-08-15 21:05:34 | {'rows': 9100000, 'it': 10, 'unique': 0.9, 'scaling': 'w', 'operation': 'join', 'world_size': 16, 'redis_host': 'cylon-redis.mveu6e.0001.use1.cache.amazonaws.com', 'redis_port': 6379, 'output_scaling_filename': 'cylon_scaling_test_ec2_9100000_16node', 'output_summary_filename': 'cylon_summary_test_ec2_9100000_16node', 's3_bucket': 'staylor.dev2', 's3_stopwatch_object_name': 'cylon/scaling/ec2/weak/9100000/cylon_scaling_ec2_9100000_16node.txt', 's3_summary_object_name': 'cylon/scaling/ec2/weak/9100000/cylon_summary_test_ec2_9100000_16node.txt', 'host': 'aws'} | | ip-172-31-89-59.ec2.internal | root | Linux | #1 SMP Tue Jun 27 21:49:00 UTC 2023 | -| join_0_aws_9100000_10 | ok | 3.957 | 3.957 | 2023-08-15 21:06:52 | {'rows': 9100000, 'it': 10, 'unique': 0.9, 'scaling': 'w', 'operation': 'join', 'world_size': 16, 'redis_host': 'cylon-redis.mveu6e.0001.use1.cache.amazonaws.com', 'redis_port': 6379, 'output_scaling_filename': 'cylon_scaling_test_ec2_9100000_16node', 'output_summary_filename': 'cylon_summary_test_ec2_9100000_16node', 's3_bucket': 'staylor.dev2', 's3_stopwatch_object_name': 'cylon/scaling/ec2/weak/9100000/cylon_scaling_ec2_9100000_16node.txt', 's3_summary_object_name': 'cylon/scaling/ec2/weak/9100000/cylon_summary_test_ec2_9100000_16node.txt', 'host': 'aws'} | | ip-172-31-89-59.ec2.internal | root | Linux | #1 SMP Tue Jun 27 21:49:00 UTC 2023 | -| join_1_aws_9100000_10 | ok | 3.955 | 3.955 | 2023-08-15 21:06:56 | {'rows': 9100000, 'it': 10, 'unique': 0.9, 'scaling': 'w', 'operation': 'join', 'world_size': 16, 'redis_host': 'cylon-redis.mveu6e.0001.use1.cache.amazonaws.com', 'redis_port': 6379, 'output_scaling_filename': 'cylon_scaling_test_ec2_9100000_16node', 'output_summary_filename': 'cylon_summary_test_ec2_9100000_16node', 's3_bucket': 'staylor.dev2', 's3_stopwatch_object_name': 'cylon/scaling/ec2/weak/9100000/cylon_scaling_ec2_9100000_16node.txt', 's3_summary_object_name': 'cylon/scaling/ec2/weak/9100000/cylon_summary_test_ec2_9100000_16node.txt', 'host': 'aws'} | | ip-172-31-89-59.ec2.internal | root | Linux | #1 SMP Tue Jun 27 21:49:00 UTC 2023 | -| join_2_aws_9100000_10 | ok | 3.966 | 3.966 | 2023-08-15 21:07:00 | {'rows': 9100000, 'it': 10, 'unique': 0.9, 'scaling': 'w', 'operation': 'join', 'world_size': 16, 'redis_host': 'cylon-redis.mveu6e.0001.use1.cache.amazonaws.com', 'redis_port': 6379, 'output_scaling_filename': 'cylon_scaling_test_ec2_9100000_16node', 'output_summary_filename': 'cylon_summary_test_ec2_9100000_16node', 's3_bucket': 'staylor.dev2', 's3_stopwatch_object_name': 'cylon/scaling/ec2/weak/9100000/cylon_scaling_ec2_9100000_16node.txt', 's3_summary_object_name': 'cylon/scaling/ec2/weak/9100000/cylon_summary_test_ec2_9100000_16node.txt', 'host': 'aws'} | | ip-172-31-89-59.ec2.internal | root | Linux | #1 SMP Tue Jun 27 21:49:00 UTC 2023 | -| join_3_aws_9100000_10 | ok | 4.084 | 4.084 | 2023-08-15 21:07:04 | {'rows': 9100000, 'it': 10, 'unique': 0.9, 'scaling': 'w', 'operation': 'join', 'world_size': 16, 'redis_host': 'cylon-redis.mveu6e.0001.use1.cache.amazonaws.com', 'redis_port': 6379, 'output_scaling_filename': 'cylon_scaling_test_ec2_9100000_16node', 'output_summary_filename': 'cylon_summary_test_ec2_9100000_16node', 's3_bucket': 'staylor.dev2', 's3_stopwatch_object_name': 'cylon/scaling/ec2/weak/9100000/cylon_scaling_ec2_9100000_16node.txt', 's3_summary_object_name': 'cylon/scaling/ec2/weak/9100000/cylon_summary_test_ec2_9100000_16node.txt', 'host': 'aws'} | | ip-172-31-89-59.ec2.internal | root | Linux | #1 SMP Tue Jun 27 21:49:00 UTC 2023 | -| join_4_aws_9100000_10 | ok | 4.091 | 4.091 | 2023-08-15 21:07:08 | {'rows': 9100000, 'it': 10, 'unique': 0.9, 'scaling': 'w', 'operation': 'join', 'world_size': 16, 'redis_host': 'cylon-redis.mveu6e.0001.use1.cache.amazonaws.com', 'redis_port': 6379, 'output_scaling_filename': 'cylon_scaling_test_ec2_9100000_16node', 'output_summary_filename': 'cylon_summary_test_ec2_9100000_16node', 's3_bucket': 'staylor.dev2', 's3_stopwatch_object_name': 'cylon/scaling/ec2/weak/9100000/cylon_scaling_ec2_9100000_16node.txt', 's3_summary_object_name': 'cylon/scaling/ec2/weak/9100000/cylon_summary_test_ec2_9100000_16node.txt', 'host': 'aws'} | | ip-172-31-89-59.ec2.internal | root | Linux | #1 SMP Tue Jun 27 21:49:00 UTC 2023 | -| join_5_aws_9100000_10 | ok | 3.971 | 3.971 | 2023-08-15 21:07:12 | {'rows': 9100000, 'it': 10, 'unique': 0.9, 'scaling': 'w', 'operation': 'join', 'world_size': 16, 'redis_host': 'cylon-redis.mveu6e.0001.use1.cache.amazonaws.com', 'redis_port': 6379, 'output_scaling_filename': 'cylon_scaling_test_ec2_9100000_16node', 'output_summary_filename': 'cylon_summary_test_ec2_9100000_16node', 's3_bucket': 'staylor.dev2', 's3_stopwatch_object_name': 'cylon/scaling/ec2/weak/9100000/cylon_scaling_ec2_9100000_16node.txt', 's3_summary_object_name': 'cylon/scaling/ec2/weak/9100000/cylon_summary_test_ec2_9100000_16node.txt', 'host': 'aws'} | | ip-172-31-89-59.ec2.internal | root | Linux | #1 SMP Tue Jun 27 21:49:00 UTC 2023 | -| join_6_aws_9100000_10 | ok | 3.99 | 3.99 | 2023-08-15 21:07:16 | {'rows': 9100000, 'it': 10, 'unique': 0.9, 'scaling': 'w', 'operation': 'join', 'world_size': 16, 'redis_host': 'cylon-redis.mveu6e.0001.use1.cache.amazonaws.com', 'redis_port': 6379, 'output_scaling_filename': 'cylon_scaling_test_ec2_9100000_16node', 'output_summary_filename': 'cylon_summary_test_ec2_9100000_16node', 's3_bucket': 'staylor.dev2', 's3_stopwatch_object_name': 'cylon/scaling/ec2/weak/9100000/cylon_scaling_ec2_9100000_16node.txt', 's3_summary_object_name': 'cylon/scaling/ec2/weak/9100000/cylon_summary_test_ec2_9100000_16node.txt', 'host': 'aws'} | | ip-172-31-89-59.ec2.internal | root | Linux | #1 SMP Tue Jun 27 21:49:00 UTC 2023 | -| join_7_aws_9100000_10 | ok | 4.294 | 4.294 | 2023-08-15 21:07:20 | {'rows': 9100000, 'it': 10, 'unique': 0.9, 'scaling': 'w', 'operation': 'join', 'world_size': 16, 'redis_host': 'cylon-redis.mveu6e.0001.use1.cache.amazonaws.com', 'redis_port': 6379, 'output_scaling_filename': 'cylon_scaling_test_ec2_9100000_16node', 'output_summary_filename': 'cylon_summary_test_ec2_9100000_16node', 's3_bucket': 'staylor.dev2', 's3_stopwatch_object_name': 'cylon/scaling/ec2/weak/9100000/cylon_scaling_ec2_9100000_16node.txt', 's3_summary_object_name': 'cylon/scaling/ec2/weak/9100000/cylon_summary_test_ec2_9100000_16node.txt', 'host': 'aws'} | | ip-172-31-89-59.ec2.internal | root | Linux | #1 SMP Tue Jun 27 21:49:00 UTC 2023 | -| join_8_aws_9100000_10 | ok | 4.027 | 4.027 | 2023-08-15 21:07:24 | {'rows': 9100000, 'it': 10, 'unique': 0.9, 'scaling': 'w', 'operation': 'join', 'world_size': 16, 'redis_host': 'cylon-redis.mveu6e.0001.use1.cache.amazonaws.com', 'redis_port': 6379, 'output_scaling_filename': 'cylon_scaling_test_ec2_9100000_16node', 'output_summary_filename': 'cylon_summary_test_ec2_9100000_16node', 's3_bucket': 'staylor.dev2', 's3_stopwatch_object_name': 'cylon/scaling/ec2/weak/9100000/cylon_scaling_ec2_9100000_16node.txt', 's3_summary_object_name': 'cylon/scaling/ec2/weak/9100000/cylon_summary_test_ec2_9100000_16node.txt', 'host': 'aws'} | | ip-172-31-89-59.ec2.internal | root | Linux | #1 SMP Tue Jun 27 21:49:00 UTC 2023 | -| join_9_aws_9100000_10 | ok | 3.93 | 3.93 | 2023-08-15 21:07:28 | {'rows': 9100000, 'it': 10, 'unique': 0.9, 'scaling': 'w', 'operation': 'join', 'world_size': 16, 'redis_host': 'cylon-redis.mveu6e.0001.use1.cache.amazonaws.com', 'redis_port': 6379, 'output_scaling_filename': 'cylon_scaling_test_ec2_9100000_16node', 'output_summary_filename': 'cylon_summary_test_ec2_9100000_16node', 's3_bucket': 'staylor.dev2', 's3_stopwatch_object_name': 'cylon/scaling/ec2/weak/9100000/cylon_scaling_ec2_9100000_16node.txt', 's3_summary_object_name': 'cylon/scaling/ec2/weak/9100000/cylon_summary_test_ec2_9100000_16node.txt', 'host': 'aws'} | | ip-172-31-89-59.ec2.internal | root | Linux | #1 SMP Tue Jun 27 21:49:00 UTC 2023 | -+---------------------------+----------+---------+---------+---------------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+-------+------------------------------+--------+-------+-------------------------------------+ -# csv,timer,status,time,sum,start,tag,msg,uname.node,user,uname.system,platform.version -# csv,join_total_aws_9100000_10,ok,118.549,118.549,2023-08-15 21:05:34,{'rows': 9100000, 'it': 10, 'unique': 0.9, 'scaling': 'w', 'operation': 'join', 'world_size': 16, 'redis_host': 'cylon-redis.mveu6e.0001.use1.cache.amazonaws.com', 'redis_port': 6379, 'output_scaling_filename': 'cylon_scaling_test_ec2_9100000_16node', 'output_summary_filename': 'cylon_summary_test_ec2_9100000_16node', 's3_bucket': 'staylor.dev2', 's3_stopwatch_object_name': 'cylon/scaling/ec2/weak/9100000/cylon_scaling_ec2_9100000_16node.txt', 's3_summary_object_name': 'cylon/scaling/ec2/weak/9100000/cylon_summary_test_ec2_9100000_16node.txt', 'host': 'aws'},None,ip-172-31-89-59.ec2.internal,root,Linux,#1 SMP Tue Jun 27 21:49:00 UTC 2023 -# csv,join_0_aws_9100000_10,ok,3.957,3.957,2023-08-15 21:06:52,{'rows': 9100000, 'it': 10, 'unique': 0.9, 'scaling': 'w', 'operation': 'join', 'world_size': 16, 'redis_host': 'cylon-redis.mveu6e.0001.use1.cache.amazonaws.com', 'redis_port': 6379, 'output_scaling_filename': 'cylon_scaling_test_ec2_9100000_16node', 'output_summary_filename': 'cylon_summary_test_ec2_9100000_16node', 's3_bucket': 'staylor.dev2', 's3_stopwatch_object_name': 'cylon/scaling/ec2/weak/9100000/cylon_scaling_ec2_9100000_16node.txt', 's3_summary_object_name': 'cylon/scaling/ec2/weak/9100000/cylon_summary_test_ec2_9100000_16node.txt', 'host': 'aws'},None,ip-172-31-89-59.ec2.internal,root,Linux,#1 SMP Tue Jun 27 21:49:00 UTC 2023 -# csv,join_1_aws_9100000_10,ok,3.955,3.955,2023-08-15 21:06:56,{'rows': 9100000, 'it': 10, 'unique': 0.9, 'scaling': 'w', 'operation': 'join', 'world_size': 16, 'redis_host': 'cylon-redis.mveu6e.0001.use1.cache.amazonaws.com', 'redis_port': 6379, 'output_scaling_filename': 'cylon_scaling_test_ec2_9100000_16node', 'output_summary_filename': 'cylon_summary_test_ec2_9100000_16node', 's3_bucket': 'staylor.dev2', 's3_stopwatch_object_name': 'cylon/scaling/ec2/weak/9100000/cylon_scaling_ec2_9100000_16node.txt', 's3_summary_object_name': 'cylon/scaling/ec2/weak/9100000/cylon_summary_test_ec2_9100000_16node.txt', 'host': 'aws'},None,ip-172-31-89-59.ec2.internal,root,Linux,#1 SMP Tue Jun 27 21:49:00 UTC 2023 -# csv,join_2_aws_9100000_10,ok,3.966,3.966,2023-08-15 21:07:00,{'rows': 9100000, 'it': 10, 'unique': 0.9, 'scaling': 'w', 'operation': 'join', 'world_size': 16, 'redis_host': 'cylon-redis.mveu6e.0001.use1.cache.amazonaws.com', 'redis_port': 6379, 'output_scaling_filename': 'cylon_scaling_test_ec2_9100000_16node', 'output_summary_filename': 'cylon_summary_test_ec2_9100000_16node', 's3_bucket': 'staylor.dev2', 's3_stopwatch_object_name': 'cylon/scaling/ec2/weak/9100000/cylon_scaling_ec2_9100000_16node.txt', 's3_summary_object_name': 'cylon/scaling/ec2/weak/9100000/cylon_summary_test_ec2_9100000_16node.txt', 'host': 'aws'},None,ip-172-31-89-59.ec2.internal,root,Linux,#1 SMP Tue Jun 27 21:49:00 UTC 2023 -# csv,join_3_aws_9100000_10,ok,4.084,4.084,2023-08-15 21:07:04,{'rows': 9100000, 'it': 10, 'unique': 0.9, 'scaling': 'w', 'operation': 'join', 'world_size': 16, 'redis_host': 'cylon-redis.mveu6e.0001.use1.cache.amazonaws.com', 'redis_port': 6379, 'output_scaling_filename': 'cylon_scaling_test_ec2_9100000_16node', 'output_summary_filename': 'cylon_summary_test_ec2_9100000_16node', 's3_bucket': 'staylor.dev2', 's3_stopwatch_object_name': 'cylon/scaling/ec2/weak/9100000/cylon_scaling_ec2_9100000_16node.txt', 's3_summary_object_name': 'cylon/scaling/ec2/weak/9100000/cylon_summary_test_ec2_9100000_16node.txt', 'host': 'aws'},None,ip-172-31-89-59.ec2.internal,root,Linux,#1 SMP Tue Jun 27 21:49:00 UTC 2023 -# csv,join_4_aws_9100000_10,ok,4.091,4.091,2023-08-15 21:07:08,{'rows': 9100000, 'it': 10, 'unique': 0.9, 'scaling': 'w', 'operation': 'join', 'world_size': 16, 'redis_host': 'cylon-redis.mveu6e.0001.use1.cache.amazonaws.com', 'redis_port': 6379, 'output_scaling_filename': 'cylon_scaling_test_ec2_9100000_16node', 'output_summary_filename': 'cylon_summary_test_ec2_9100000_16node', 's3_bucket': 'staylor.dev2', 's3_stopwatch_object_name': 'cylon/scaling/ec2/weak/9100000/cylon_scaling_ec2_9100000_16node.txt', 's3_summary_object_name': 'cylon/scaling/ec2/weak/9100000/cylon_summary_test_ec2_9100000_16node.txt', 'host': 'aws'},None,ip-172-31-89-59.ec2.internal,root,Linux,#1 SMP Tue Jun 27 21:49:00 UTC 2023 -# csv,join_5_aws_9100000_10,ok,3.971,3.971,2023-08-15 21:07:12,{'rows': 9100000, 'it': 10, 'unique': 0.9, 'scaling': 'w', 'operation': 'join', 'world_size': 16, 'redis_host': 'cylon-redis.mveu6e.0001.use1.cache.amazonaws.com', 'redis_port': 6379, 'output_scaling_filename': 'cylon_scaling_test_ec2_9100000_16node', 'output_summary_filename': 'cylon_summary_test_ec2_9100000_16node', 's3_bucket': 'staylor.dev2', 's3_stopwatch_object_name': 'cylon/scaling/ec2/weak/9100000/cylon_scaling_ec2_9100000_16node.txt', 's3_summary_object_name': 'cylon/scaling/ec2/weak/9100000/cylon_summary_test_ec2_9100000_16node.txt', 'host': 'aws'},None,ip-172-31-89-59.ec2.internal,root,Linux,#1 SMP Tue Jun 27 21:49:00 UTC 2023 -# csv,join_6_aws_9100000_10,ok,3.99,3.99,2023-08-15 21:07:16,{'rows': 9100000, 'it': 10, 'unique': 0.9, 'scaling': 'w', 'operation': 'join', 'world_size': 16, 'redis_host': 'cylon-redis.mveu6e.0001.use1.cache.amazonaws.com', 'redis_port': 6379, 'output_scaling_filename': 'cylon_scaling_test_ec2_9100000_16node', 'output_summary_filename': 'cylon_summary_test_ec2_9100000_16node', 's3_bucket': 'staylor.dev2', 's3_stopwatch_object_name': 'cylon/scaling/ec2/weak/9100000/cylon_scaling_ec2_9100000_16node.txt', 's3_summary_object_name': 'cylon/scaling/ec2/weak/9100000/cylon_summary_test_ec2_9100000_16node.txt', 'host': 'aws'},None,ip-172-31-89-59.ec2.internal,root,Linux,#1 SMP Tue Jun 27 21:49:00 UTC 2023 -# csv,join_7_aws_9100000_10,ok,4.294,4.294,2023-08-15 21:07:20,{'rows': 9100000, 'it': 10, 'unique': 0.9, 'scaling': 'w', 'operation': 'join', 'world_size': 16, 'redis_host': 'cylon-redis.mveu6e.0001.use1.cache.amazonaws.com', 'redis_port': 6379, 'output_scaling_filename': 'cylon_scaling_test_ec2_9100000_16node', 'output_summary_filename': 'cylon_summary_test_ec2_9100000_16node', 's3_bucket': 'staylor.dev2', 's3_stopwatch_object_name': 'cylon/scaling/ec2/weak/9100000/cylon_scaling_ec2_9100000_16node.txt', 's3_summary_object_name': 'cylon/scaling/ec2/weak/9100000/cylon_summary_test_ec2_9100000_16node.txt', 'host': 'aws'},None,ip-172-31-89-59.ec2.internal,root,Linux,#1 SMP Tue Jun 27 21:49:00 UTC 2023 -# csv,join_8_aws_9100000_10,ok,4.027,4.027,2023-08-15 21:07:24,{'rows': 9100000, 'it': 10, 'unique': 0.9, 'scaling': 'w', 'operation': 'join', 'world_size': 16, 'redis_host': 'cylon-redis.mveu6e.0001.use1.cache.amazonaws.com', 'redis_port': 6379, 'output_scaling_filename': 'cylon_scaling_test_ec2_9100000_16node', 'output_summary_filename': 'cylon_summary_test_ec2_9100000_16node', 's3_bucket': 'staylor.dev2', 's3_stopwatch_object_name': 'cylon/scaling/ec2/weak/9100000/cylon_scaling_ec2_9100000_16node.txt', 's3_summary_object_name': 'cylon/scaling/ec2/weak/9100000/cylon_summary_test_ec2_9100000_16node.txt', 'host': 'aws'},None,ip-172-31-89-59.ec2.internal,root,Linux,#1 SMP Tue Jun 27 21:49:00 UTC 2023 -# csv,join_9_aws_9100000_10,ok,3.93,3.93,2023-08-15 21:07:28,{'rows': 9100000, 'it': 10, 'unique': 0.9, 'scaling': 'w', 'operation': 'join', 'world_size': 16, 'redis_host': 'cylon-redis.mveu6e.0001.use1.cache.amazonaws.com', 'redis_port': 6379, 'output_scaling_filename': 'cylon_scaling_test_ec2_9100000_16node', 'output_summary_filename': 'cylon_summary_test_ec2_9100000_16node', 's3_bucket': 'staylor.dev2', 's3_stopwatch_object_name': 'cylon/scaling/ec2/weak/9100000/cylon_scaling_ec2_9100000_16node.txt', 's3_summary_object_name': 'cylon/scaling/ec2/weak/9100000/cylon_summary_test_ec2_9100000_16node.txt', 'host': 'aws'},None,ip-172-31-89-59.ec2.internal,root,Linux,#1 SMP Tue Jun 27 21:49:00 UTC 2023 diff --git a/aws/scripts/results-9100000/cylon_scaling_ec2_weak_9100000_1node.txt b/aws/scripts/results-9100000/cylon_scaling_ec2_weak_9100000_1node.txt deleted file mode 100644 index ccbc22c56..000000000 --- a/aws/scripts/results-9100000/cylon_scaling_ec2_weak_9100000_1node.txt +++ /dev/null @@ -1,75 +0,0 @@ - -+---------------------+-------------------------------------------------------------------+ -| Attribute | Value | -|---------------------+-------------------------------------------------------------------| -| BUG_REPORT_URL | "https://bugs.launchpad.net/ubuntu/" | -| DISTRIB_CODENAME | jammy | -| DISTRIB_DESCRIPTION | "Ubuntu 22.04.2 LTS" | -| DISTRIB_ID | Ubuntu | -| DISTRIB_RELEASE | 22.04 | -| HOME_URL | "https://www.ubuntu.com/" | -| ID | ubuntu | -| ID_LIKE | debian | -| NAME | "Ubuntu" | -| PRETTY_NAME | "Ubuntu 22.04.2 LTS" | -| PRIVACY_POLICY_URL | "https://www.ubuntu.com/legal/terms-and-policies/privacy-policy" | -| SUPPORT_URL | "https://help.ubuntu.com/" | -| UBUNTU_CODENAME | jammy | -| VERSION | "22.04.2 LTS (Jammy Jellyfish)" | -| VERSION_CODENAME | jammy | -| VERSION_ID | "22.04" | -| cpu | Intel(R) Xeon(R) Platinum 8124M CPU @ 3.00GHz | -| cpu_cores | 8 | -| cpu_count | 16 | -| cpu_threads | 16 | -| date | 2023-08-15 16:57:19.199896 | -| frequency | scpufreq(current=3404.932875, min=0.0, max=0.0) | -| mem.active | 1.4 GiB | -| mem.available | 28.5 GiB | -| mem.free | 23.7 GiB | -| mem.inactive | 4.7 GiB | -| mem.percent | 6.3 % | -| mem.total | 30.4 GiB | -| mem.used | 1.5 GiB | -| platform.version | #1 SMP Tue Jun 27 21:49:00 UTC 2023 | -| python | 3.9.17 | packaged by conda-forge | (main, Aug 10 2023, 07:02:31) | -| | [GCC 12.3.0] | -| python.pip | 23.2.1 | -| python.version | 3.9.17 | -| sys.platform | linux | -| uname.machine | x86_64 | -| uname.node | ip-172-31-84-135.ec2.internal | -| uname.processor | x86_64 | -| uname.release | 4.14.318-241.531.amzn2.x86_64 | -| uname.system | Linux | -| uname.version | #1 SMP Tue Jun 27 21:49:00 UTC 2023 | -| user | root | -+---------------------+-------------------------------------------------------------------+ - -+---------------------------+----------+--------+--------+---------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+-------+-------------------------------+--------+-------+-------------------------------------+ -| Name | Status | Time | Sum | Start | tag | msg | Node | User | OS | Version | -|---------------------------+----------+--------+--------+---------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+-------+-------------------------------+--------+-------+-------------------------------------| -| join_total_aws_9100000_10 | ok | 32.554 | 32.554 | 2023-08-15 16:56:46 | {'rows': 9100000, 'it': 10, 'unique': 0.9, 'scaling': 'w', 'operation': 'join', 'world_size': 1, 'redis_host': 'cylon-redis.mveu6e.0001.use1.cache.amazonaws.com', 'redis_port': 6379, 'output_scaling_filename': 'cylon_scaling_test_ec2_weak_9100000_1node', 'output_summary_filename': 'cylon_summary_test_ec2_weak_9100000_1node', 's3_bucket': 'staylor.dev2', 's3_stopwatch_object_name': 'cylon/scaling/ec2/weak/9100000/cylon_scaling_ec2_weak_9100000_1node.txt', 's3_summary_object_name': 'cylon/scaling/ec2/weak/9100000/cylon_summary_test_ec2_weak_9100000_1node.txt', 'host': 'aws'} | | ip-172-31-84-135.ec2.internal | root | Linux | #1 SMP Tue Jun 27 21:49:00 UTC 2023 | -| join_0_aws_9100000_10 | ok | 3.21 | 3.21 | 2023-08-15 16:56:46 | {'rows': 9100000, 'it': 10, 'unique': 0.9, 'scaling': 'w', 'operation': 'join', 'world_size': 1, 'redis_host': 'cylon-redis.mveu6e.0001.use1.cache.amazonaws.com', 'redis_port': 6379, 'output_scaling_filename': 'cylon_scaling_test_ec2_weak_9100000_1node', 'output_summary_filename': 'cylon_summary_test_ec2_weak_9100000_1node', 's3_bucket': 'staylor.dev2', 's3_stopwatch_object_name': 'cylon/scaling/ec2/weak/9100000/cylon_scaling_ec2_weak_9100000_1node.txt', 's3_summary_object_name': 'cylon/scaling/ec2/weak/9100000/cylon_summary_test_ec2_weak_9100000_1node.txt', 'host': 'aws'} | | ip-172-31-84-135.ec2.internal | root | Linux | #1 SMP Tue Jun 27 21:49:00 UTC 2023 | -| join_1_aws_9100000_10 | ok | 3.22 | 3.22 | 2023-08-15 16:56:49 | {'rows': 9100000, 'it': 10, 'unique': 0.9, 'scaling': 'w', 'operation': 'join', 'world_size': 1, 'redis_host': 'cylon-redis.mveu6e.0001.use1.cache.amazonaws.com', 'redis_port': 6379, 'output_scaling_filename': 'cylon_scaling_test_ec2_weak_9100000_1node', 'output_summary_filename': 'cylon_summary_test_ec2_weak_9100000_1node', 's3_bucket': 'staylor.dev2', 's3_stopwatch_object_name': 'cylon/scaling/ec2/weak/9100000/cylon_scaling_ec2_weak_9100000_1node.txt', 's3_summary_object_name': 'cylon/scaling/ec2/weak/9100000/cylon_summary_test_ec2_weak_9100000_1node.txt', 'host': 'aws'} | | ip-172-31-84-135.ec2.internal | root | Linux | #1 SMP Tue Jun 27 21:49:00 UTC 2023 | -| join_2_aws_9100000_10 | ok | 3.221 | 3.221 | 2023-08-15 16:56:53 | {'rows': 9100000, 'it': 10, 'unique': 0.9, 'scaling': 'w', 'operation': 'join', 'world_size': 1, 'redis_host': 'cylon-redis.mveu6e.0001.use1.cache.amazonaws.com', 'redis_port': 6379, 'output_scaling_filename': 'cylon_scaling_test_ec2_weak_9100000_1node', 'output_summary_filename': 'cylon_summary_test_ec2_weak_9100000_1node', 's3_bucket': 'staylor.dev2', 's3_stopwatch_object_name': 'cylon/scaling/ec2/weak/9100000/cylon_scaling_ec2_weak_9100000_1node.txt', 's3_summary_object_name': 'cylon/scaling/ec2/weak/9100000/cylon_summary_test_ec2_weak_9100000_1node.txt', 'host': 'aws'} | | ip-172-31-84-135.ec2.internal | root | Linux | #1 SMP Tue Jun 27 21:49:00 UTC 2023 | -| join_3_aws_9100000_10 | ok | 3.223 | 3.223 | 2023-08-15 16:56:56 | {'rows': 9100000, 'it': 10, 'unique': 0.9, 'scaling': 'w', 'operation': 'join', 'world_size': 1, 'redis_host': 'cylon-redis.mveu6e.0001.use1.cache.amazonaws.com', 'redis_port': 6379, 'output_scaling_filename': 'cylon_scaling_test_ec2_weak_9100000_1node', 'output_summary_filename': 'cylon_summary_test_ec2_weak_9100000_1node', 's3_bucket': 'staylor.dev2', 's3_stopwatch_object_name': 'cylon/scaling/ec2/weak/9100000/cylon_scaling_ec2_weak_9100000_1node.txt', 's3_summary_object_name': 'cylon/scaling/ec2/weak/9100000/cylon_summary_test_ec2_weak_9100000_1node.txt', 'host': 'aws'} | | ip-172-31-84-135.ec2.internal | root | Linux | #1 SMP Tue Jun 27 21:49:00 UTC 2023 | -| join_4_aws_9100000_10 | ok | 3.216 | 3.216 | 2023-08-15 16:56:59 | {'rows': 9100000, 'it': 10, 'unique': 0.9, 'scaling': 'w', 'operation': 'join', 'world_size': 1, 'redis_host': 'cylon-redis.mveu6e.0001.use1.cache.amazonaws.com', 'redis_port': 6379, 'output_scaling_filename': 'cylon_scaling_test_ec2_weak_9100000_1node', 'output_summary_filename': 'cylon_summary_test_ec2_weak_9100000_1node', 's3_bucket': 'staylor.dev2', 's3_stopwatch_object_name': 'cylon/scaling/ec2/weak/9100000/cylon_scaling_ec2_weak_9100000_1node.txt', 's3_summary_object_name': 'cylon/scaling/ec2/weak/9100000/cylon_summary_test_ec2_weak_9100000_1node.txt', 'host': 'aws'} | | ip-172-31-84-135.ec2.internal | root | Linux | #1 SMP Tue Jun 27 21:49:00 UTC 2023 | -| join_5_aws_9100000_10 | ok | 3.22 | 3.22 | 2023-08-15 16:57:02 | {'rows': 9100000, 'it': 10, 'unique': 0.9, 'scaling': 'w', 'operation': 'join', 'world_size': 1, 'redis_host': 'cylon-redis.mveu6e.0001.use1.cache.amazonaws.com', 'redis_port': 6379, 'output_scaling_filename': 'cylon_scaling_test_ec2_weak_9100000_1node', 'output_summary_filename': 'cylon_summary_test_ec2_weak_9100000_1node', 's3_bucket': 'staylor.dev2', 's3_stopwatch_object_name': 'cylon/scaling/ec2/weak/9100000/cylon_scaling_ec2_weak_9100000_1node.txt', 's3_summary_object_name': 'cylon/scaling/ec2/weak/9100000/cylon_summary_test_ec2_weak_9100000_1node.txt', 'host': 'aws'} | | ip-172-31-84-135.ec2.internal | root | Linux | #1 SMP Tue Jun 27 21:49:00 UTC 2023 | -| join_6_aws_9100000_10 | ok | 3.225 | 3.225 | 2023-08-15 16:57:05 | {'rows': 9100000, 'it': 10, 'unique': 0.9, 'scaling': 'w', 'operation': 'join', 'world_size': 1, 'redis_host': 'cylon-redis.mveu6e.0001.use1.cache.amazonaws.com', 'redis_port': 6379, 'output_scaling_filename': 'cylon_scaling_test_ec2_weak_9100000_1node', 'output_summary_filename': 'cylon_summary_test_ec2_weak_9100000_1node', 's3_bucket': 'staylor.dev2', 's3_stopwatch_object_name': 'cylon/scaling/ec2/weak/9100000/cylon_scaling_ec2_weak_9100000_1node.txt', 's3_summary_object_name': 'cylon/scaling/ec2/weak/9100000/cylon_summary_test_ec2_weak_9100000_1node.txt', 'host': 'aws'} | | ip-172-31-84-135.ec2.internal | root | Linux | #1 SMP Tue Jun 27 21:49:00 UTC 2023 | -| join_7_aws_9100000_10 | ok | 3.245 | 3.245 | 2023-08-15 16:57:09 | {'rows': 9100000, 'it': 10, 'unique': 0.9, 'scaling': 'w', 'operation': 'join', 'world_size': 1, 'redis_host': 'cylon-redis.mveu6e.0001.use1.cache.amazonaws.com', 'redis_port': 6379, 'output_scaling_filename': 'cylon_scaling_test_ec2_weak_9100000_1node', 'output_summary_filename': 'cylon_summary_test_ec2_weak_9100000_1node', 's3_bucket': 'staylor.dev2', 's3_stopwatch_object_name': 'cylon/scaling/ec2/weak/9100000/cylon_scaling_ec2_weak_9100000_1node.txt', 's3_summary_object_name': 'cylon/scaling/ec2/weak/9100000/cylon_summary_test_ec2_weak_9100000_1node.txt', 'host': 'aws'} | | ip-172-31-84-135.ec2.internal | root | Linux | #1 SMP Tue Jun 27 21:49:00 UTC 2023 | -| join_8_aws_9100000_10 | ok | 3.218 | 3.218 | 2023-08-15 16:57:12 | {'rows': 9100000, 'it': 10, 'unique': 0.9, 'scaling': 'w', 'operation': 'join', 'world_size': 1, 'redis_host': 'cylon-redis.mveu6e.0001.use1.cache.amazonaws.com', 'redis_port': 6379, 'output_scaling_filename': 'cylon_scaling_test_ec2_weak_9100000_1node', 'output_summary_filename': 'cylon_summary_test_ec2_weak_9100000_1node', 's3_bucket': 'staylor.dev2', 's3_stopwatch_object_name': 'cylon/scaling/ec2/weak/9100000/cylon_scaling_ec2_weak_9100000_1node.txt', 's3_summary_object_name': 'cylon/scaling/ec2/weak/9100000/cylon_summary_test_ec2_weak_9100000_1node.txt', 'host': 'aws'} | | ip-172-31-84-135.ec2.internal | root | Linux | #1 SMP Tue Jun 27 21:49:00 UTC 2023 | -| join_9_aws_9100000_10 | ok | 3.224 | 3.224 | 2023-08-15 16:57:15 | {'rows': 9100000, 'it': 10, 'unique': 0.9, 'scaling': 'w', 'operation': 'join', 'world_size': 1, 'redis_host': 'cylon-redis.mveu6e.0001.use1.cache.amazonaws.com', 'redis_port': 6379, 'output_scaling_filename': 'cylon_scaling_test_ec2_weak_9100000_1node', 'output_summary_filename': 'cylon_summary_test_ec2_weak_9100000_1node', 's3_bucket': 'staylor.dev2', 's3_stopwatch_object_name': 'cylon/scaling/ec2/weak/9100000/cylon_scaling_ec2_weak_9100000_1node.txt', 's3_summary_object_name': 'cylon/scaling/ec2/weak/9100000/cylon_summary_test_ec2_weak_9100000_1node.txt', 'host': 'aws'} | | ip-172-31-84-135.ec2.internal | root | Linux | #1 SMP Tue Jun 27 21:49:00 UTC 2023 | -+---------------------------+----------+--------+--------+---------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+-------+-------------------------------+--------+-------+-------------------------------------+ -# csv,timer,status,time,sum,start,tag,msg,uname.node,user,uname.system,platform.version -# csv,join_total_aws_9100000_10,ok,32.554,32.554,2023-08-15 16:56:46,{'rows': 9100000, 'it': 10, 'unique': 0.9, 'scaling': 'w', 'operation': 'join', 'world_size': 1, 'redis_host': 'cylon-redis.mveu6e.0001.use1.cache.amazonaws.com', 'redis_port': 6379, 'output_scaling_filename': 'cylon_scaling_test_ec2_weak_9100000_1node', 'output_summary_filename': 'cylon_summary_test_ec2_weak_9100000_1node', 's3_bucket': 'staylor.dev2', 's3_stopwatch_object_name': 'cylon/scaling/ec2/weak/9100000/cylon_scaling_ec2_weak_9100000_1node.txt', 's3_summary_object_name': 'cylon/scaling/ec2/weak/9100000/cylon_summary_test_ec2_weak_9100000_1node.txt', 'host': 'aws'},None,ip-172-31-84-135.ec2.internal,root,Linux,#1 SMP Tue Jun 27 21:49:00 UTC 2023 -# csv,join_0_aws_9100000_10,ok,3.21,3.21,2023-08-15 16:56:46,{'rows': 9100000, 'it': 10, 'unique': 0.9, 'scaling': 'w', 'operation': 'join', 'world_size': 1, 'redis_host': 'cylon-redis.mveu6e.0001.use1.cache.amazonaws.com', 'redis_port': 6379, 'output_scaling_filename': 'cylon_scaling_test_ec2_weak_9100000_1node', 'output_summary_filename': 'cylon_summary_test_ec2_weak_9100000_1node', 's3_bucket': 'staylor.dev2', 's3_stopwatch_object_name': 'cylon/scaling/ec2/weak/9100000/cylon_scaling_ec2_weak_9100000_1node.txt', 's3_summary_object_name': 'cylon/scaling/ec2/weak/9100000/cylon_summary_test_ec2_weak_9100000_1node.txt', 'host': 'aws'},None,ip-172-31-84-135.ec2.internal,root,Linux,#1 SMP Tue Jun 27 21:49:00 UTC 2023 -# csv,join_1_aws_9100000_10,ok,3.22,3.22,2023-08-15 16:56:49,{'rows': 9100000, 'it': 10, 'unique': 0.9, 'scaling': 'w', 'operation': 'join', 'world_size': 1, 'redis_host': 'cylon-redis.mveu6e.0001.use1.cache.amazonaws.com', 'redis_port': 6379, 'output_scaling_filename': 'cylon_scaling_test_ec2_weak_9100000_1node', 'output_summary_filename': 'cylon_summary_test_ec2_weak_9100000_1node', 's3_bucket': 'staylor.dev2', 's3_stopwatch_object_name': 'cylon/scaling/ec2/weak/9100000/cylon_scaling_ec2_weak_9100000_1node.txt', 's3_summary_object_name': 'cylon/scaling/ec2/weak/9100000/cylon_summary_test_ec2_weak_9100000_1node.txt', 'host': 'aws'},None,ip-172-31-84-135.ec2.internal,root,Linux,#1 SMP Tue Jun 27 21:49:00 UTC 2023 -# csv,join_2_aws_9100000_10,ok,3.221,3.221,2023-08-15 16:56:53,{'rows': 9100000, 'it': 10, 'unique': 0.9, 'scaling': 'w', 'operation': 'join', 'world_size': 1, 'redis_host': 'cylon-redis.mveu6e.0001.use1.cache.amazonaws.com', 'redis_port': 6379, 'output_scaling_filename': 'cylon_scaling_test_ec2_weak_9100000_1node', 'output_summary_filename': 'cylon_summary_test_ec2_weak_9100000_1node', 's3_bucket': 'staylor.dev2', 's3_stopwatch_object_name': 'cylon/scaling/ec2/weak/9100000/cylon_scaling_ec2_weak_9100000_1node.txt', 's3_summary_object_name': 'cylon/scaling/ec2/weak/9100000/cylon_summary_test_ec2_weak_9100000_1node.txt', 'host': 'aws'},None,ip-172-31-84-135.ec2.internal,root,Linux,#1 SMP Tue Jun 27 21:49:00 UTC 2023 -# csv,join_3_aws_9100000_10,ok,3.223,3.223,2023-08-15 16:56:56,{'rows': 9100000, 'it': 10, 'unique': 0.9, 'scaling': 'w', 'operation': 'join', 'world_size': 1, 'redis_host': 'cylon-redis.mveu6e.0001.use1.cache.amazonaws.com', 'redis_port': 6379, 'output_scaling_filename': 'cylon_scaling_test_ec2_weak_9100000_1node', 'output_summary_filename': 'cylon_summary_test_ec2_weak_9100000_1node', 's3_bucket': 'staylor.dev2', 's3_stopwatch_object_name': 'cylon/scaling/ec2/weak/9100000/cylon_scaling_ec2_weak_9100000_1node.txt', 's3_summary_object_name': 'cylon/scaling/ec2/weak/9100000/cylon_summary_test_ec2_weak_9100000_1node.txt', 'host': 'aws'},None,ip-172-31-84-135.ec2.internal,root,Linux,#1 SMP Tue Jun 27 21:49:00 UTC 2023 -# csv,join_4_aws_9100000_10,ok,3.216,3.216,2023-08-15 16:56:59,{'rows': 9100000, 'it': 10, 'unique': 0.9, 'scaling': 'w', 'operation': 'join', 'world_size': 1, 'redis_host': 'cylon-redis.mveu6e.0001.use1.cache.amazonaws.com', 'redis_port': 6379, 'output_scaling_filename': 'cylon_scaling_test_ec2_weak_9100000_1node', 'output_summary_filename': 'cylon_summary_test_ec2_weak_9100000_1node', 's3_bucket': 'staylor.dev2', 's3_stopwatch_object_name': 'cylon/scaling/ec2/weak/9100000/cylon_scaling_ec2_weak_9100000_1node.txt', 's3_summary_object_name': 'cylon/scaling/ec2/weak/9100000/cylon_summary_test_ec2_weak_9100000_1node.txt', 'host': 'aws'},None,ip-172-31-84-135.ec2.internal,root,Linux,#1 SMP Tue Jun 27 21:49:00 UTC 2023 -# csv,join_5_aws_9100000_10,ok,3.22,3.22,2023-08-15 16:57:02,{'rows': 9100000, 'it': 10, 'unique': 0.9, 'scaling': 'w', 'operation': 'join', 'world_size': 1, 'redis_host': 'cylon-redis.mveu6e.0001.use1.cache.amazonaws.com', 'redis_port': 6379, 'output_scaling_filename': 'cylon_scaling_test_ec2_weak_9100000_1node', 'output_summary_filename': 'cylon_summary_test_ec2_weak_9100000_1node', 's3_bucket': 'staylor.dev2', 's3_stopwatch_object_name': 'cylon/scaling/ec2/weak/9100000/cylon_scaling_ec2_weak_9100000_1node.txt', 's3_summary_object_name': 'cylon/scaling/ec2/weak/9100000/cylon_summary_test_ec2_weak_9100000_1node.txt', 'host': 'aws'},None,ip-172-31-84-135.ec2.internal,root,Linux,#1 SMP Tue Jun 27 21:49:00 UTC 2023 -# csv,join_6_aws_9100000_10,ok,3.225,3.225,2023-08-15 16:57:05,{'rows': 9100000, 'it': 10, 'unique': 0.9, 'scaling': 'w', 'operation': 'join', 'world_size': 1, 'redis_host': 'cylon-redis.mveu6e.0001.use1.cache.amazonaws.com', 'redis_port': 6379, 'output_scaling_filename': 'cylon_scaling_test_ec2_weak_9100000_1node', 'output_summary_filename': 'cylon_summary_test_ec2_weak_9100000_1node', 's3_bucket': 'staylor.dev2', 's3_stopwatch_object_name': 'cylon/scaling/ec2/weak/9100000/cylon_scaling_ec2_weak_9100000_1node.txt', 's3_summary_object_name': 'cylon/scaling/ec2/weak/9100000/cylon_summary_test_ec2_weak_9100000_1node.txt', 'host': 'aws'},None,ip-172-31-84-135.ec2.internal,root,Linux,#1 SMP Tue Jun 27 21:49:00 UTC 2023 -# csv,join_7_aws_9100000_10,ok,3.245,3.245,2023-08-15 16:57:09,{'rows': 9100000, 'it': 10, 'unique': 0.9, 'scaling': 'w', 'operation': 'join', 'world_size': 1, 'redis_host': 'cylon-redis.mveu6e.0001.use1.cache.amazonaws.com', 'redis_port': 6379, 'output_scaling_filename': 'cylon_scaling_test_ec2_weak_9100000_1node', 'output_summary_filename': 'cylon_summary_test_ec2_weak_9100000_1node', 's3_bucket': 'staylor.dev2', 's3_stopwatch_object_name': 'cylon/scaling/ec2/weak/9100000/cylon_scaling_ec2_weak_9100000_1node.txt', 's3_summary_object_name': 'cylon/scaling/ec2/weak/9100000/cylon_summary_test_ec2_weak_9100000_1node.txt', 'host': 'aws'},None,ip-172-31-84-135.ec2.internal,root,Linux,#1 SMP Tue Jun 27 21:49:00 UTC 2023 -# csv,join_8_aws_9100000_10,ok,3.218,3.218,2023-08-15 16:57:12,{'rows': 9100000, 'it': 10, 'unique': 0.9, 'scaling': 'w', 'operation': 'join', 'world_size': 1, 'redis_host': 'cylon-redis.mveu6e.0001.use1.cache.amazonaws.com', 'redis_port': 6379, 'output_scaling_filename': 'cylon_scaling_test_ec2_weak_9100000_1node', 'output_summary_filename': 'cylon_summary_test_ec2_weak_9100000_1node', 's3_bucket': 'staylor.dev2', 's3_stopwatch_object_name': 'cylon/scaling/ec2/weak/9100000/cylon_scaling_ec2_weak_9100000_1node.txt', 's3_summary_object_name': 'cylon/scaling/ec2/weak/9100000/cylon_summary_test_ec2_weak_9100000_1node.txt', 'host': 'aws'},None,ip-172-31-84-135.ec2.internal,root,Linux,#1 SMP Tue Jun 27 21:49:00 UTC 2023 -# csv,join_9_aws_9100000_10,ok,3.224,3.224,2023-08-15 16:57:15,{'rows': 9100000, 'it': 10, 'unique': 0.9, 'scaling': 'w', 'operation': 'join', 'world_size': 1, 'redis_host': 'cylon-redis.mveu6e.0001.use1.cache.amazonaws.com', 'redis_port': 6379, 'output_scaling_filename': 'cylon_scaling_test_ec2_weak_9100000_1node', 'output_summary_filename': 'cylon_summary_test_ec2_weak_9100000_1node', 's3_bucket': 'staylor.dev2', 's3_stopwatch_object_name': 'cylon/scaling/ec2/weak/9100000/cylon_scaling_ec2_weak_9100000_1node.txt', 's3_summary_object_name': 'cylon/scaling/ec2/weak/9100000/cylon_summary_test_ec2_weak_9100000_1node.txt', 'host': 'aws'},None,ip-172-31-84-135.ec2.internal,root,Linux,#1 SMP Tue Jun 27 21:49:00 UTC 2023 diff --git a/aws/scripts/results-9100000/cylon_scaling_ec2_weak_9100000_2node.txt b/aws/scripts/results-9100000/cylon_scaling_ec2_weak_9100000_2node.txt deleted file mode 100644 index 0a2f26f30..000000000 --- a/aws/scripts/results-9100000/cylon_scaling_ec2_weak_9100000_2node.txt +++ /dev/null @@ -1,75 +0,0 @@ - -+---------------------+-------------------------------------------------------------------+ -| Attribute | Value | -|---------------------+-------------------------------------------------------------------| -| BUG_REPORT_URL | "https://bugs.launchpad.net/ubuntu/" | -| DISTRIB_CODENAME | jammy | -| DISTRIB_DESCRIPTION | "Ubuntu 22.04.2 LTS" | -| DISTRIB_ID | Ubuntu | -| DISTRIB_RELEASE | 22.04 | -| HOME_URL | "https://www.ubuntu.com/" | -| ID | ubuntu | -| ID_LIKE | debian | -| NAME | "Ubuntu" | -| PRETTY_NAME | "Ubuntu 22.04.2 LTS" | -| PRIVACY_POLICY_URL | "https://www.ubuntu.com/legal/terms-and-policies/privacy-policy" | -| SUPPORT_URL | "https://help.ubuntu.com/" | -| UBUNTU_CODENAME | jammy | -| VERSION | "22.04.2 LTS (Jammy Jellyfish)" | -| VERSION_CODENAME | jammy | -| VERSION_ID | "22.04" | -| cpu | Intel(R) Xeon(R) Platinum 8275CL CPU @ 3.00GHz | -| cpu_cores | 8 | -| cpu_count | 16 | -| cpu_threads | 16 | -| date | 2023-08-15 20:50:34.410137 | -| frequency | scpufreq(current=3610.8821875000003, min=0.0, max=0.0) | -| mem.active | 1.3 GiB | -| mem.available | 28.7 GiB | -| mem.free | 23.9 GiB | -| mem.inactive | 4.7 GiB | -| mem.percent | 6.3 % | -| mem.total | 30.6 GiB | -| mem.used | 1.5 GiB | -| platform.version | #1 SMP Tue Jun 27 21:49:00 UTC 2023 | -| python | 3.9.17 | packaged by conda-forge | (main, Aug 10 2023, 07:02:31) | -| | [GCC 12.3.0] | -| python.pip | 23.2.1 | -| python.version | 3.9.17 | -| sys.platform | linux | -| uname.machine | x86_64 | -| uname.node | ip-172-31-92-255.ec2.internal | -| uname.processor | x86_64 | -| uname.release | 4.14.318-241.531.amzn2.x86_64 | -| uname.system | Linux | -| uname.version | #1 SMP Tue Jun 27 21:49:00 UTC 2023 | -| user | root | -+---------------------+-------------------------------------------------------------------+ - -+---------------------------+----------+--------+--------+---------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+-------+-------------------------------+--------+-------+-------------------------------------+ -| Name | Status | Time | Sum | Start | tag | msg | Node | User | OS | Version | -|---------------------------+----------+--------+--------+---------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+-------+-------------------------------+--------+-------+-------------------------------------| -| join_total_aws_9100000_10 | ok | 39.566 | 39.566 | 2023-08-15 20:49:54 | {'rows': 9100000, 'it': 10, 'unique': 0.9, 'scaling': 'w', 'operation': 'join', 'world_size': 2, 'redis_host': 'cylon-redis.mveu6e.0001.use1.cache.amazonaws.com', 'redis_port': 6379, 'output_scaling_filename': 'cylon_scaling_test_ec2_weak_9100000_2node', 'output_summary_filename': 'cylon_summary_test_ec2_weak_9100000_2node', 's3_bucket': 'staylor.dev2', 's3_stopwatch_object_name': 'cylon/scaling/ec2/weak/9100000/cylon_scaling_ec2_weak_9100000_2node.txt', 's3_summary_object_name': 'cylon/scaling/ec2/weak/9100000/cylon_summary_test_ec2_weak_9100000_2node.txt', 'host': 'aws'} | | ip-172-31-92-255.ec2.internal | root | Linux | #1 SMP Tue Jun 27 21:49:00 UTC 2023 | -| join_0_aws_9100000_10 | ok | 3.887 | 3.887 | 2023-08-15 20:49:54 | {'rows': 9100000, 'it': 10, 'unique': 0.9, 'scaling': 'w', 'operation': 'join', 'world_size': 2, 'redis_host': 'cylon-redis.mveu6e.0001.use1.cache.amazonaws.com', 'redis_port': 6379, 'output_scaling_filename': 'cylon_scaling_test_ec2_weak_9100000_2node', 'output_summary_filename': 'cylon_summary_test_ec2_weak_9100000_2node', 's3_bucket': 'staylor.dev2', 's3_stopwatch_object_name': 'cylon/scaling/ec2/weak/9100000/cylon_scaling_ec2_weak_9100000_2node.txt', 's3_summary_object_name': 'cylon/scaling/ec2/weak/9100000/cylon_summary_test_ec2_weak_9100000_2node.txt', 'host': 'aws'} | | ip-172-31-92-255.ec2.internal | root | Linux | #1 SMP Tue Jun 27 21:49:00 UTC 2023 | -| join_1_aws_9100000_10 | ok | 3.888 | 3.888 | 2023-08-15 20:49:58 | {'rows': 9100000, 'it': 10, 'unique': 0.9, 'scaling': 'w', 'operation': 'join', 'world_size': 2, 'redis_host': 'cylon-redis.mveu6e.0001.use1.cache.amazonaws.com', 'redis_port': 6379, 'output_scaling_filename': 'cylon_scaling_test_ec2_weak_9100000_2node', 'output_summary_filename': 'cylon_summary_test_ec2_weak_9100000_2node', 's3_bucket': 'staylor.dev2', 's3_stopwatch_object_name': 'cylon/scaling/ec2/weak/9100000/cylon_scaling_ec2_weak_9100000_2node.txt', 's3_summary_object_name': 'cylon/scaling/ec2/weak/9100000/cylon_summary_test_ec2_weak_9100000_2node.txt', 'host': 'aws'} | | ip-172-31-92-255.ec2.internal | root | Linux | #1 SMP Tue Jun 27 21:49:00 UTC 2023 | -| join_2_aws_9100000_10 | ok | 3.897 | 3.897 | 2023-08-15 20:50:02 | {'rows': 9100000, 'it': 10, 'unique': 0.9, 'scaling': 'w', 'operation': 'join', 'world_size': 2, 'redis_host': 'cylon-redis.mveu6e.0001.use1.cache.amazonaws.com', 'redis_port': 6379, 'output_scaling_filename': 'cylon_scaling_test_ec2_weak_9100000_2node', 'output_summary_filename': 'cylon_summary_test_ec2_weak_9100000_2node', 's3_bucket': 'staylor.dev2', 's3_stopwatch_object_name': 'cylon/scaling/ec2/weak/9100000/cylon_scaling_ec2_weak_9100000_2node.txt', 's3_summary_object_name': 'cylon/scaling/ec2/weak/9100000/cylon_summary_test_ec2_weak_9100000_2node.txt', 'host': 'aws'} | | ip-172-31-92-255.ec2.internal | root | Linux | #1 SMP Tue Jun 27 21:49:00 UTC 2023 | -| join_3_aws_9100000_10 | ok | 3.902 | 3.902 | 2023-08-15 20:50:06 | {'rows': 9100000, 'it': 10, 'unique': 0.9, 'scaling': 'w', 'operation': 'join', 'world_size': 2, 'redis_host': 'cylon-redis.mveu6e.0001.use1.cache.amazonaws.com', 'redis_port': 6379, 'output_scaling_filename': 'cylon_scaling_test_ec2_weak_9100000_2node', 'output_summary_filename': 'cylon_summary_test_ec2_weak_9100000_2node', 's3_bucket': 'staylor.dev2', 's3_stopwatch_object_name': 'cylon/scaling/ec2/weak/9100000/cylon_scaling_ec2_weak_9100000_2node.txt', 's3_summary_object_name': 'cylon/scaling/ec2/weak/9100000/cylon_summary_test_ec2_weak_9100000_2node.txt', 'host': 'aws'} | | ip-172-31-92-255.ec2.internal | root | Linux | #1 SMP Tue Jun 27 21:49:00 UTC 2023 | -| join_4_aws_9100000_10 | ok | 3.903 | 3.903 | 2023-08-15 20:50:10 | {'rows': 9100000, 'it': 10, 'unique': 0.9, 'scaling': 'w', 'operation': 'join', 'world_size': 2, 'redis_host': 'cylon-redis.mveu6e.0001.use1.cache.amazonaws.com', 'redis_port': 6379, 'output_scaling_filename': 'cylon_scaling_test_ec2_weak_9100000_2node', 'output_summary_filename': 'cylon_summary_test_ec2_weak_9100000_2node', 's3_bucket': 'staylor.dev2', 's3_stopwatch_object_name': 'cylon/scaling/ec2/weak/9100000/cylon_scaling_ec2_weak_9100000_2node.txt', 's3_summary_object_name': 'cylon/scaling/ec2/weak/9100000/cylon_summary_test_ec2_weak_9100000_2node.txt', 'host': 'aws'} | | ip-172-31-92-255.ec2.internal | root | Linux | #1 SMP Tue Jun 27 21:49:00 UTC 2023 | -| join_5_aws_9100000_10 | ok | 3.903 | 3.903 | 2023-08-15 20:50:14 | {'rows': 9100000, 'it': 10, 'unique': 0.9, 'scaling': 'w', 'operation': 'join', 'world_size': 2, 'redis_host': 'cylon-redis.mveu6e.0001.use1.cache.amazonaws.com', 'redis_port': 6379, 'output_scaling_filename': 'cylon_scaling_test_ec2_weak_9100000_2node', 'output_summary_filename': 'cylon_summary_test_ec2_weak_9100000_2node', 's3_bucket': 'staylor.dev2', 's3_stopwatch_object_name': 'cylon/scaling/ec2/weak/9100000/cylon_scaling_ec2_weak_9100000_2node.txt', 's3_summary_object_name': 'cylon/scaling/ec2/weak/9100000/cylon_summary_test_ec2_weak_9100000_2node.txt', 'host': 'aws'} | | ip-172-31-92-255.ec2.internal | root | Linux | #1 SMP Tue Jun 27 21:49:00 UTC 2023 | -| join_6_aws_9100000_10 | ok | 3.978 | 3.978 | 2023-08-15 20:50:18 | {'rows': 9100000, 'it': 10, 'unique': 0.9, 'scaling': 'w', 'operation': 'join', 'world_size': 2, 'redis_host': 'cylon-redis.mveu6e.0001.use1.cache.amazonaws.com', 'redis_port': 6379, 'output_scaling_filename': 'cylon_scaling_test_ec2_weak_9100000_2node', 'output_summary_filename': 'cylon_summary_test_ec2_weak_9100000_2node', 's3_bucket': 'staylor.dev2', 's3_stopwatch_object_name': 'cylon/scaling/ec2/weak/9100000/cylon_scaling_ec2_weak_9100000_2node.txt', 's3_summary_object_name': 'cylon/scaling/ec2/weak/9100000/cylon_summary_test_ec2_weak_9100000_2node.txt', 'host': 'aws'} | | ip-172-31-92-255.ec2.internal | root | Linux | #1 SMP Tue Jun 27 21:49:00 UTC 2023 | -| join_7_aws_9100000_10 | ok | 3.917 | 3.917 | 2023-08-15 20:50:22 | {'rows': 9100000, 'it': 10, 'unique': 0.9, 'scaling': 'w', 'operation': 'join', 'world_size': 2, 'redis_host': 'cylon-redis.mveu6e.0001.use1.cache.amazonaws.com', 'redis_port': 6379, 'output_scaling_filename': 'cylon_scaling_test_ec2_weak_9100000_2node', 'output_summary_filename': 'cylon_summary_test_ec2_weak_9100000_2node', 's3_bucket': 'staylor.dev2', 's3_stopwatch_object_name': 'cylon/scaling/ec2/weak/9100000/cylon_scaling_ec2_weak_9100000_2node.txt', 's3_summary_object_name': 'cylon/scaling/ec2/weak/9100000/cylon_summary_test_ec2_weak_9100000_2node.txt', 'host': 'aws'} | | ip-172-31-92-255.ec2.internal | root | Linux | #1 SMP Tue Jun 27 21:49:00 UTC 2023 | -| join_8_aws_9100000_10 | ok | 3.906 | 3.906 | 2023-08-15 20:50:26 | {'rows': 9100000, 'it': 10, 'unique': 0.9, 'scaling': 'w', 'operation': 'join', 'world_size': 2, 'redis_host': 'cylon-redis.mveu6e.0001.use1.cache.amazonaws.com', 'redis_port': 6379, 'output_scaling_filename': 'cylon_scaling_test_ec2_weak_9100000_2node', 'output_summary_filename': 'cylon_summary_test_ec2_weak_9100000_2node', 's3_bucket': 'staylor.dev2', 's3_stopwatch_object_name': 'cylon/scaling/ec2/weak/9100000/cylon_scaling_ec2_weak_9100000_2node.txt', 's3_summary_object_name': 'cylon/scaling/ec2/weak/9100000/cylon_summary_test_ec2_weak_9100000_2node.txt', 'host': 'aws'} | | ip-172-31-92-255.ec2.internal | root | Linux | #1 SMP Tue Jun 27 21:49:00 UTC 2023 | -| join_9_aws_9100000_10 | ok | 3.902 | 3.902 | 2023-08-15 20:50:30 | {'rows': 9100000, 'it': 10, 'unique': 0.9, 'scaling': 'w', 'operation': 'join', 'world_size': 2, 'redis_host': 'cylon-redis.mveu6e.0001.use1.cache.amazonaws.com', 'redis_port': 6379, 'output_scaling_filename': 'cylon_scaling_test_ec2_weak_9100000_2node', 'output_summary_filename': 'cylon_summary_test_ec2_weak_9100000_2node', 's3_bucket': 'staylor.dev2', 's3_stopwatch_object_name': 'cylon/scaling/ec2/weak/9100000/cylon_scaling_ec2_weak_9100000_2node.txt', 's3_summary_object_name': 'cylon/scaling/ec2/weak/9100000/cylon_summary_test_ec2_weak_9100000_2node.txt', 'host': 'aws'} | | ip-172-31-92-255.ec2.internal | root | Linux | #1 SMP Tue Jun 27 21:49:00 UTC 2023 | -+---------------------------+----------+--------+--------+---------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+-------+-------------------------------+--------+-------+-------------------------------------+ -# csv,timer,status,time,sum,start,tag,msg,uname.node,user,uname.system,platform.version -# csv,join_total_aws_9100000_10,ok,39.566,39.566,2023-08-15 20:49:54,{'rows': 9100000, 'it': 10, 'unique': 0.9, 'scaling': 'w', 'operation': 'join', 'world_size': 2, 'redis_host': 'cylon-redis.mveu6e.0001.use1.cache.amazonaws.com', 'redis_port': 6379, 'output_scaling_filename': 'cylon_scaling_test_ec2_weak_9100000_2node', 'output_summary_filename': 'cylon_summary_test_ec2_weak_9100000_2node', 's3_bucket': 'staylor.dev2', 's3_stopwatch_object_name': 'cylon/scaling/ec2/weak/9100000/cylon_scaling_ec2_weak_9100000_2node.txt', 's3_summary_object_name': 'cylon/scaling/ec2/weak/9100000/cylon_summary_test_ec2_weak_9100000_2node.txt', 'host': 'aws'},None,ip-172-31-92-255.ec2.internal,root,Linux,#1 SMP Tue Jun 27 21:49:00 UTC 2023 -# csv,join_0_aws_9100000_10,ok,3.887,3.887,2023-08-15 20:49:54,{'rows': 9100000, 'it': 10, 'unique': 0.9, 'scaling': 'w', 'operation': 'join', 'world_size': 2, 'redis_host': 'cylon-redis.mveu6e.0001.use1.cache.amazonaws.com', 'redis_port': 6379, 'output_scaling_filename': 'cylon_scaling_test_ec2_weak_9100000_2node', 'output_summary_filename': 'cylon_summary_test_ec2_weak_9100000_2node', 's3_bucket': 'staylor.dev2', 's3_stopwatch_object_name': 'cylon/scaling/ec2/weak/9100000/cylon_scaling_ec2_weak_9100000_2node.txt', 's3_summary_object_name': 'cylon/scaling/ec2/weak/9100000/cylon_summary_test_ec2_weak_9100000_2node.txt', 'host': 'aws'},None,ip-172-31-92-255.ec2.internal,root,Linux,#1 SMP Tue Jun 27 21:49:00 UTC 2023 -# csv,join_1_aws_9100000_10,ok,3.888,3.888,2023-08-15 20:49:58,{'rows': 9100000, 'it': 10, 'unique': 0.9, 'scaling': 'w', 'operation': 'join', 'world_size': 2, 'redis_host': 'cylon-redis.mveu6e.0001.use1.cache.amazonaws.com', 'redis_port': 6379, 'output_scaling_filename': 'cylon_scaling_test_ec2_weak_9100000_2node', 'output_summary_filename': 'cylon_summary_test_ec2_weak_9100000_2node', 's3_bucket': 'staylor.dev2', 's3_stopwatch_object_name': 'cylon/scaling/ec2/weak/9100000/cylon_scaling_ec2_weak_9100000_2node.txt', 's3_summary_object_name': 'cylon/scaling/ec2/weak/9100000/cylon_summary_test_ec2_weak_9100000_2node.txt', 'host': 'aws'},None,ip-172-31-92-255.ec2.internal,root,Linux,#1 SMP Tue Jun 27 21:49:00 UTC 2023 -# csv,join_2_aws_9100000_10,ok,3.897,3.897,2023-08-15 20:50:02,{'rows': 9100000, 'it': 10, 'unique': 0.9, 'scaling': 'w', 'operation': 'join', 'world_size': 2, 'redis_host': 'cylon-redis.mveu6e.0001.use1.cache.amazonaws.com', 'redis_port': 6379, 'output_scaling_filename': 'cylon_scaling_test_ec2_weak_9100000_2node', 'output_summary_filename': 'cylon_summary_test_ec2_weak_9100000_2node', 's3_bucket': 'staylor.dev2', 's3_stopwatch_object_name': 'cylon/scaling/ec2/weak/9100000/cylon_scaling_ec2_weak_9100000_2node.txt', 's3_summary_object_name': 'cylon/scaling/ec2/weak/9100000/cylon_summary_test_ec2_weak_9100000_2node.txt', 'host': 'aws'},None,ip-172-31-92-255.ec2.internal,root,Linux,#1 SMP Tue Jun 27 21:49:00 UTC 2023 -# csv,join_3_aws_9100000_10,ok,3.902,3.902,2023-08-15 20:50:06,{'rows': 9100000, 'it': 10, 'unique': 0.9, 'scaling': 'w', 'operation': 'join', 'world_size': 2, 'redis_host': 'cylon-redis.mveu6e.0001.use1.cache.amazonaws.com', 'redis_port': 6379, 'output_scaling_filename': 'cylon_scaling_test_ec2_weak_9100000_2node', 'output_summary_filename': 'cylon_summary_test_ec2_weak_9100000_2node', 's3_bucket': 'staylor.dev2', 's3_stopwatch_object_name': 'cylon/scaling/ec2/weak/9100000/cylon_scaling_ec2_weak_9100000_2node.txt', 's3_summary_object_name': 'cylon/scaling/ec2/weak/9100000/cylon_summary_test_ec2_weak_9100000_2node.txt', 'host': 'aws'},None,ip-172-31-92-255.ec2.internal,root,Linux,#1 SMP Tue Jun 27 21:49:00 UTC 2023 -# csv,join_4_aws_9100000_10,ok,3.903,3.903,2023-08-15 20:50:10,{'rows': 9100000, 'it': 10, 'unique': 0.9, 'scaling': 'w', 'operation': 'join', 'world_size': 2, 'redis_host': 'cylon-redis.mveu6e.0001.use1.cache.amazonaws.com', 'redis_port': 6379, 'output_scaling_filename': 'cylon_scaling_test_ec2_weak_9100000_2node', 'output_summary_filename': 'cylon_summary_test_ec2_weak_9100000_2node', 's3_bucket': 'staylor.dev2', 's3_stopwatch_object_name': 'cylon/scaling/ec2/weak/9100000/cylon_scaling_ec2_weak_9100000_2node.txt', 's3_summary_object_name': 'cylon/scaling/ec2/weak/9100000/cylon_summary_test_ec2_weak_9100000_2node.txt', 'host': 'aws'},None,ip-172-31-92-255.ec2.internal,root,Linux,#1 SMP Tue Jun 27 21:49:00 UTC 2023 -# csv,join_5_aws_9100000_10,ok,3.903,3.903,2023-08-15 20:50:14,{'rows': 9100000, 'it': 10, 'unique': 0.9, 'scaling': 'w', 'operation': 'join', 'world_size': 2, 'redis_host': 'cylon-redis.mveu6e.0001.use1.cache.amazonaws.com', 'redis_port': 6379, 'output_scaling_filename': 'cylon_scaling_test_ec2_weak_9100000_2node', 'output_summary_filename': 'cylon_summary_test_ec2_weak_9100000_2node', 's3_bucket': 'staylor.dev2', 's3_stopwatch_object_name': 'cylon/scaling/ec2/weak/9100000/cylon_scaling_ec2_weak_9100000_2node.txt', 's3_summary_object_name': 'cylon/scaling/ec2/weak/9100000/cylon_summary_test_ec2_weak_9100000_2node.txt', 'host': 'aws'},None,ip-172-31-92-255.ec2.internal,root,Linux,#1 SMP Tue Jun 27 21:49:00 UTC 2023 -# csv,join_6_aws_9100000_10,ok,3.978,3.978,2023-08-15 20:50:18,{'rows': 9100000, 'it': 10, 'unique': 0.9, 'scaling': 'w', 'operation': 'join', 'world_size': 2, 'redis_host': 'cylon-redis.mveu6e.0001.use1.cache.amazonaws.com', 'redis_port': 6379, 'output_scaling_filename': 'cylon_scaling_test_ec2_weak_9100000_2node', 'output_summary_filename': 'cylon_summary_test_ec2_weak_9100000_2node', 's3_bucket': 'staylor.dev2', 's3_stopwatch_object_name': 'cylon/scaling/ec2/weak/9100000/cylon_scaling_ec2_weak_9100000_2node.txt', 's3_summary_object_name': 'cylon/scaling/ec2/weak/9100000/cylon_summary_test_ec2_weak_9100000_2node.txt', 'host': 'aws'},None,ip-172-31-92-255.ec2.internal,root,Linux,#1 SMP Tue Jun 27 21:49:00 UTC 2023 -# csv,join_7_aws_9100000_10,ok,3.917,3.917,2023-08-15 20:50:22,{'rows': 9100000, 'it': 10, 'unique': 0.9, 'scaling': 'w', 'operation': 'join', 'world_size': 2, 'redis_host': 'cylon-redis.mveu6e.0001.use1.cache.amazonaws.com', 'redis_port': 6379, 'output_scaling_filename': 'cylon_scaling_test_ec2_weak_9100000_2node', 'output_summary_filename': 'cylon_summary_test_ec2_weak_9100000_2node', 's3_bucket': 'staylor.dev2', 's3_stopwatch_object_name': 'cylon/scaling/ec2/weak/9100000/cylon_scaling_ec2_weak_9100000_2node.txt', 's3_summary_object_name': 'cylon/scaling/ec2/weak/9100000/cylon_summary_test_ec2_weak_9100000_2node.txt', 'host': 'aws'},None,ip-172-31-92-255.ec2.internal,root,Linux,#1 SMP Tue Jun 27 21:49:00 UTC 2023 -# csv,join_8_aws_9100000_10,ok,3.906,3.906,2023-08-15 20:50:26,{'rows': 9100000, 'it': 10, 'unique': 0.9, 'scaling': 'w', 'operation': 'join', 'world_size': 2, 'redis_host': 'cylon-redis.mveu6e.0001.use1.cache.amazonaws.com', 'redis_port': 6379, 'output_scaling_filename': 'cylon_scaling_test_ec2_weak_9100000_2node', 'output_summary_filename': 'cylon_summary_test_ec2_weak_9100000_2node', 's3_bucket': 'staylor.dev2', 's3_stopwatch_object_name': 'cylon/scaling/ec2/weak/9100000/cylon_scaling_ec2_weak_9100000_2node.txt', 's3_summary_object_name': 'cylon/scaling/ec2/weak/9100000/cylon_summary_test_ec2_weak_9100000_2node.txt', 'host': 'aws'},None,ip-172-31-92-255.ec2.internal,root,Linux,#1 SMP Tue Jun 27 21:49:00 UTC 2023 -# csv,join_9_aws_9100000_10,ok,3.902,3.902,2023-08-15 20:50:30,{'rows': 9100000, 'it': 10, 'unique': 0.9, 'scaling': 'w', 'operation': 'join', 'world_size': 2, 'redis_host': 'cylon-redis.mveu6e.0001.use1.cache.amazonaws.com', 'redis_port': 6379, 'output_scaling_filename': 'cylon_scaling_test_ec2_weak_9100000_2node', 'output_summary_filename': 'cylon_summary_test_ec2_weak_9100000_2node', 's3_bucket': 'staylor.dev2', 's3_stopwatch_object_name': 'cylon/scaling/ec2/weak/9100000/cylon_scaling_ec2_weak_9100000_2node.txt', 's3_summary_object_name': 'cylon/scaling/ec2/weak/9100000/cylon_summary_test_ec2_weak_9100000_2node.txt', 'host': 'aws'},None,ip-172-31-92-255.ec2.internal,root,Linux,#1 SMP Tue Jun 27 21:49:00 UTC 2023 diff --git a/aws/scripts/results-9100000/cylon_scaling_ec2_weak_9100000_4node.txt b/aws/scripts/results-9100000/cylon_scaling_ec2_weak_9100000_4node.txt deleted file mode 100644 index bbd7f2bef..000000000 --- a/aws/scripts/results-9100000/cylon_scaling_ec2_weak_9100000_4node.txt +++ /dev/null @@ -1,75 +0,0 @@ - -+---------------------+-------------------------------------------------------------------+ -| Attribute | Value | -|---------------------+-------------------------------------------------------------------| -| BUG_REPORT_URL | "https://bugs.launchpad.net/ubuntu/" | -| DISTRIB_CODENAME | jammy | -| DISTRIB_DESCRIPTION | "Ubuntu 22.04.2 LTS" | -| DISTRIB_ID | Ubuntu | -| DISTRIB_RELEASE | 22.04 | -| HOME_URL | "https://www.ubuntu.com/" | -| ID | ubuntu | -| ID_LIKE | debian | -| NAME | "Ubuntu" | -| PRETTY_NAME | "Ubuntu 22.04.2 LTS" | -| PRIVACY_POLICY_URL | "https://www.ubuntu.com/legal/terms-and-policies/privacy-policy" | -| SUPPORT_URL | "https://help.ubuntu.com/" | -| UBUNTU_CODENAME | jammy | -| VERSION | "22.04.2 LTS (Jammy Jellyfish)" | -| VERSION_CODENAME | jammy | -| VERSION_ID | "22.04" | -| cpu | Intel(R) Xeon(R) Platinum 8124M CPU @ 3.00GHz | -| cpu_cores | 8 | -| cpu_count | 16 | -| cpu_threads | 16 | -| date | 2023-08-15 20:56:08.292875 | -| frequency | scpufreq(current=3406.7418124999995, min=0.0, max=0.0) | -| mem.active | 1.4 GiB | -| mem.available | 28.5 GiB | -| mem.free | 23.7 GiB | -| mem.inactive | 4.7 GiB | -| mem.percent | 6.3 % | -| mem.total | 30.4 GiB | -| mem.used | 1.5 GiB | -| platform.version | #1 SMP Tue Jun 27 21:49:00 UTC 2023 | -| python | 3.9.17 | packaged by conda-forge | (main, Aug 10 2023, 07:02:31) | -| | [GCC 12.3.0] | -| python.pip | 23.2.1 | -| python.version | 3.9.17 | -| sys.platform | linux | -| uname.machine | x86_64 | -| uname.node | ip-172-31-80-213.ec2.internal | -| uname.processor | x86_64 | -| uname.release | 4.14.318-241.531.amzn2.x86_64 | -| uname.system | Linux | -| uname.version | #1 SMP Tue Jun 27 21:49:00 UTC 2023 | -| user | root | -+---------------------+-------------------------------------------------------------------+ - -+---------------------------+----------+--------+--------+---------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+-------+-------------------------------+--------+-------+-------------------------------------+ -| Name | Status | Time | Sum | Start | tag | msg | Node | User | OS | Version | -|---------------------------+----------+--------+--------+---------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+-------+-------------------------------+--------+-------+-------------------------------------| -| join_total_aws_9100000_10 | ok | 99.147 | 99.147 | 2023-08-15 20:54:28 | {'rows': 9100000, 'it': 10, 'unique': 0.9, 'scaling': 'w', 'operation': 'join', 'world_size': 4, 'redis_host': 'cylon-redis.mveu6e.0001.use1.cache.amazonaws.com', 'redis_port': 6379, 'output_scaling_filename': 'cylon_scaling_test_ec2_weak_9100000_4node', 'output_summary_filename': 'cylon_summary_test_ec2_weak_9100000_4node', 's3_bucket': 'staylor.dev2', 's3_stopwatch_object_name': 'cylon/scaling/ec2/weak/9100000/cylon_scaling_ec2_weak_9100000_4node.txt', 's3_summary_object_name': 'cylon/scaling/ec2/weak/9100000/cylon_summary_test_ec2_weak_9100000_4node.txt', 'host': 'aws'} | | ip-172-31-80-213.ec2.internal | root | Linux | #1 SMP Tue Jun 27 21:49:00 UTC 2023 | -| join_0_aws_9100000_10 | ok | 3.916 | 3.916 | 2023-08-15 20:55:29 | {'rows': 9100000, 'it': 10, 'unique': 0.9, 'scaling': 'w', 'operation': 'join', 'world_size': 4, 'redis_host': 'cylon-redis.mveu6e.0001.use1.cache.amazonaws.com', 'redis_port': 6379, 'output_scaling_filename': 'cylon_scaling_test_ec2_weak_9100000_4node', 'output_summary_filename': 'cylon_summary_test_ec2_weak_9100000_4node', 's3_bucket': 'staylor.dev2', 's3_stopwatch_object_name': 'cylon/scaling/ec2/weak/9100000/cylon_scaling_ec2_weak_9100000_4node.txt', 's3_summary_object_name': 'cylon/scaling/ec2/weak/9100000/cylon_summary_test_ec2_weak_9100000_4node.txt', 'host': 'aws'} | | ip-172-31-80-213.ec2.internal | root | Linux | #1 SMP Tue Jun 27 21:49:00 UTC 2023 | -| join_1_aws_9100000_10 | ok | 3.918 | 3.918 | 2023-08-15 20:55:33 | {'rows': 9100000, 'it': 10, 'unique': 0.9, 'scaling': 'w', 'operation': 'join', 'world_size': 4, 'redis_host': 'cylon-redis.mveu6e.0001.use1.cache.amazonaws.com', 'redis_port': 6379, 'output_scaling_filename': 'cylon_scaling_test_ec2_weak_9100000_4node', 'output_summary_filename': 'cylon_summary_test_ec2_weak_9100000_4node', 's3_bucket': 'staylor.dev2', 's3_stopwatch_object_name': 'cylon/scaling/ec2/weak/9100000/cylon_scaling_ec2_weak_9100000_4node.txt', 's3_summary_object_name': 'cylon/scaling/ec2/weak/9100000/cylon_summary_test_ec2_weak_9100000_4node.txt', 'host': 'aws'} | | ip-172-31-80-213.ec2.internal | root | Linux | #1 SMP Tue Jun 27 21:49:00 UTC 2023 | -| join_2_aws_9100000_10 | ok | 3.907 | 3.907 | 2023-08-15 20:55:36 | {'rows': 9100000, 'it': 10, 'unique': 0.9, 'scaling': 'w', 'operation': 'join', 'world_size': 4, 'redis_host': 'cylon-redis.mveu6e.0001.use1.cache.amazonaws.com', 'redis_port': 6379, 'output_scaling_filename': 'cylon_scaling_test_ec2_weak_9100000_4node', 'output_summary_filename': 'cylon_summary_test_ec2_weak_9100000_4node', 's3_bucket': 'staylor.dev2', 's3_stopwatch_object_name': 'cylon/scaling/ec2/weak/9100000/cylon_scaling_ec2_weak_9100000_4node.txt', 's3_summary_object_name': 'cylon/scaling/ec2/weak/9100000/cylon_summary_test_ec2_weak_9100000_4node.txt', 'host': 'aws'} | | ip-172-31-80-213.ec2.internal | root | Linux | #1 SMP Tue Jun 27 21:49:00 UTC 2023 | -| join_3_aws_9100000_10 | ok | 3.92 | 3.92 | 2023-08-15 20:55:40 | {'rows': 9100000, 'it': 10, 'unique': 0.9, 'scaling': 'w', 'operation': 'join', 'world_size': 4, 'redis_host': 'cylon-redis.mveu6e.0001.use1.cache.amazonaws.com', 'redis_port': 6379, 'output_scaling_filename': 'cylon_scaling_test_ec2_weak_9100000_4node', 'output_summary_filename': 'cylon_summary_test_ec2_weak_9100000_4node', 's3_bucket': 'staylor.dev2', 's3_stopwatch_object_name': 'cylon/scaling/ec2/weak/9100000/cylon_scaling_ec2_weak_9100000_4node.txt', 's3_summary_object_name': 'cylon/scaling/ec2/weak/9100000/cylon_summary_test_ec2_weak_9100000_4node.txt', 'host': 'aws'} | | ip-172-31-80-213.ec2.internal | root | Linux | #1 SMP Tue Jun 27 21:49:00 UTC 2023 | -| join_4_aws_9100000_10 | ok | 3.905 | 3.905 | 2023-08-15 20:55:44 | {'rows': 9100000, 'it': 10, 'unique': 0.9, 'scaling': 'w', 'operation': 'join', 'world_size': 4, 'redis_host': 'cylon-redis.mveu6e.0001.use1.cache.amazonaws.com', 'redis_port': 6379, 'output_scaling_filename': 'cylon_scaling_test_ec2_weak_9100000_4node', 'output_summary_filename': 'cylon_summary_test_ec2_weak_9100000_4node', 's3_bucket': 'staylor.dev2', 's3_stopwatch_object_name': 'cylon/scaling/ec2/weak/9100000/cylon_scaling_ec2_weak_9100000_4node.txt', 's3_summary_object_name': 'cylon/scaling/ec2/weak/9100000/cylon_summary_test_ec2_weak_9100000_4node.txt', 'host': 'aws'} | | ip-172-31-80-213.ec2.internal | root | Linux | #1 SMP Tue Jun 27 21:49:00 UTC 2023 | -| join_5_aws_9100000_10 | ok | 3.867 | 3.867 | 2023-08-15 20:55:48 | {'rows': 9100000, 'it': 10, 'unique': 0.9, 'scaling': 'w', 'operation': 'join', 'world_size': 4, 'redis_host': 'cylon-redis.mveu6e.0001.use1.cache.amazonaws.com', 'redis_port': 6379, 'output_scaling_filename': 'cylon_scaling_test_ec2_weak_9100000_4node', 'output_summary_filename': 'cylon_summary_test_ec2_weak_9100000_4node', 's3_bucket': 'staylor.dev2', 's3_stopwatch_object_name': 'cylon/scaling/ec2/weak/9100000/cylon_scaling_ec2_weak_9100000_4node.txt', 's3_summary_object_name': 'cylon/scaling/ec2/weak/9100000/cylon_summary_test_ec2_weak_9100000_4node.txt', 'host': 'aws'} | | ip-172-31-80-213.ec2.internal | root | Linux | #1 SMP Tue Jun 27 21:49:00 UTC 2023 | -| join_6_aws_9100000_10 | ok | 3.847 | 3.847 | 2023-08-15 20:55:52 | {'rows': 9100000, 'it': 10, 'unique': 0.9, 'scaling': 'w', 'operation': 'join', 'world_size': 4, 'redis_host': 'cylon-redis.mveu6e.0001.use1.cache.amazonaws.com', 'redis_port': 6379, 'output_scaling_filename': 'cylon_scaling_test_ec2_weak_9100000_4node', 'output_summary_filename': 'cylon_summary_test_ec2_weak_9100000_4node', 's3_bucket': 'staylor.dev2', 's3_stopwatch_object_name': 'cylon/scaling/ec2/weak/9100000/cylon_scaling_ec2_weak_9100000_4node.txt', 's3_summary_object_name': 'cylon/scaling/ec2/weak/9100000/cylon_summary_test_ec2_weak_9100000_4node.txt', 'host': 'aws'} | | ip-172-31-80-213.ec2.internal | root | Linux | #1 SMP Tue Jun 27 21:49:00 UTC 2023 | -| join_7_aws_9100000_10 | ok | 3.845 | 3.845 | 2023-08-15 20:55:56 | {'rows': 9100000, 'it': 10, 'unique': 0.9, 'scaling': 'w', 'operation': 'join', 'world_size': 4, 'redis_host': 'cylon-redis.mveu6e.0001.use1.cache.amazonaws.com', 'redis_port': 6379, 'output_scaling_filename': 'cylon_scaling_test_ec2_weak_9100000_4node', 'output_summary_filename': 'cylon_summary_test_ec2_weak_9100000_4node', 's3_bucket': 'staylor.dev2', 's3_stopwatch_object_name': 'cylon/scaling/ec2/weak/9100000/cylon_scaling_ec2_weak_9100000_4node.txt', 's3_summary_object_name': 'cylon/scaling/ec2/weak/9100000/cylon_summary_test_ec2_weak_9100000_4node.txt', 'host': 'aws'} | | ip-172-31-80-213.ec2.internal | root | Linux | #1 SMP Tue Jun 27 21:49:00 UTC 2023 | -| join_8_aws_9100000_10 | ok | 3.865 | 3.865 | 2023-08-15 20:56:00 | {'rows': 9100000, 'it': 10, 'unique': 0.9, 'scaling': 'w', 'operation': 'join', 'world_size': 4, 'redis_host': 'cylon-redis.mveu6e.0001.use1.cache.amazonaws.com', 'redis_port': 6379, 'output_scaling_filename': 'cylon_scaling_test_ec2_weak_9100000_4node', 'output_summary_filename': 'cylon_summary_test_ec2_weak_9100000_4node', 's3_bucket': 'staylor.dev2', 's3_stopwatch_object_name': 'cylon/scaling/ec2/weak/9100000/cylon_scaling_ec2_weak_9100000_4node.txt', 's3_summary_object_name': 'cylon/scaling/ec2/weak/9100000/cylon_summary_test_ec2_weak_9100000_4node.txt', 'host': 'aws'} | | ip-172-31-80-213.ec2.internal | root | Linux | #1 SMP Tue Jun 27 21:49:00 UTC 2023 | -| join_9_aws_9100000_10 | ok | 3.883 | 3.883 | 2023-08-15 20:56:04 | {'rows': 9100000, 'it': 10, 'unique': 0.9, 'scaling': 'w', 'operation': 'join', 'world_size': 4, 'redis_host': 'cylon-redis.mveu6e.0001.use1.cache.amazonaws.com', 'redis_port': 6379, 'output_scaling_filename': 'cylon_scaling_test_ec2_weak_9100000_4node', 'output_summary_filename': 'cylon_summary_test_ec2_weak_9100000_4node', 's3_bucket': 'staylor.dev2', 's3_stopwatch_object_name': 'cylon/scaling/ec2/weak/9100000/cylon_scaling_ec2_weak_9100000_4node.txt', 's3_summary_object_name': 'cylon/scaling/ec2/weak/9100000/cylon_summary_test_ec2_weak_9100000_4node.txt', 'host': 'aws'} | | ip-172-31-80-213.ec2.internal | root | Linux | #1 SMP Tue Jun 27 21:49:00 UTC 2023 | -+---------------------------+----------+--------+--------+---------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+-------+-------------------------------+--------+-------+-------------------------------------+ -# csv,timer,status,time,sum,start,tag,msg,uname.node,user,uname.system,platform.version -# csv,join_total_aws_9100000_10,ok,99.147,99.147,2023-08-15 20:54:28,{'rows': 9100000, 'it': 10, 'unique': 0.9, 'scaling': 'w', 'operation': 'join', 'world_size': 4, 'redis_host': 'cylon-redis.mveu6e.0001.use1.cache.amazonaws.com', 'redis_port': 6379, 'output_scaling_filename': 'cylon_scaling_test_ec2_weak_9100000_4node', 'output_summary_filename': 'cylon_summary_test_ec2_weak_9100000_4node', 's3_bucket': 'staylor.dev2', 's3_stopwatch_object_name': 'cylon/scaling/ec2/weak/9100000/cylon_scaling_ec2_weak_9100000_4node.txt', 's3_summary_object_name': 'cylon/scaling/ec2/weak/9100000/cylon_summary_test_ec2_weak_9100000_4node.txt', 'host': 'aws'},None,ip-172-31-80-213.ec2.internal,root,Linux,#1 SMP Tue Jun 27 21:49:00 UTC 2023 -# csv,join_0_aws_9100000_10,ok,3.916,3.916,2023-08-15 20:55:29,{'rows': 9100000, 'it': 10, 'unique': 0.9, 'scaling': 'w', 'operation': 'join', 'world_size': 4, 'redis_host': 'cylon-redis.mveu6e.0001.use1.cache.amazonaws.com', 'redis_port': 6379, 'output_scaling_filename': 'cylon_scaling_test_ec2_weak_9100000_4node', 'output_summary_filename': 'cylon_summary_test_ec2_weak_9100000_4node', 's3_bucket': 'staylor.dev2', 's3_stopwatch_object_name': 'cylon/scaling/ec2/weak/9100000/cylon_scaling_ec2_weak_9100000_4node.txt', 's3_summary_object_name': 'cylon/scaling/ec2/weak/9100000/cylon_summary_test_ec2_weak_9100000_4node.txt', 'host': 'aws'},None,ip-172-31-80-213.ec2.internal,root,Linux,#1 SMP Tue Jun 27 21:49:00 UTC 2023 -# csv,join_1_aws_9100000_10,ok,3.918,3.918,2023-08-15 20:55:33,{'rows': 9100000, 'it': 10, 'unique': 0.9, 'scaling': 'w', 'operation': 'join', 'world_size': 4, 'redis_host': 'cylon-redis.mveu6e.0001.use1.cache.amazonaws.com', 'redis_port': 6379, 'output_scaling_filename': 'cylon_scaling_test_ec2_weak_9100000_4node', 'output_summary_filename': 'cylon_summary_test_ec2_weak_9100000_4node', 's3_bucket': 'staylor.dev2', 's3_stopwatch_object_name': 'cylon/scaling/ec2/weak/9100000/cylon_scaling_ec2_weak_9100000_4node.txt', 's3_summary_object_name': 'cylon/scaling/ec2/weak/9100000/cylon_summary_test_ec2_weak_9100000_4node.txt', 'host': 'aws'},None,ip-172-31-80-213.ec2.internal,root,Linux,#1 SMP Tue Jun 27 21:49:00 UTC 2023 -# csv,join_2_aws_9100000_10,ok,3.907,3.907,2023-08-15 20:55:36,{'rows': 9100000, 'it': 10, 'unique': 0.9, 'scaling': 'w', 'operation': 'join', 'world_size': 4, 'redis_host': 'cylon-redis.mveu6e.0001.use1.cache.amazonaws.com', 'redis_port': 6379, 'output_scaling_filename': 'cylon_scaling_test_ec2_weak_9100000_4node', 'output_summary_filename': 'cylon_summary_test_ec2_weak_9100000_4node', 's3_bucket': 'staylor.dev2', 's3_stopwatch_object_name': 'cylon/scaling/ec2/weak/9100000/cylon_scaling_ec2_weak_9100000_4node.txt', 's3_summary_object_name': 'cylon/scaling/ec2/weak/9100000/cylon_summary_test_ec2_weak_9100000_4node.txt', 'host': 'aws'},None,ip-172-31-80-213.ec2.internal,root,Linux,#1 SMP Tue Jun 27 21:49:00 UTC 2023 -# csv,join_3_aws_9100000_10,ok,3.92,3.92,2023-08-15 20:55:40,{'rows': 9100000, 'it': 10, 'unique': 0.9, 'scaling': 'w', 'operation': 'join', 'world_size': 4, 'redis_host': 'cylon-redis.mveu6e.0001.use1.cache.amazonaws.com', 'redis_port': 6379, 'output_scaling_filename': 'cylon_scaling_test_ec2_weak_9100000_4node', 'output_summary_filename': 'cylon_summary_test_ec2_weak_9100000_4node', 's3_bucket': 'staylor.dev2', 's3_stopwatch_object_name': 'cylon/scaling/ec2/weak/9100000/cylon_scaling_ec2_weak_9100000_4node.txt', 's3_summary_object_name': 'cylon/scaling/ec2/weak/9100000/cylon_summary_test_ec2_weak_9100000_4node.txt', 'host': 'aws'},None,ip-172-31-80-213.ec2.internal,root,Linux,#1 SMP Tue Jun 27 21:49:00 UTC 2023 -# csv,join_4_aws_9100000_10,ok,3.905,3.905,2023-08-15 20:55:44,{'rows': 9100000, 'it': 10, 'unique': 0.9, 'scaling': 'w', 'operation': 'join', 'world_size': 4, 'redis_host': 'cylon-redis.mveu6e.0001.use1.cache.amazonaws.com', 'redis_port': 6379, 'output_scaling_filename': 'cylon_scaling_test_ec2_weak_9100000_4node', 'output_summary_filename': 'cylon_summary_test_ec2_weak_9100000_4node', 's3_bucket': 'staylor.dev2', 's3_stopwatch_object_name': 'cylon/scaling/ec2/weak/9100000/cylon_scaling_ec2_weak_9100000_4node.txt', 's3_summary_object_name': 'cylon/scaling/ec2/weak/9100000/cylon_summary_test_ec2_weak_9100000_4node.txt', 'host': 'aws'},None,ip-172-31-80-213.ec2.internal,root,Linux,#1 SMP Tue Jun 27 21:49:00 UTC 2023 -# csv,join_5_aws_9100000_10,ok,3.867,3.867,2023-08-15 20:55:48,{'rows': 9100000, 'it': 10, 'unique': 0.9, 'scaling': 'w', 'operation': 'join', 'world_size': 4, 'redis_host': 'cylon-redis.mveu6e.0001.use1.cache.amazonaws.com', 'redis_port': 6379, 'output_scaling_filename': 'cylon_scaling_test_ec2_weak_9100000_4node', 'output_summary_filename': 'cylon_summary_test_ec2_weak_9100000_4node', 's3_bucket': 'staylor.dev2', 's3_stopwatch_object_name': 'cylon/scaling/ec2/weak/9100000/cylon_scaling_ec2_weak_9100000_4node.txt', 's3_summary_object_name': 'cylon/scaling/ec2/weak/9100000/cylon_summary_test_ec2_weak_9100000_4node.txt', 'host': 'aws'},None,ip-172-31-80-213.ec2.internal,root,Linux,#1 SMP Tue Jun 27 21:49:00 UTC 2023 -# csv,join_6_aws_9100000_10,ok,3.847,3.847,2023-08-15 20:55:52,{'rows': 9100000, 'it': 10, 'unique': 0.9, 'scaling': 'w', 'operation': 'join', 'world_size': 4, 'redis_host': 'cylon-redis.mveu6e.0001.use1.cache.amazonaws.com', 'redis_port': 6379, 'output_scaling_filename': 'cylon_scaling_test_ec2_weak_9100000_4node', 'output_summary_filename': 'cylon_summary_test_ec2_weak_9100000_4node', 's3_bucket': 'staylor.dev2', 's3_stopwatch_object_name': 'cylon/scaling/ec2/weak/9100000/cylon_scaling_ec2_weak_9100000_4node.txt', 's3_summary_object_name': 'cylon/scaling/ec2/weak/9100000/cylon_summary_test_ec2_weak_9100000_4node.txt', 'host': 'aws'},None,ip-172-31-80-213.ec2.internal,root,Linux,#1 SMP Tue Jun 27 21:49:00 UTC 2023 -# csv,join_7_aws_9100000_10,ok,3.845,3.845,2023-08-15 20:55:56,{'rows': 9100000, 'it': 10, 'unique': 0.9, 'scaling': 'w', 'operation': 'join', 'world_size': 4, 'redis_host': 'cylon-redis.mveu6e.0001.use1.cache.amazonaws.com', 'redis_port': 6379, 'output_scaling_filename': 'cylon_scaling_test_ec2_weak_9100000_4node', 'output_summary_filename': 'cylon_summary_test_ec2_weak_9100000_4node', 's3_bucket': 'staylor.dev2', 's3_stopwatch_object_name': 'cylon/scaling/ec2/weak/9100000/cylon_scaling_ec2_weak_9100000_4node.txt', 's3_summary_object_name': 'cylon/scaling/ec2/weak/9100000/cylon_summary_test_ec2_weak_9100000_4node.txt', 'host': 'aws'},None,ip-172-31-80-213.ec2.internal,root,Linux,#1 SMP Tue Jun 27 21:49:00 UTC 2023 -# csv,join_8_aws_9100000_10,ok,3.865,3.865,2023-08-15 20:56:00,{'rows': 9100000, 'it': 10, 'unique': 0.9, 'scaling': 'w', 'operation': 'join', 'world_size': 4, 'redis_host': 'cylon-redis.mveu6e.0001.use1.cache.amazonaws.com', 'redis_port': 6379, 'output_scaling_filename': 'cylon_scaling_test_ec2_weak_9100000_4node', 'output_summary_filename': 'cylon_summary_test_ec2_weak_9100000_4node', 's3_bucket': 'staylor.dev2', 's3_stopwatch_object_name': 'cylon/scaling/ec2/weak/9100000/cylon_scaling_ec2_weak_9100000_4node.txt', 's3_summary_object_name': 'cylon/scaling/ec2/weak/9100000/cylon_summary_test_ec2_weak_9100000_4node.txt', 'host': 'aws'},None,ip-172-31-80-213.ec2.internal,root,Linux,#1 SMP Tue Jun 27 21:49:00 UTC 2023 -# csv,join_9_aws_9100000_10,ok,3.883,3.883,2023-08-15 20:56:04,{'rows': 9100000, 'it': 10, 'unique': 0.9, 'scaling': 'w', 'operation': 'join', 'world_size': 4, 'redis_host': 'cylon-redis.mveu6e.0001.use1.cache.amazonaws.com', 'redis_port': 6379, 'output_scaling_filename': 'cylon_scaling_test_ec2_weak_9100000_4node', 'output_summary_filename': 'cylon_summary_test_ec2_weak_9100000_4node', 's3_bucket': 'staylor.dev2', 's3_stopwatch_object_name': 'cylon/scaling/ec2/weak/9100000/cylon_scaling_ec2_weak_9100000_4node.txt', 's3_summary_object_name': 'cylon/scaling/ec2/weak/9100000/cylon_summary_test_ec2_weak_9100000_4node.txt', 'host': 'aws'},None,ip-172-31-80-213.ec2.internal,root,Linux,#1 SMP Tue Jun 27 21:49:00 UTC 2023 diff --git a/aws/scripts/results-9100000/cylon_scaling_ec2_weak_9100000_8node.txt b/aws/scripts/results-9100000/cylon_scaling_ec2_weak_9100000_8node.txt deleted file mode 100644 index c1120355f..000000000 --- a/aws/scripts/results-9100000/cylon_scaling_ec2_weak_9100000_8node.txt +++ /dev/null @@ -1,75 +0,0 @@ - -+---------------------+-------------------------------------------------------------------+ -| Attribute | Value | -|---------------------+-------------------------------------------------------------------| -| BUG_REPORT_URL | "https://bugs.launchpad.net/ubuntu/" | -| DISTRIB_CODENAME | jammy | -| DISTRIB_DESCRIPTION | "Ubuntu 22.04.2 LTS" | -| DISTRIB_ID | Ubuntu | -| DISTRIB_RELEASE | 22.04 | -| HOME_URL | "https://www.ubuntu.com/" | -| ID | ubuntu | -| ID_LIKE | debian | -| NAME | "Ubuntu" | -| PRETTY_NAME | "Ubuntu 22.04.2 LTS" | -| PRIVACY_POLICY_URL | "https://www.ubuntu.com/legal/terms-and-policies/privacy-policy" | -| SUPPORT_URL | "https://help.ubuntu.com/" | -| UBUNTU_CODENAME | jammy | -| VERSION | "22.04.2 LTS (Jammy Jellyfish)" | -| VERSION_CODENAME | jammy | -| VERSION_ID | "22.04" | -| cpu | Intel(R) Xeon(R) Platinum 8124M CPU @ 3.00GHz | -| cpu_cores | 8 | -| cpu_count | 16 | -| cpu_threads | 16 | -| date | 2023-08-15 20:59:59.876528 | -| frequency | scpufreq(current=3407.778312499999, min=0.0, max=0.0) | -| mem.active | 1.4 GiB | -| mem.available | 28.5 GiB | -| mem.free | 23.6 GiB | -| mem.inactive | 4.6 GiB | -| mem.percent | 6.3 % | -| mem.total | 30.4 GiB | -| mem.used | 1.5 GiB | -| platform.version | #1 SMP Tue Jun 27 21:49:00 UTC 2023 | -| python | 3.9.17 | packaged by conda-forge | (main, Aug 10 2023, 07:02:31) | -| | [GCC 12.3.0] | -| python.pip | 23.2.1 | -| python.version | 3.9.17 | -| sys.platform | linux | -| uname.machine | x86_64 | -| uname.node | ip-172-31-80-213.ec2.internal | -| uname.processor | x86_64 | -| uname.release | 4.14.318-241.531.amzn2.x86_64 | -| uname.system | Linux | -| uname.version | #1 SMP Tue Jun 27 21:49:00 UTC 2023 | -| user | root | -+---------------------+-------------------------------------------------------------------+ - -+---------------------------+----------+---------+---------+---------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+-------+-------------------------------+--------+-------+-------------------------------------+ -| Name | Status | Time | Sum | Start | tag | msg | Node | User | OS | Version | -|---------------------------+----------+---------+---------+---------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+-------+-------------------------------+--------+-------+-------------------------------------| -| join_total_aws_9100000_10 | ok | 107.328 | 107.328 | 2023-08-15 20:58:12 | {'rows': 9100000, 'it': 10, 'unique': 0.9, 'scaling': 'w', 'operation': 'join', 'world_size': 8, 'redis_host': 'cylon-redis.mveu6e.0001.use1.cache.amazonaws.com', 'redis_port': 6379, 'output_scaling_filename': 'cylon_scaling_test_ec2_weak_9100000_8node', 'output_summary_filename': 'cylon_summary_test_ec2_weak_9100000_8node', 's3_bucket': 'staylor.dev2', 's3_stopwatch_object_name': 'cylon/scaling/ec2/weak/9100000/cylon_scaling_ec2_weak_9100000_8node.txt', 's3_summary_object_name': 'cylon/scaling/ec2/weak/9100000/cylon_summary_test_ec2_weak_9100000_8node.txt', 'host': 'aws'} | | ip-172-31-80-213.ec2.internal | root | Linux | #1 SMP Tue Jun 27 21:49:00 UTC 2023 | -| join_0_aws_9100000_10 | ok | 3.878 | 3.878 | 2023-08-15 20:59:20 | {'rows': 9100000, 'it': 10, 'unique': 0.9, 'scaling': 'w', 'operation': 'join', 'world_size': 8, 'redis_host': 'cylon-redis.mveu6e.0001.use1.cache.amazonaws.com', 'redis_port': 6379, 'output_scaling_filename': 'cylon_scaling_test_ec2_weak_9100000_8node', 'output_summary_filename': 'cylon_summary_test_ec2_weak_9100000_8node', 's3_bucket': 'staylor.dev2', 's3_stopwatch_object_name': 'cylon/scaling/ec2/weak/9100000/cylon_scaling_ec2_weak_9100000_8node.txt', 's3_summary_object_name': 'cylon/scaling/ec2/weak/9100000/cylon_summary_test_ec2_weak_9100000_8node.txt', 'host': 'aws'} | | ip-172-31-80-213.ec2.internal | root | Linux | #1 SMP Tue Jun 27 21:49:00 UTC 2023 | -| join_1_aws_9100000_10 | ok | 3.874 | 3.874 | 2023-08-15 20:59:24 | {'rows': 9100000, 'it': 10, 'unique': 0.9, 'scaling': 'w', 'operation': 'join', 'world_size': 8, 'redis_host': 'cylon-redis.mveu6e.0001.use1.cache.amazonaws.com', 'redis_port': 6379, 'output_scaling_filename': 'cylon_scaling_test_ec2_weak_9100000_8node', 'output_summary_filename': 'cylon_summary_test_ec2_weak_9100000_8node', 's3_bucket': 'staylor.dev2', 's3_stopwatch_object_name': 'cylon/scaling/ec2/weak/9100000/cylon_scaling_ec2_weak_9100000_8node.txt', 's3_summary_object_name': 'cylon/scaling/ec2/weak/9100000/cylon_summary_test_ec2_weak_9100000_8node.txt', 'host': 'aws'} | | ip-172-31-80-213.ec2.internal | root | Linux | #1 SMP Tue Jun 27 21:49:00 UTC 2023 | -| join_2_aws_9100000_10 | ok | 3.862 | 3.862 | 2023-08-15 20:59:28 | {'rows': 9100000, 'it': 10, 'unique': 0.9, 'scaling': 'w', 'operation': 'join', 'world_size': 8, 'redis_host': 'cylon-redis.mveu6e.0001.use1.cache.amazonaws.com', 'redis_port': 6379, 'output_scaling_filename': 'cylon_scaling_test_ec2_weak_9100000_8node', 'output_summary_filename': 'cylon_summary_test_ec2_weak_9100000_8node', 's3_bucket': 'staylor.dev2', 's3_stopwatch_object_name': 'cylon/scaling/ec2/weak/9100000/cylon_scaling_ec2_weak_9100000_8node.txt', 's3_summary_object_name': 'cylon/scaling/ec2/weak/9100000/cylon_summary_test_ec2_weak_9100000_8node.txt', 'host': 'aws'} | | ip-172-31-80-213.ec2.internal | root | Linux | #1 SMP Tue Jun 27 21:49:00 UTC 2023 | -| join_3_aws_9100000_10 | ok | 3.898 | 3.898 | 2023-08-15 20:59:32 | {'rows': 9100000, 'it': 10, 'unique': 0.9, 'scaling': 'w', 'operation': 'join', 'world_size': 8, 'redis_host': 'cylon-redis.mveu6e.0001.use1.cache.amazonaws.com', 'redis_port': 6379, 'output_scaling_filename': 'cylon_scaling_test_ec2_weak_9100000_8node', 'output_summary_filename': 'cylon_summary_test_ec2_weak_9100000_8node', 's3_bucket': 'staylor.dev2', 's3_stopwatch_object_name': 'cylon/scaling/ec2/weak/9100000/cylon_scaling_ec2_weak_9100000_8node.txt', 's3_summary_object_name': 'cylon/scaling/ec2/weak/9100000/cylon_summary_test_ec2_weak_9100000_8node.txt', 'host': 'aws'} | | ip-172-31-80-213.ec2.internal | root | Linux | #1 SMP Tue Jun 27 21:49:00 UTC 2023 | -| join_4_aws_9100000_10 | ok | 3.884 | 3.884 | 2023-08-15 20:59:36 | {'rows': 9100000, 'it': 10, 'unique': 0.9, 'scaling': 'w', 'operation': 'join', 'world_size': 8, 'redis_host': 'cylon-redis.mveu6e.0001.use1.cache.amazonaws.com', 'redis_port': 6379, 'output_scaling_filename': 'cylon_scaling_test_ec2_weak_9100000_8node', 'output_summary_filename': 'cylon_summary_test_ec2_weak_9100000_8node', 's3_bucket': 'staylor.dev2', 's3_stopwatch_object_name': 'cylon/scaling/ec2/weak/9100000/cylon_scaling_ec2_weak_9100000_8node.txt', 's3_summary_object_name': 'cylon/scaling/ec2/weak/9100000/cylon_summary_test_ec2_weak_9100000_8node.txt', 'host': 'aws'} | | ip-172-31-80-213.ec2.internal | root | Linux | #1 SMP Tue Jun 27 21:49:00 UTC 2023 | -| join_5_aws_9100000_10 | ok | 3.884 | 3.884 | 2023-08-15 20:59:40 | {'rows': 9100000, 'it': 10, 'unique': 0.9, 'scaling': 'w', 'operation': 'join', 'world_size': 8, 'redis_host': 'cylon-redis.mveu6e.0001.use1.cache.amazonaws.com', 'redis_port': 6379, 'output_scaling_filename': 'cylon_scaling_test_ec2_weak_9100000_8node', 'output_summary_filename': 'cylon_summary_test_ec2_weak_9100000_8node', 's3_bucket': 'staylor.dev2', 's3_stopwatch_object_name': 'cylon/scaling/ec2/weak/9100000/cylon_scaling_ec2_weak_9100000_8node.txt', 's3_summary_object_name': 'cylon/scaling/ec2/weak/9100000/cylon_summary_test_ec2_weak_9100000_8node.txt', 'host': 'aws'} | | ip-172-31-80-213.ec2.internal | root | Linux | #1 SMP Tue Jun 27 21:49:00 UTC 2023 | -| join_6_aws_9100000_10 | ok | 3.978 | 3.978 | 2023-08-15 20:59:44 | {'rows': 9100000, 'it': 10, 'unique': 0.9, 'scaling': 'w', 'operation': 'join', 'world_size': 8, 'redis_host': 'cylon-redis.mveu6e.0001.use1.cache.amazonaws.com', 'redis_port': 6379, 'output_scaling_filename': 'cylon_scaling_test_ec2_weak_9100000_8node', 'output_summary_filename': 'cylon_summary_test_ec2_weak_9100000_8node', 's3_bucket': 'staylor.dev2', 's3_stopwatch_object_name': 'cylon/scaling/ec2/weak/9100000/cylon_scaling_ec2_weak_9100000_8node.txt', 's3_summary_object_name': 'cylon/scaling/ec2/weak/9100000/cylon_summary_test_ec2_weak_9100000_8node.txt', 'host': 'aws'} | | ip-172-31-80-213.ec2.internal | root | Linux | #1 SMP Tue Jun 27 21:49:00 UTC 2023 | -| join_7_aws_9100000_10 | ok | 3.876 | 3.876 | 2023-08-15 20:59:48 | {'rows': 9100000, 'it': 10, 'unique': 0.9, 'scaling': 'w', 'operation': 'join', 'world_size': 8, 'redis_host': 'cylon-redis.mveu6e.0001.use1.cache.amazonaws.com', 'redis_port': 6379, 'output_scaling_filename': 'cylon_scaling_test_ec2_weak_9100000_8node', 'output_summary_filename': 'cylon_summary_test_ec2_weak_9100000_8node', 's3_bucket': 'staylor.dev2', 's3_stopwatch_object_name': 'cylon/scaling/ec2/weak/9100000/cylon_scaling_ec2_weak_9100000_8node.txt', 's3_summary_object_name': 'cylon/scaling/ec2/weak/9100000/cylon_summary_test_ec2_weak_9100000_8node.txt', 'host': 'aws'} | | ip-172-31-80-213.ec2.internal | root | Linux | #1 SMP Tue Jun 27 21:49:00 UTC 2023 | -| join_8_aws_9100000_10 | ok | 3.858 | 3.858 | 2023-08-15 20:59:52 | {'rows': 9100000, 'it': 10, 'unique': 0.9, 'scaling': 'w', 'operation': 'join', 'world_size': 8, 'redis_host': 'cylon-redis.mveu6e.0001.use1.cache.amazonaws.com', 'redis_port': 6379, 'output_scaling_filename': 'cylon_scaling_test_ec2_weak_9100000_8node', 'output_summary_filename': 'cylon_summary_test_ec2_weak_9100000_8node', 's3_bucket': 'staylor.dev2', 's3_stopwatch_object_name': 'cylon/scaling/ec2/weak/9100000/cylon_scaling_ec2_weak_9100000_8node.txt', 's3_summary_object_name': 'cylon/scaling/ec2/weak/9100000/cylon_summary_test_ec2_weak_9100000_8node.txt', 'host': 'aws'} | | ip-172-31-80-213.ec2.internal | root | Linux | #1 SMP Tue Jun 27 21:49:00 UTC 2023 | -| join_9_aws_9100000_10 | ok | 3.878 | 3.878 | 2023-08-15 20:59:55 | {'rows': 9100000, 'it': 10, 'unique': 0.9, 'scaling': 'w', 'operation': 'join', 'world_size': 8, 'redis_host': 'cylon-redis.mveu6e.0001.use1.cache.amazonaws.com', 'redis_port': 6379, 'output_scaling_filename': 'cylon_scaling_test_ec2_weak_9100000_8node', 'output_summary_filename': 'cylon_summary_test_ec2_weak_9100000_8node', 's3_bucket': 'staylor.dev2', 's3_stopwatch_object_name': 'cylon/scaling/ec2/weak/9100000/cylon_scaling_ec2_weak_9100000_8node.txt', 's3_summary_object_name': 'cylon/scaling/ec2/weak/9100000/cylon_summary_test_ec2_weak_9100000_8node.txt', 'host': 'aws'} | | ip-172-31-80-213.ec2.internal | root | Linux | #1 SMP Tue Jun 27 21:49:00 UTC 2023 | -+---------------------------+----------+---------+---------+---------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+-------+-------------------------------+--------+-------+-------------------------------------+ -# csv,timer,status,time,sum,start,tag,msg,uname.node,user,uname.system,platform.version -# csv,join_total_aws_9100000_10,ok,107.328,107.328,2023-08-15 20:58:12,{'rows': 9100000, 'it': 10, 'unique': 0.9, 'scaling': 'w', 'operation': 'join', 'world_size': 8, 'redis_host': 'cylon-redis.mveu6e.0001.use1.cache.amazonaws.com', 'redis_port': 6379, 'output_scaling_filename': 'cylon_scaling_test_ec2_weak_9100000_8node', 'output_summary_filename': 'cylon_summary_test_ec2_weak_9100000_8node', 's3_bucket': 'staylor.dev2', 's3_stopwatch_object_name': 'cylon/scaling/ec2/weak/9100000/cylon_scaling_ec2_weak_9100000_8node.txt', 's3_summary_object_name': 'cylon/scaling/ec2/weak/9100000/cylon_summary_test_ec2_weak_9100000_8node.txt', 'host': 'aws'},None,ip-172-31-80-213.ec2.internal,root,Linux,#1 SMP Tue Jun 27 21:49:00 UTC 2023 -# csv,join_0_aws_9100000_10,ok,3.878,3.878,2023-08-15 20:59:20,{'rows': 9100000, 'it': 10, 'unique': 0.9, 'scaling': 'w', 'operation': 'join', 'world_size': 8, 'redis_host': 'cylon-redis.mveu6e.0001.use1.cache.amazonaws.com', 'redis_port': 6379, 'output_scaling_filename': 'cylon_scaling_test_ec2_weak_9100000_8node', 'output_summary_filename': 'cylon_summary_test_ec2_weak_9100000_8node', 's3_bucket': 'staylor.dev2', 's3_stopwatch_object_name': 'cylon/scaling/ec2/weak/9100000/cylon_scaling_ec2_weak_9100000_8node.txt', 's3_summary_object_name': 'cylon/scaling/ec2/weak/9100000/cylon_summary_test_ec2_weak_9100000_8node.txt', 'host': 'aws'},None,ip-172-31-80-213.ec2.internal,root,Linux,#1 SMP Tue Jun 27 21:49:00 UTC 2023 -# csv,join_1_aws_9100000_10,ok,3.874,3.874,2023-08-15 20:59:24,{'rows': 9100000, 'it': 10, 'unique': 0.9, 'scaling': 'w', 'operation': 'join', 'world_size': 8, 'redis_host': 'cylon-redis.mveu6e.0001.use1.cache.amazonaws.com', 'redis_port': 6379, 'output_scaling_filename': 'cylon_scaling_test_ec2_weak_9100000_8node', 'output_summary_filename': 'cylon_summary_test_ec2_weak_9100000_8node', 's3_bucket': 'staylor.dev2', 's3_stopwatch_object_name': 'cylon/scaling/ec2/weak/9100000/cylon_scaling_ec2_weak_9100000_8node.txt', 's3_summary_object_name': 'cylon/scaling/ec2/weak/9100000/cylon_summary_test_ec2_weak_9100000_8node.txt', 'host': 'aws'},None,ip-172-31-80-213.ec2.internal,root,Linux,#1 SMP Tue Jun 27 21:49:00 UTC 2023 -# csv,join_2_aws_9100000_10,ok,3.862,3.862,2023-08-15 20:59:28,{'rows': 9100000, 'it': 10, 'unique': 0.9, 'scaling': 'w', 'operation': 'join', 'world_size': 8, 'redis_host': 'cylon-redis.mveu6e.0001.use1.cache.amazonaws.com', 'redis_port': 6379, 'output_scaling_filename': 'cylon_scaling_test_ec2_weak_9100000_8node', 'output_summary_filename': 'cylon_summary_test_ec2_weak_9100000_8node', 's3_bucket': 'staylor.dev2', 's3_stopwatch_object_name': 'cylon/scaling/ec2/weak/9100000/cylon_scaling_ec2_weak_9100000_8node.txt', 's3_summary_object_name': 'cylon/scaling/ec2/weak/9100000/cylon_summary_test_ec2_weak_9100000_8node.txt', 'host': 'aws'},None,ip-172-31-80-213.ec2.internal,root,Linux,#1 SMP Tue Jun 27 21:49:00 UTC 2023 -# csv,join_3_aws_9100000_10,ok,3.898,3.898,2023-08-15 20:59:32,{'rows': 9100000, 'it': 10, 'unique': 0.9, 'scaling': 'w', 'operation': 'join', 'world_size': 8, 'redis_host': 'cylon-redis.mveu6e.0001.use1.cache.amazonaws.com', 'redis_port': 6379, 'output_scaling_filename': 'cylon_scaling_test_ec2_weak_9100000_8node', 'output_summary_filename': 'cylon_summary_test_ec2_weak_9100000_8node', 's3_bucket': 'staylor.dev2', 's3_stopwatch_object_name': 'cylon/scaling/ec2/weak/9100000/cylon_scaling_ec2_weak_9100000_8node.txt', 's3_summary_object_name': 'cylon/scaling/ec2/weak/9100000/cylon_summary_test_ec2_weak_9100000_8node.txt', 'host': 'aws'},None,ip-172-31-80-213.ec2.internal,root,Linux,#1 SMP Tue Jun 27 21:49:00 UTC 2023 -# csv,join_4_aws_9100000_10,ok,3.884,3.884,2023-08-15 20:59:36,{'rows': 9100000, 'it': 10, 'unique': 0.9, 'scaling': 'w', 'operation': 'join', 'world_size': 8, 'redis_host': 'cylon-redis.mveu6e.0001.use1.cache.amazonaws.com', 'redis_port': 6379, 'output_scaling_filename': 'cylon_scaling_test_ec2_weak_9100000_8node', 'output_summary_filename': 'cylon_summary_test_ec2_weak_9100000_8node', 's3_bucket': 'staylor.dev2', 's3_stopwatch_object_name': 'cylon/scaling/ec2/weak/9100000/cylon_scaling_ec2_weak_9100000_8node.txt', 's3_summary_object_name': 'cylon/scaling/ec2/weak/9100000/cylon_summary_test_ec2_weak_9100000_8node.txt', 'host': 'aws'},None,ip-172-31-80-213.ec2.internal,root,Linux,#1 SMP Tue Jun 27 21:49:00 UTC 2023 -# csv,join_5_aws_9100000_10,ok,3.884,3.884,2023-08-15 20:59:40,{'rows': 9100000, 'it': 10, 'unique': 0.9, 'scaling': 'w', 'operation': 'join', 'world_size': 8, 'redis_host': 'cylon-redis.mveu6e.0001.use1.cache.amazonaws.com', 'redis_port': 6379, 'output_scaling_filename': 'cylon_scaling_test_ec2_weak_9100000_8node', 'output_summary_filename': 'cylon_summary_test_ec2_weak_9100000_8node', 's3_bucket': 'staylor.dev2', 's3_stopwatch_object_name': 'cylon/scaling/ec2/weak/9100000/cylon_scaling_ec2_weak_9100000_8node.txt', 's3_summary_object_name': 'cylon/scaling/ec2/weak/9100000/cylon_summary_test_ec2_weak_9100000_8node.txt', 'host': 'aws'},None,ip-172-31-80-213.ec2.internal,root,Linux,#1 SMP Tue Jun 27 21:49:00 UTC 2023 -# csv,join_6_aws_9100000_10,ok,3.978,3.978,2023-08-15 20:59:44,{'rows': 9100000, 'it': 10, 'unique': 0.9, 'scaling': 'w', 'operation': 'join', 'world_size': 8, 'redis_host': 'cylon-redis.mveu6e.0001.use1.cache.amazonaws.com', 'redis_port': 6379, 'output_scaling_filename': 'cylon_scaling_test_ec2_weak_9100000_8node', 'output_summary_filename': 'cylon_summary_test_ec2_weak_9100000_8node', 's3_bucket': 'staylor.dev2', 's3_stopwatch_object_name': 'cylon/scaling/ec2/weak/9100000/cylon_scaling_ec2_weak_9100000_8node.txt', 's3_summary_object_name': 'cylon/scaling/ec2/weak/9100000/cylon_summary_test_ec2_weak_9100000_8node.txt', 'host': 'aws'},None,ip-172-31-80-213.ec2.internal,root,Linux,#1 SMP Tue Jun 27 21:49:00 UTC 2023 -# csv,join_7_aws_9100000_10,ok,3.876,3.876,2023-08-15 20:59:48,{'rows': 9100000, 'it': 10, 'unique': 0.9, 'scaling': 'w', 'operation': 'join', 'world_size': 8, 'redis_host': 'cylon-redis.mveu6e.0001.use1.cache.amazonaws.com', 'redis_port': 6379, 'output_scaling_filename': 'cylon_scaling_test_ec2_weak_9100000_8node', 'output_summary_filename': 'cylon_summary_test_ec2_weak_9100000_8node', 's3_bucket': 'staylor.dev2', 's3_stopwatch_object_name': 'cylon/scaling/ec2/weak/9100000/cylon_scaling_ec2_weak_9100000_8node.txt', 's3_summary_object_name': 'cylon/scaling/ec2/weak/9100000/cylon_summary_test_ec2_weak_9100000_8node.txt', 'host': 'aws'},None,ip-172-31-80-213.ec2.internal,root,Linux,#1 SMP Tue Jun 27 21:49:00 UTC 2023 -# csv,join_8_aws_9100000_10,ok,3.858,3.858,2023-08-15 20:59:52,{'rows': 9100000, 'it': 10, 'unique': 0.9, 'scaling': 'w', 'operation': 'join', 'world_size': 8, 'redis_host': 'cylon-redis.mveu6e.0001.use1.cache.amazonaws.com', 'redis_port': 6379, 'output_scaling_filename': 'cylon_scaling_test_ec2_weak_9100000_8node', 'output_summary_filename': 'cylon_summary_test_ec2_weak_9100000_8node', 's3_bucket': 'staylor.dev2', 's3_stopwatch_object_name': 'cylon/scaling/ec2/weak/9100000/cylon_scaling_ec2_weak_9100000_8node.txt', 's3_summary_object_name': 'cylon/scaling/ec2/weak/9100000/cylon_summary_test_ec2_weak_9100000_8node.txt', 'host': 'aws'},None,ip-172-31-80-213.ec2.internal,root,Linux,#1 SMP Tue Jun 27 21:49:00 UTC 2023 -# csv,join_9_aws_9100000_10,ok,3.878,3.878,2023-08-15 20:59:55,{'rows': 9100000, 'it': 10, 'unique': 0.9, 'scaling': 'w', 'operation': 'join', 'world_size': 8, 'redis_host': 'cylon-redis.mveu6e.0001.use1.cache.amazonaws.com', 'redis_port': 6379, 'output_scaling_filename': 'cylon_scaling_test_ec2_weak_9100000_8node', 'output_summary_filename': 'cylon_summary_test_ec2_weak_9100000_8node', 's3_bucket': 'staylor.dev2', 's3_stopwatch_object_name': 'cylon/scaling/ec2/weak/9100000/cylon_scaling_ec2_weak_9100000_8node.txt', 's3_summary_object_name': 'cylon/scaling/ec2/weak/9100000/cylon_summary_test_ec2_weak_9100000_8node.txt', 'host': 'aws'},None,ip-172-31-80-213.ec2.internal,root,Linux,#1 SMP Tue Jun 27 21:49:00 UTC 2023 diff --git a/aws/scripts/results-9100000/cylon_summary_test_ec2_9100000_16node.txt b/aws/scripts/results-9100000/cylon_summary_test_ec2_9100000_16node.txt deleted file mode 100644 index 55c4ae2bd..000000000 --- a/aws/scripts/results-9100000/cylon_summary_test_ec2_9100000_16node.txt +++ /dev/null @@ -1,10 +0,0 @@ -### w 16 9100000 145600000 0 3955.1253616809845 161774191 -### w 16 9100000 145600000 1 3952.8827369213104 161774191 -### w 16 9100000 145600000 2 3963.8237208127975 161774191 -### w 16 9100000 145600000 3 4081.855833530426 161774191 -### w 16 9100000 145600000 4 4089.3873125314713 161774191 -### w 16 9100000 145600000 5 3968.8504487276077 161774191 -### w 16 9100000 145600000 6 3987.659439444542 161774191 -### w 16 9100000 145600000 7 4291.653141379356 161774191 -### w 16 9100000 145600000 8 4025.2812802791595 161774191 -### w 16 9100000 145600000 9 3927.98613011837 161774191 diff --git a/aws/scripts/results-9100000/cylon_summary_test_ec2_weak_9100000_1node.txt b/aws/scripts/results-9100000/cylon_summary_test_ec2_weak_9100000_1node.txt deleted file mode 100644 index baaf6cf47..000000000 --- a/aws/scripts/results-9100000/cylon_summary_test_ec2_weak_9100000_1node.txt +++ /dev/null @@ -1,10 +0,0 @@ -### w 1 9100000 9100000 0 3209.0532779693604 10111764 -### w 1 9100000 9100000 1 3219.9573516845703 10111764 -### w 1 9100000 9100000 2 3220.4110622406006 10111764 -### w 1 9100000 9100000 3 3222.269296646118 10111764 -### w 1 9100000 9100000 4 3215.7342433929443 10111764 -### w 1 9100000 9100000 5 3219.4266319274902 10111764 -### w 1 9100000 9100000 6 3224.6077060699463 10111764 -### w 1 9100000 9100000 7 3244.480609893799 10111764 -### w 1 9100000 9100000 8 3217.606782913208 10111764 -### w 1 9100000 9100000 9 3223.5209941864014 10111764 diff --git a/aws/scripts/results-9100000/cylon_summary_test_ec2_weak_9100000_2node.txt b/aws/scripts/results-9100000/cylon_summary_test_ec2_weak_9100000_2node.txt deleted file mode 100644 index 476f70d4c..000000000 --- a/aws/scripts/results-9100000/cylon_summary_test_ec2_weak_9100000_2node.txt +++ /dev/null @@ -1,10 +0,0 @@ -### w 2 9100000 18200000 0 3885.681986808777 20222454 -### w 2 9100000 18200000 1 3887.1185779571533 20222454 -### w 2 9100000 18200000 2 3895.438075065613 20222454 -### w 2 9100000 18200000 3 3900.550603866577 20222454 -### w 2 9100000 18200000 4 3901.926279067993 20222454 -### w 2 9100000 18200000 5 3901.6456604003906 20222454 -### w 2 9100000 18200000 6 3976.7285585403442 20222454 -### w 2 9100000 18200000 7 3916.15629196167 20222454 -### w 2 9100000 18200000 8 3904.7634601593018 20222454 -### w 2 9100000 18200000 9 3901.23450756073 20222454 diff --git a/aws/scripts/results-9100000/cylon_summary_test_ec2_weak_9100000_4node.txt b/aws/scripts/results-9100000/cylon_summary_test_ec2_weak_9100000_4node.txt deleted file mode 100644 index 1b8301f1b..000000000 --- a/aws/scripts/results-9100000/cylon_summary_test_ec2_weak_9100000_4node.txt +++ /dev/null @@ -1,10 +0,0 @@ -### w 4 9100000 36400000 0 3914.8510694503784 40437898 -### w 4 9100000 36400000 1 3916.4035320281982 40437898 -### w 4 9100000 36400000 2 3906.2851667404175 40437898 -### w 4 9100000 36400000 3 3919.1325306892395 40437898 -### w 4 9100000 36400000 4 3903.8299918174744 40437898 -### w 4 9100000 36400000 5 3865.3509616851807 40437898 -### w 4 9100000 36400000 6 3845.4021215438843 40437898 -### w 4 9100000 36400000 7 3843.4287309646606 40437898 -### w 4 9100000 36400000 8 3863.954722881317 40437898 -### w 4 9100000 36400000 9 3882.117211818695 40437898 diff --git a/aws/scripts/results-9100000/cylon_summary_test_ec2_weak_9100000_8node.txt b/aws/scripts/results-9100000/cylon_summary_test_ec2_weak_9100000_8node.txt deleted file mode 100644 index 197c45745..000000000 --- a/aws/scripts/results-9100000/cylon_summary_test_ec2_weak_9100000_8node.txt +++ /dev/null @@ -1,10 +0,0 @@ -### w 8 9100000 72800000 0 3875.7028579711914 80888085 -### w 8 9100000 72800000 1 3871.913105249405 80888085 -### w 8 9100000 72800000 2 3860.0634932518005 80888085 -### w 8 9100000 72800000 3 3897.0689177513123 80888085 -### w 8 9100000 72800000 4 3882.505089044571 80888085 -### w 8 9100000 72800000 5 3882.448524236679 80888085 -### w 8 9100000 72800000 6 3976.4296114444733 80888085 -### w 8 9100000 72800000 7 3874.1161227226257 80888085 -### w 8 9100000 72800000 8 3856.1716079711914 80888085 -### w 8 9100000 72800000 9 3875.669479370117 80888085 diff --git a/build.py b/build.py index 0e32ecea6..163cc0fed 100644 --- a/build.py +++ b/build.py @@ -220,7 +220,6 @@ def build_cpp(): cmake_command = f"cmake -DPYCYLON_BUILD={on_off(BUILD_PYTHON)} {win_cmake_args} " \ f"-DCMAKE_BUILD_TYPE={CPP_BUILD_MODE} " \ f"-DCYLON_WITH_TEST={on_off(RUN_CPP_TESTS)} " \ - f"-DARROW_BUILD_TYPE=SYSTEM " \ f"{CPPLINT_COMMAND} " \ f"-DCMAKE_INSTALL_PREFIX={INSTALL_DIR} " \ f"{verb} {CMAKE_FLAGS} {CPP_SOURCE_DIR}" diff --git a/build.sh b/build.sh index c9f6b0a21..a77e51ee8 100755 --- a/build.sh +++ b/build.sh @@ -50,6 +50,25 @@ while [[ $# -gt 0 ]]; do shift # past argument shift # past value ;; + -ucxpath | --ucx_build_path) + UCX_INSTALL_PREFIX="$2" + UCX_LOCAL_INSTALL="ON" + CYLON_UCX="ON" + shift # past argument + shift # past value + ;; + -uccpath | --ucc_build_path) + UCC_PREFIX="$2" + CYLON_UCC="ON" + shift # past argument + shift # past value + ;; + -redispath | --redis_build_path) + REDIS_PREFIX="$2" + CYLON_REDIS="ON" + shift # past argument + shift # past value + ;; -ipath | --install_path) INSTALL_PATH="$2" shift # past argument @@ -414,7 +433,7 @@ build_python() { pushd python/pycylon || exit 1 pip3 uninstall -y pycylon make clean - CYLON_PREFIX=${CYLON_PREFIX} ARROW_PREFIX=${BUILD_PATH}/arrow/install python3 setup.py install || exit 1 + CYLON_PREFIX=${CYLON_PREFIX} ARROW_PREFIX=${BUILD_PATH}/arrow/install CYLON_UCX=${CYLON_UCX} CYLON_UCC=${CYLON_UCC} CYLON_REDIS=${CYLON_REDIS} UCX_LOCAL_INSTALL=${UCX_LOCAL_INSTALL} UCC_PREFIX=${UCC_PREFIX} REDIS_PREFIX=${REDIS_PREFIX} UCX_INSTALL_PREFIX=${UCX_INSTALL_PREFIX} python3 setup.py install || exit 1 popd || exit 1 print_line } diff --git a/cpp/CMakeLists.txt b/cpp/CMakeLists.txt index 0415a9a60..e7581731d 100755 --- a/cpp/CMakeLists.txt +++ b/cpp/CMakeLists.txt @@ -89,7 +89,12 @@ if ("$ENV{CONDA_BUILD}" STREQUAL "1") set(CMAKE_SYSTEM_PREFIX_PATH "$ENV{BUILD_PREFIX};$ENV{PREFIX};${CMAKE_SYSTEM_PREFIX_PATH}") set(CONDA_INCLUDE_DIRS "$ENV{BUILD_PREFIX}/include" "$ENV{PREFIX}/include") set(CONDA_LINK_DIRS "$ENV{BUILD_PREFIX}/lib" "$ENV{PREFIX}/lib") - set(ARROW_BUILD_TYPE "SYSTEM") + + if (NOT ARROW_BUILD_TYPE) + set(ARROW_BUILD_TYPE "SYSTEM") + endif() + + set(CMAKE_INSTALL_INCLUDEDIR "$ENV{BUILD_PREFIX}/include") message(STATUS "Conda build detected, CMAKE_SYSTEM_PREFIX_PATH set to: ${CMAKE_SYSTEM_PREFIX_PATH}") @@ -106,7 +111,9 @@ elseif (DEFINED ENV{CONDA_PREFIX}) set(CMAKE_SYSTEM_PREFIX_PATH "$ENV{CONDA_PREFIX};${CMAKE_SYSTEM_PREFIX_PATH}") set(CONDA_INCLUDE_DIRS "$ENV{CONDA_PREFIX}/include") set(CONDA_LINK_DIRS "$ENV{CONDA_PREFIX}/lib" "$ENV{CONDA_PREFIX}/Library/lib") - set(ARROW_BUILD_TYPE "SYSTEM") + if (NOT ARROW_BUILD_TYPE) + set(ARROW_BUILD_TYPE "SYSTEM") + endif() message(STATUS "Conda environment detected, CMAKE_SYSTEM_PREFIX_PATH set to: ${CMAKE_SYSTEM_PREFIX_PATH}") message(STATUS "CONDA_INCLUDE_DIRS set to: ${CONDA_INCLUDE_DIRS}") @@ -271,9 +278,8 @@ if (CYLON_UCX) set(UCX_LIBRARIES ${UCX_UCT} ${UCX_UCS} ${UCX_UCM} ${UCX_UCP}) endif () - - else () - message("Using locally installed UCX") + elseif (NOT UCX_INSTALL_PREFIX) + message("Using locally installed UCX without install prefix") # Check if UCX include and lib paths are given if (NOT UCX_INCLUDEDIR) @@ -290,12 +296,29 @@ if (CYLON_UCX) include_directories(SYSTEM ${UCX_INCLUDEDIR}) # Set library directory for later use set(UCX_LIBRARIES - ${UCX_LIBDIR}/ucx/libuct_cma.so - ${UCX_LIBDIR}/ucx/libuct_ib.so ${UCX_LIBDIR}/libuct.so ${UCX_LIBDIR}/libucs.so ${UCX_LIBDIR}/libucm.so ${UCX_LIBDIR}/libucp.so) + else () + message("Using locally installed UCX") + + if (NOT UCX_INSTALL_PREFIX) + message(FATAL_ERROR "CYLON_UCX is set, UCX_INSTALL_PREFIX should also be set") + endif () + + # Set UCX found as true + set(UCX_FOUND TRUE) + + + message("setting UCX include and lib directories from install prefix") + include_directories(SYSTEM ${UCX_INSTALL_PREFIX}/include) + set(UCX_LIBRARIES + ${UCX_INSTALL_PREFIX}/lib/libuct.so + ${UCX_INSTALL_PREFIX}/lib/libucs.so + ${UCX_INSTALL_PREFIX}/lib/libucm.so + ${UCX_INSTALL_PREFIX}/lib/libucp.so) + endif (CONDA_LINK_DIRS) message(STATUS "UCX libs: ${UCX_LIBRARIES}") @@ -322,7 +345,7 @@ if (CYLON_UCX) find_library(HIREDIS_LIB hiredis HINTS ${REDIS_INSTALL_PREFIX}/lib) - find_library(REDIS_PLUS_PLUS_LIB redis++ HINTS ${REDIS_INSTALL_PREFIX}/lib) + find_library(REDIS_PLUS_PLUS_LIB redis++ HINTS ${REDIS_INSTALL_PREFIX}/lib64) set(REDIS_LIBRARIES ${HIREDIS_LIB} ${REDIS_PLUS_PLUS_LIB}) diff --git a/docker/aws/Dockerfile b/docker/aws/Dockerfile index e95a35899..1dc52d989 100644 --- a/docker/aws/Dockerfile +++ b/docker/aws/Dockerfile @@ -63,13 +63,13 @@ RUN cd $UCX_HOME && \ ./autogen.sh && \ ./configure --prefix=$UCX_HOME/install && \ make install + #UCC install RUN git clone --single-branch -b master https://github.com/openucx/ucc.git $UCC_HOME RUN cd $UCC_HOME && \ ./autogen.sh && \ ./configure --prefix=$UCC_HOME/install --with-ucx=$UCX_HOME/install && \ - make install #REDIS install diff --git a/python/pycylon/setup.py b/python/pycylon/setup.py index 5de60abd7..3c1fb3c79 100644 --- a/python/pycylon/setup.py +++ b/python/pycylon/setup.py @@ -195,6 +195,8 @@ macros.append(('BUILD_CYLON_REDIS', '1')) compile_time_env['CYTHON_REDIS'] = True library_dirs.append(os.path.join(REDIS_PREFIX, 'lib')) + library_dirs.append(os.path.join(REDIS_PREFIX, 'lib64')) + include_dirs.append(os.path.join(REDIS_PREFIX, 'include')) include_dirs.append(os.path.join(REDIS_PREFIX, 'include', 'sw')) include_dirs.append(os.path.join(REDIS_PREFIX, 'include', 'hiredis')) else: diff --git a/target/rivanna/installUCCUCX.sh b/target/rivanna/installUCCUCX.sh new file mode 100644 index 000000000..38580ad64 --- /dev/null +++ b/target/rivanna/installUCCUCX.sh @@ -0,0 +1,35 @@ +#! /bin/sh + + +PWD=`pwd` +BUILD_PATH=$PWD/build + +module load gcc/11.2.0 openmpi/3.1.6 python/3.8.8 cmake/3.23.3 + +python -m venv $PWD/CYLON-ENV + +source $PWD/CYLON-ENV/bin/activate + +# pip install -r $PWD/requirements.txt +pip install pip -U +pip install pytest +pip install -U pytest-mpi +pip install numpy +pip install cloudmesh-openstack + +# pip install pyarrow==9.0.0 + +export CC=`which gcc` +export CXX=`which g++` +CC=gcc MPICC=mpicc pip install --no-binary mpi4py install mpi4py +UCC_INSTALL=/scratch/qad5gv/ucc/install +UCX_INSTALL=/scratch/qad5gv/ucx/install +REDIS_INSTALL=/scratch/qad5gv/redis_install +pip install urllib3==1.26.6 + + +rm -rf build + +export LD_LIBRARY_PATH=$BUILD_PATH/install/lib:$UCX_INSTALL/lib:$UCC_INSTALL/lib:$REDIS_INSTALL/lib:$REDIS_INSTALL/lib64:$LD_LIBRARY_PATH + +time ./build.sh -j$(nproc) -pyenv $PWD/CYLON-ENV -bpath $PWD/build -ucxpath $UCX_INSTALL -uccpath $UCC_INSTALL -redispath $REDIS_INSTALL --cpp --python --cython --pytest --cmake-flags "-DMPI_C_COMPILER=$(which mpicc) -DMPI_CXX_COMPILER=$(which mpicxx) -DCYLON_UCX=1 -DUCX_INSTALL_PREFIX=$UCX_INSTALL -DCYLON_UCC=1 -DUCC_INSTALL_PREFIX=$UCC_INSTALL -DCYLON_USE_REDIS=1 -DREDIS_INSTALL_PREFIX=$REDIS_INSTALL" diff --git a/target/rivanna/scripts/ucc-ucx-redis/cylon-experiment-setup.py b/target/rivanna/scripts/ucc-ucx-redis/cylon-experiment-setup.py new file mode 100644 index 000000000..83152aae5 --- /dev/null +++ b/target/rivanna/scripts/ucc-ucx-redis/cylon-experiment-setup.py @@ -0,0 +1,142 @@ +import os +import sys +import argparse +from textwrap import dedent +from cloudmesh.common.util import writefile +from cloudmesh.common.util import readfile +from cloudmesh.common.util import banner +from cloudmesh.common.console import Console +import argparse + +counter = 0 + + +debug = False + +partition="bii-gpu" + +partition="parallel" + +parser = argparse.ArgumentParser(description="cylon rivanna scaling test") +parser.add_argument('-n', dest='rows', type=int, required=True) + +parser.add_argument('-s', dest='scaling', type=str, default='w', choices=['s', 'w'], + help="s=strong w=weak") + + +parser.add_argument('-w', dest='world_size', type=int, help="world size", required=True) + + +parser.add_argument("-p1", dest='redis_port', type=int, help="name of redis port", + default=6379) # 6379 + +args = vars(parser.parse_args()) + + +# (nodes, threads, cpus, rows, partition, "exclusive") +combination = [\ + # (1,4, 5000, "parallel", "exclusive"), # always pending + ("dev-cylon-redis1.aws-cylondata.com", 2,4, 1, args['rows'], "standard", ""), + #("54.227.18.138", 4,8, 16, args['rows'], "parallel", ""), + #("44.213.71.107", 4,8, 16, args['rows'], "parallel", ""), + #("52.90.116.44", 4,8, 16, args['rows'], "parallel", ""), + #(2,37, 1000000, "parallel", ""), + #(4,37, 35000000, "parallel", ""), + #(6,37, 35000000, "parallel", ""), + #(8,37, 35000000, "parallel", ""), + #(10,37, 35000000, "parallel", ""), + #(12,37, 35000000, "parallel", ""), + #(14,37, 35000000, "parallel", ""), +] + +''' +combination = [] +for nodes in range(0,50): + for threads in range(0,37): + combination.append((nodes+1, threads+1, "parallel", "")) +''' + +total = len(combination) +jobid="-%j" +# jobid="" + +f = open("../../../../rivanna/scripts/submit.log", "w") +for redis, nodes, threads, cpus, rows, partition, exclusive in combination: + counter = counter + 1 + + if exclusive == "exclusive": + exclusive = "#SBATCH --exclusive" + e = "e1" + else: + exclusive = "" + e = "e0" + + usable_threads = nodes * threads + + ''' + cores_per_node = nodes * threads - 2 + + print (cores_per_node) + + config = readfile("raptor.in.cfg") + + config = config.replace("CORES_PER_NODE", str(cores_per_node)) + config = config.replace("NO_OF_ROWS", str(rows)) + + + print (config) + + cfg_filename = f"raptor-{nodes}-{threads}.cfg" + + writefile(cfg_filename, config) + ''' + banner(f"SLURM {nodes} {threads} {counter}/{total}") + script=dedent(f""" + #!/bin/bash + #SBATCH --job-name=h-n={nodes:02d}-t={threads:02d}-e={e} + #SBATCH --nodes={nodes} + #SBATCH --ntasks={threads} + #SBATCH --cpus-per-task={cpus} + #SBATCH --time=15:00 + #SBATCH --output=out-{nodes:02d}-{threads:02d}{jobid}.log + #SBATCH --error=out-{nodes:02d}-{threads:02d}{jobid}.err + #SBATCH --partition=parallel + #SBATCH -A bii_dsc_community + {exclusive} + echo "..............................................................." + module load gcc/9.2.0 openmpi/3.1.6 python/3.7.7 cmake/3.23.3 + echo "..............................................................." + source /scratch/qad5gv/cylon/CYLON-ENV/bin/activate + echo "..............................................................." + BUILD_PATH=/scratch/qad5gv/cylon/build + UCC_INSTALL=/scratch/qad5gv/ucc/install + UCX_INSTALL=/scratch/qad5gv/ucx/install + REDIS_INSTALL=/scratch/qad5gv/redis_install + echo "..............................................................." + export LD_LIBRARY_PATH=$BUILD_PATH/install/lib:$UCX_INSTALL/lib:$UCC_INSTALL/lib:$REDIS_INSTALL/lib:$REDIS_INSTALL/lib64:$LD_LIBRARY_PATH + echo "..............................................................." + which python gcc g++ + echo "..............................................................." + lscpu + echo "..............................................................." + time srun --exact --nodes {nodes} python cylon_scaling.py -n {rows} -s {args["scaling"]} -w {args["world_size"]} -r {redis} -p1 {args["redis_port"]} + echo "..............................................................." + """).strip() + + print (script) + filename = f"script-{nodes:02d}-{threads:02d}.slurm" + writefile(filename, script) + + + if not debug: + + r = os.system(f"sbatch {filename}") + total = nodes * threads + if r == 0: + msg = f"{counter} submitted: nodes={nodes:02d} threads={threads:02d} total={total}" + Console.ok(msg) + else: + msg = f"{counter} failed: nodes={nodes:02d} threads={threads:02d} total={total}" + Console.error(msg) + f.writelines([msg, "\n"]) +f.close() diff --git a/target/rivanna/scripts/ucc-ucx-redis/cylon-experiment-setup2.py b/target/rivanna/scripts/ucc-ucx-redis/cylon-experiment-setup2.py new file mode 100644 index 000000000..7be190aa6 --- /dev/null +++ b/target/rivanna/scripts/ucc-ucx-redis/cylon-experiment-setup2.py @@ -0,0 +1,143 @@ +import os +import sys +import argparse +from textwrap import dedent +from cloudmesh.common.util import writefile +from cloudmesh.common.util import readfile +from cloudmesh.common.util import banner +from cloudmesh.common.console import Console +import argparse + +counter = 0 + + +debug = False + +partition="bii-gpu" + +partition="parallel" + +parser = argparse.ArgumentParser(description="cylon rivanna scaling test") +parser.add_argument('-n', dest='rows', type=int, required=True) + +parser.add_argument('-s', dest='scaling', type=str, default='w', choices=['s', 'w'], + help="s=strong w=weak") + + +parser.add_argument('-w', dest='world_size', type=int, help="world size", required=True) + + +parser.add_argument("-p1", dest='redis_port', type=int, help="name of redis port", + default=6379) # 6379 + +args = vars(parser.parse_args()) + + +# (nodes, threads, cpus, rows, partition, "exclusive") +combination = [\ + # (1,4, 5000, "parallel", "exclusive"), # always pending + ("dev-cylon-redis4.aws-cylondata.com", 1,1, 1, args['rows'], "standard", ""), + #("54.227.18.138", 4,8, 16, args['rows'], "parallel", ""), + #("44.213.71.107", 4,8, 16, args['rows'], "parallel", ""), + #("52.90.116.44", 4,8, 16, args['rows'], "parallel", ""), + #(2,37, 1000000, "parallel", ""), + #(4,37, 35000000, "parallel", ""), + #(6,37, 35000000, "parallel", ""), + #(8,37, 35000000, "parallel", ""), + #(10,37, 35000000, "parallel", ""), + #(12,37, 35000000, "parallel", ""), + #(14,37, 35000000, "parallel", ""), +] + +''' +combination = [] +for nodes in range(0,50): + for threads in range(0,37): + combination.append((nodes+1, threads+1, "parallel", "")) +''' + +total = len(combination) +jobid="-%j" +# jobid="" + +f = open("../../../../rivanna/scripts/submit.log", "w") +for redis, nodes, threads, cpus, rows, partition, exclusive in combination: + counter = counter + 1 + + if exclusive == "exclusive": + exclusive = "#SBATCH --exclusive" + e = "e1" + else: + exclusive = "" + e = "e0" + + usable_threads = nodes * threads + + ''' + cores_per_node = nodes * threads - 2 + + print (cores_per_node) + + config = readfile("raptor.in.cfg") + + config = config.replace("CORES_PER_NODE", str(cores_per_node)) + config = config.replace("NO_OF_ROWS", str(rows)) + + + print (config) + + cfg_filename = f"raptor-{nodes}-{threads}.cfg" + + writefile(cfg_filename, config) + ''' + banner(f"SLURM {nodes} {threads} {counter}/{total}") + script=dedent(f""" + #!/bin/bash + #SBATCH --job-name=h-n={nodes:02d}-t={threads:02d}-e={e} + #SBATCH --nodes={nodes} + #SBATCH --ntasks={threads} + #SBATCH --ntasks-per-core={nodes} + #SBATCH --cpus-per-task={cpus} + #SBATCH --time=15:00 + #SBATCH --output=out-{nodes:02d}-{threads:02d}{jobid}.log + #SBATCH --error=out-{nodes:02d}-{threads:02d}{jobid}.err + #SBATCH --partition={partition} + #SBATCH -A bii_dsc_community + {exclusive} + echo "..............................................................." + module load gcc/9.2.0 openmpi/3.1.6 python/3.7.7 cmake/3.23.3 + echo "..............................................................." + source /scratch/qad5gv/cylon/CYLON-ENV/bin/activate + echo "..............................................................." + BUILD_PATH=/scratch/qad5gv/cylon/build + UCC_INSTALL=/scratch/qad5gv/ucc/install + UCX_INSTALL=/scratch/qad5gv/ucx/install + REDIS_INSTALL=/scratch/qad5gv/redis_install + echo "..............................................................." + export LD_LIBRARY_PATH=$BUILD_PATH/install/lib:$UCX_INSTALL/lib:$UCC_INSTALL/lib:$REDIS_INSTALL/lib:$REDIS_INSTALL/lib64:$LD_LIBRARY_PATH + echo "..............................................................." + which python gcc g++ + echo "..............................................................." + lscpu + echo "..............................................................." + time python cylon_scaling.py -n {rows} -s {args["scaling"]} -w {args["world_size"]} -r {redis} -p1 {args["redis_port"]} + echo "..............................................................." + """).strip() + + print (script) + filename = f"script-{nodes:02d}-{threads:02d}.slurm" + writefile(filename, script) + + + if not debug: + + r = os.system(f"sbatch {filename}") + total = nodes * threads + if r == 0: + msg = f"{counter} submitted: nodes={nodes:02d} threads={threads:02d} total={total}" + Console.ok(msg) + else: + msg = f"{counter} failed: nodes={nodes:02d} threads={threads:02d} total={total}" + Console.error(msg) + f.writelines([msg, "\n"]) +f.close() diff --git a/target/rivanna/scripts/ucc-ucx-redis/cylon_scaling.py b/target/rivanna/scripts/ucc-ucx-redis/cylon_scaling.py new file mode 100644 index 000000000..012433db4 --- /dev/null +++ b/target/rivanna/scripts/ucc-ucx-redis/cylon_scaling.py @@ -0,0 +1,108 @@ +import time +import argparse + +import pandas as pd +from mpi4py import MPI +from numpy.random import default_rng +from pycylon.frame import CylonEnv, DataFrame +from pycylon.net import MPIConfig +from cloudmesh.common.StopWatch import StopWatch +from cloudmesh.common.dotdict import dotdict +from cloudmesh.common.Shell import Shell +from pycylon.net.ucc_config import UCCConfig +from pycylon.net.redis_ucc_oob_context import UCCRedisOOBContext +from pycylon.net.reduce_op import ReduceOp + + +def cylon_join(data=None): + global ucc_config + StopWatch.start(f"join_total_{data['host']}_{data['rows']}_{data['it']}") + + redis_context = UCCRedisOOBContext(data['world_size'], f"tcp://{data['redis_host']}:{data['redis_port']}") + + if redis_context is not None: + ucc_config = UCCConfig(redis_context) + + if ucc_config is None: + print("unable to initialize uccconfig") + + env = CylonEnv(config=ucc_config, distributed=True) + + u = data['unique'] + + context = env.context + + if context is None: + print("unable to retrieve cylon context") + + communicator = context.get_communicator() + + if data['scaling'] == 'w': # weak + num_rows = data['rows'] + max_val = num_rows * env.world_size + else: # 's' strong + max_val = data['rows'] + num_rows = int(data['rows'] / env.world_size) + + rng = default_rng(seed=env.rank) + data1 = rng.integers(0, int(max_val * u), size=(num_rows, 2)) + data2 = rng.integers(0, int(max_val * u), size=(num_rows, 2)) + + df1 = DataFrame(pd.DataFrame(data1).add_prefix("col")) + df2 = DataFrame(pd.DataFrame(data2).add_prefix("col")) + + if env.rank == 0: + print("Task# ", data['task']) + + for i in range(data['it']): + env.barrier() + StopWatch.start(f"join_{i}_{data['host']}_{data['rows']}_{data['it']}") + t1 = time.time() + df3 = df1.merge(df2, on=[0], algorithm='sort', env=env) + env.barrier() + t2 = time.time() + t = (t2 - t1) + + sum_t = communicator.allreduce(t, ReduceOp.SUM) + + tot_l = communicator.allreduce(len(df3), ReduceOp.SUM) + + if env.rank == 0: + avg_t = sum_t / env.world_size + print("### ", data['scaling'], env.world_size, num_rows, max_val, i, avg_t, tot_l) + StopWatch.stop(f"join_{i}_{data['host']}_{data['rows']}_{data['it']}") + + StopWatch.stop(f"join_total_{data['host']}_{data['rows']}_{data['it']}") + + if env.rank == 0: + StopWatch.benchmark(tag=str(data)) + + env.finalize() + + + +if __name__ == "__main__": + parser = argparse.ArgumentParser(description="weak scaling") + parser.add_argument('-n', dest='rows', type=int, required=True) + parser.add_argument('-i', dest='it', type=int, default=10) + parser.add_argument('-u', dest='unique', type=float, default=0.9, help="unique factor") + parser.add_argument('-s', dest='scaling', type=str, default='w', choices=['s', 'w'], + help="s=strong w=weak") + parser.add_argument('-w', dest='world_size', type=int, help="world size", required=True) + + parser.add_argument("-r", dest='redis_host', type=str, help="redis address", + required=True) + + parser.add_argument("-p1", dest='redis_port', type=int, help="name of redis port", + default=6379) # 6379 + + args = vars(parser.parse_args()) + args['host'] = "rivanna" + for i in range(1): + args['task'] = i + # cylon_slice(args) + cylon_join(args) + #cylon_sort(args) + + # os.system(f"{git} branch | fgrep '*' ") + # os.system(f"{git} rev-parse HEAD")