diff --git a/checkin.ipynb b/checkin.ipynb new file mode 100644 index 0000000..561c533 --- /dev/null +++ b/checkin.ipynb @@ -0,0 +1,204 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "ERROR:root:wrong status code from webservice\n", + "ERROR:root:wrong status code from webservice\n", + "ERROR:root:wrong status code from webservice\n", + "ERROR:root:wrong status code from webservice\n", + "INFO:root:Thread: 0\treqs: 5\tmean time: 0.070s\tfast\t\n", + "ERROR:root:wrong status code from webservice\n", + "ERROR:root:wrong status code from webservice\n", + "ERROR:root:wrong status code from webservice\n", + "ERROR:root:wrong status code from webservice\n", + "INFO:root:Thread: 0\treqs: 4\tmean time: 0.066s\tfast\t\n" + ] + } + ], + "source": [ + "import requests\n", + "import random\n", + "import math\n", + "import time\n", + "import threading\n", + "import logging\n", + "logging.getLogger().setLevel(logging.INFO)\n", + "\n", + "\n", + "API_URL=\"http://95.217.175.172:8080/factors\"\n", + "\n", + "\n", + "UNIT = 5.0 # secs\n", + "\n", + "# Pre generated primes\n", + "first_primes_list = [2, 3, 5, 7, 11, 13, 17, 19, 23, 29,\n", + " 31, 37, 41, 43, 47, 53, 59, 61, 67,\n", + " 71, 73, 79, 83, 89, 97, 101, 103,\n", + " 107, 109, 113, 127, 131, 137, 139,\n", + " 149, 151, 157, 163, 167, 173, 179,\n", + " 181, 191, 193, 197, 199, 211, 223,\n", + " 227, 229, 233, 239, 241, 251, 257,\n", + " 263, 269, 271, 277, 281, 283, 293,\n", + " 307, 311, 313, 317, 331, 337, 347, 349]\n", + "\n", + "\n", + "def nBitRandom(n):\n", + " return random.randrange(2**(n-1)+1, 2**n - 1)\n", + " \n", + "def getLowLevelPrime(n):\n", + " '''Generate a prime candidate divisible\n", + " by first primes'''\n", + " while True:\n", + " # Obtain a random number\n", + " pc = nBitRandom(n)\n", + " \n", + " # Test divisibility by pre-generated\n", + " # primes\n", + " for divisor in first_primes_list:\n", + " if pc % divisor == 0 and divisor**2 <= pc:\n", + " break\n", + " else: return pc\n", + " \n", + "def isMillerRabinPassed(mrc):\n", + " '''Run 20 iterations of Rabin Miller Primality test'''\n", + " maxDivisionsByTwo = 0\n", + " ec = mrc-1\n", + " while ec % 2 == 0:\n", + " ec >>= 1\n", + " maxDivisionsByTwo += 1\n", + " assert(2**maxDivisionsByTwo * ec == mrc-1)\n", + " \n", + " def trialComposite(round_tester):\n", + " if pow(round_tester, ec, mrc) == 1:\n", + " return False\n", + " for i in range(maxDivisionsByTwo):\n", + " if pow(round_tester, 2**i * ec, mrc) == mrc-1:\n", + " return False\n", + " return True\n", + " \n", + " # Set number of trials here\n", + " numberOfRabinTrials = 20\n", + " for i in range(numberOfRabinTrials):\n", + " round_tester = random.randrange(2, mrc)\n", + " if trialComposite(round_tester):\n", + " return False\n", + " return True\n", + " \n", + "def random_large_prime(bits):\n", + " while True:\n", + " prime_candidate = getLowLevelPrime(bits)\n", + " if not isMillerRabinPassed(prime_candidate):\n", + " continue\n", + " else:\n", + " return prime_candidate\n", + "\n", + "def thread_function(i, fast, timeout):\n", + " start = time.time()\n", + "\n", + " c = 5 # bits: 20: 200ms; 21: 350ms; 22: 700ms 23: 1.5s; 25: 6s; 26: 10s; 27: 24s\n", + " bits = 19 if fast else 23\n", + " last_report = time.time()\n", + " processing_time = 0.0\n", + " reqs = 0\n", + " while True:\n", + " iter_start = time.time()\n", + " if iter_start - start > timeout:\n", + " logging.info(\"Thread: %d\\treqs: %d\\tmean time: %.3fs\\t%s\"%(i, reqs, processing_time/reqs if reqs>0 else 0.0, \"fast\\t\" if fast else \"\"))\n", + " results[i][iter_start] = processing_time/reqs if reqs>0 else 0.0\n", + " return\n", + " if iter_start - last_report > UNIT/2:\n", + " if len(results[i])%2 == 0:\n", + " logging.info(\"Thread: %d\\treqs: %d\\tmean time: %.3fs\\t%s\"%(i, reqs, processing_time/reqs if reqs>0 else 0.0, \"fast\\t\" if fast else \"\"))\n", + " results[i][iter_start] = processing_time/reqs if reqs>0 else 0.0\n", + " processing_time = 0.0\n", + " reqs = 0\n", + " last_report=iter_start\n", + "\n", + " factors = [random_large_prime(bits) for i in range(c)]\n", + " factors.sort()\n", + " n=math.prod(factors)\n", + "\n", + " r = requests.get(API_URL+'/factors/%d'%(n))\n", + " if r.status_code != 200:\n", + " logging.error(\"wrong status code from webservice\")\n", + " else:\n", + " result = r.json()\n", + " if result != factors:\n", + " logging.error(\"Wrong factors\")\n", + "\n", + " processing_time+=time.time() - iter_start\n", + " reqs+=1\n", + " time.sleep(0.5)\n", + "\n", + "START = time.time()\n", + "slow_threads = 4\n", + "\n", + "results = [ {} for i in range(slow_threads+1)]\n", + "\n", + "t0 = threading.Thread(target=thread_function, args=(0, True, (5 + slow_threads*3) * UNIT))\n", + "t0.start()\n", + "time.sleep(2 * UNIT)\n", + "for i in range(slow_threads):\n", + " t = threading.Thread(target=thread_function, args=(i+1, False, (slow_threads-i) * 3 * UNIT))\n", + " t.start()\n", + " time.sleep(2 * UNIT)\n", + "\n", + "t0.join()" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "import numpy as np\n", + "import matplotlib.pyplot as plt\n", + "import scipy.stats as stats\n", + "mu = 0\n", + "std = 1\n", + "for i, result in enumerate(results):\n", + " x = [(x - START)/UNIT for x in result.keys()]\n", + " y = result.values()\n", + " plt.plot(x, y, label=\"t%d\"%(i,))\n", + "\n", + "plt.legend()\n", + "plt.show()" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.9.9" + }, + "orig_nbformat": 4, + "vscode": { + "interpreter": { + "hash": "736888a2fe7f30701e403545cd826a09e7b18a72829f1395b89a416eae077a79" + } + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/user_data.py b/user_data.py index d899dba..e8a5a9c 100644 --- a/user_data.py +++ b/user_data.py @@ -3,7 +3,7 @@ user_data = f''' sudo yum update -y sudo yum install git -y git clone https://git.wmi.amu.edu.pl/s444391/aws-chmurki.git -cd aws-webservice/get +cd aws-chmurki/get sudo yum install docker -y sudo service docker start sudo usermod -a -G docker ec2-user