Skip to content

Instantly share code, notes, and snippets.

@alendit
Created September 8, 2015 17:33
Show Gist options
  • Save alendit/454bcf4bd380521141bd to your computer and use it in GitHub Desktop.
Save alendit/454bcf4bd380521141bd to your computer and use it in GitHub Desktop.
Display the source blob
Display the rendered blob
Raw
{
"cells": [
{
"metadata": {
"trusted": false,
"collapsed": false
},
"cell_type": "code",
"source": "from plumbum import local, SshMachine\nfrom parse import search\nimport pandas as pd\nfrom collections import Counter, OrderedDict\nimport json\n%pylab inline",
"execution_count": 65,
"outputs": [
{
"text": "Populating the interactive namespace from numpy and matplotlib\n",
"name": "stdout",
"output_type": "stream"
}
]
},
{
"metadata": {
"trusted": false,
"collapsed": true
},
"cell_type": "code",
"source": "hyper = local['/home/alendit/hyper/hyper/bin/debug/sql']\nstrace = local['strace']",
"execution_count": 2,
"outputs": []
},
{
"metadata": {},
"cell_type": "markdown",
"source": "## Get system call types used in hyper"
},
{
"metadata": {
"trusted": false,
"collapsed": false
},
"cell_type": "code",
"source": "open(\"/tmp/sample_sql.sql\", \"w\").write(\"\"\"\nSELECT\n sum(l_extendedprice * l_discount) as revenue\nFROM\n lineitem\nWHERE\n l_shipdate >= date '1994-01-01'\n AND l_shipdate < date '1994-01-01' + interval '1' year\n AND l_discount between 0.06 - 0.01 AND 0.06 + 0.01\n AND l_quantity < 24;\n\n\"\"\")",
"execution_count": 16,
"outputs": [
{
"data": {
"text/plain": "257"
},
"output_type": "execute_result",
"metadata": {},
"execution_count": 16
}
]
},
{
"metadata": {
"trusted": false,
"collapsed": false
},
"cell_type": "code",
"source": "exitcode, stdout, stderr = strace.run(['/home/alendit/hyper/hyper/bin/sql',\n '/home/alendit/hyper/hyper/tpch.hp', \"/tmp/sample_sql.sql\"])",
"execution_count": 17,
"outputs": []
},
{
"metadata": {
"trusted": false,
"collapsed": false
},
"cell_type": "code",
"source": "syscalls = []\nfor line in stderr.split(\"\\n\"):\n syscalls.append(line.split('(')[0])",
"execution_count": 18,
"outputs": []
},
{
"metadata": {
"scrolled": true,
"trusted": false,
"collapsed": false
},
"cell_type": "code",
"source": "syscalls_total = len(syscalls)\nsyscalls_map = json.dumps(OrderedDict(sorted(Counter(syscalls).items(), key=lambda _: _[1], reverse=True)), indent=2)\nprint(syscalls_total)\nprint(syscalls_map)",
"execution_count": 19,
"outputs": [
{
"text": "416\n{\n \"mmap\": 83,\n \"brk\": 77,\n \"mprotect\": 47,\n \"munmap\": 37,\n \"open\": 26,\n \"close\": 25,\n \"read\": 25,\n \"fstat\": 23,\n \"stat\": 20,\n \"lseek\": 7,\n \"write\": 6,\n \"futex\": 6,\n \"getdents\": 4,\n \"sched_setaffinity\": 4,\n \"clone\": 3,\n \"rt_sigaction\": 3,\n \"sched_getaffinity\": 3,\n \"pread\": 2,\n \") = 1\": 2,\n \"get_mempolicy\": 2,\n \"\": 1,\n \"set_robust_list\": 1,\n \"execve\": 1,\n \"madvise\": 1,\n \"access\": 1,\n \"getrlimit\": 1,\n \"+++ exited with 0 +++\": 1,\n \"set_tid_address\": 1,\n \"arch_prctl\": 1,\n \"rt_sigprocmask\": 1,\n \"exit_group\": 1\n}\n",
"name": "stdout",
"output_type": "stream"
}
]
},
{
"metadata": {
"trusted": false,
"collapsed": false
},
"cell_type": "code",
"source": "# CONSTANTS\nhost = \"146.148.120.245\"\nexecutable_path = './thrasher/bin/thrasher'\nfactors = [.1, .2, .3, .4, .5, .7, .9, 1, 1.3, 1.5, 1.7, 2]\niterations = 100",
"execution_count": 67,
"outputs": []
},
{
"metadata": {
"trusted": false,
"collapsed": true
},
"cell_type": "code",
"source": "gce = SshMachine(host, user=\"vorona\")",
"execution_count": 68,
"outputs": []
},
{
"metadata": {},
"cell_type": "markdown",
"source": "## Page faults and syscall performance"
},
{
"metadata": {
"variables": {
"iterations": "100",
"host": "146.148.120.245"
},
"collapsed": true
},
"cell_type": "markdown",
"source": "### TLBTrasher\n\nRun TLBTrasher on Google Compute Cloude box ({{host}}) with different load factors. Factor of 1 correcponds to number of pages which fit into the L2 TLB. Each configuration is executed {{iterations}} times. All figures are in nanoseconds."
},
{
"metadata": {
"trusted": false,
"collapsed": true
},
"cell_type": "code",
"source": "def benchmark(factor=1, machine=local, executable_path=\"./thrasher\"):\n thrasher = machine[executable_path]\n exitcode, stdout, stderr = thrasher.run([factor])\n if exitcode != 0:\n return None\n try:\n results = {\n \"mmap\": search(\n \"mmap time was {total_time:d} for {pages:d} pages ({latency:g} us/page).\", stdout),\n \"protect\": search(\n \"mprotect time was {total_time:d} for {pages:d} pages ({latency:g} us/page).\", stdout),\n \"fault\": search(\n \"Page fault time was {total_time:d} for {pages:d} pages ({latency:g} us/page).\", stdout),\n \"access\": search(\n \"Page access time was {total_time:d} for {pages:d} pages ({latency:g} us/page).\", stdout),\n \"write\": search(\n \"Write(2) time was {total_time:d} for {pages:d} calls ({latency:g} us/call).\", stdout)\n }\n output = {key: value['latency'] for key, value in results.items()}\n return output\n except Exception as exc:\n print(machine)\n print(stderr)\n print(stdout)\n raise exc",
"execution_count": 69,
"outputs": []
},
{
"metadata": {
"trusted": false,
"collapsed": false
},
"cell_type": "code",
"source": "def execute_benchmark(machine=None):\n results = pd.DataFrame()\n with machine.cwd(\"/home/vorona/thrasher\"):\n machine['make']()\n skipped = 0\n for factor in factors:\n for iteration in range(iterations):\n try:\n if machine is None:\n run_results = benchmark(factor, executable_path=executable_path)\n else:\n run_results = benchmark(factor, machine, executable_path=executable_path)\n except AttributeError as exc:\n skipped += 1\n print(exc)\n print(\"\\r{}\".format(skipped))\n else:\n run_results['factor'] = factor\n\n results = results.append(run_results, ignore_index=True)\n return results\nresults_kvm = execute_benchmark(gce)",
"execution_count": 70,
"outputs": []
},
{
"metadata": {
"trusted": false,
"collapsed": false
},
"cell_type": "code",
"source": "aggregates = results_kvm.groupby('factor').aggregate(np.average)",
"execution_count": 75,
"outputs": []
},
{
"metadata": {
"trusted": false,
"collapsed": false
},
"cell_type": "code",
"source": "# drop factor 0.05 because it's only 50 pages which leads to irregularities\naggregates = aggregates[aggregates.index > 0.05]",
"execution_count": 87,
"outputs": []
},
{
"metadata": {
"trusted": false,
"collapsed": false
},
"cell_type": "code",
"source": "for column in aggregates.columns:\n figure()\n aggregates[column].plot(ylim=(0, aggregates[column].max() * 1.1), title=column)",
"execution_count": 90,
"outputs": [
{
"data": {
"text/plain": "<matplotlib.figure.Figure at 0x7f53033ab160>",
"image/png": "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\n"
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"text/plain": "<matplotlib.figure.Figure at 0x7f53033395c0>",
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAYAAAAEZCAYAAACervI0AAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAGWVJREFUeJzt3XuUVeWd5vHvI4hBQYGQoFw6QIRE1tJcNGjScTzGhCZO\nFpiOAUybENt0Gxkb06u7E3B6QnVmZYYYe2KcbnKZxDT2BAyatI2JEpFw0na3A964aEkEYyVCQtmR\niyCSAPWbP/Y+cCyrCupU1bnU+3zWOqv22fvd+7znrFPvs993n723IgIzM0vPSbWugJmZ1YYDwMws\nUQ4AM7NEOQDMzBLlADAzS5QDwMwsUQ4AS5Kkt0jaIOklSTf0YDtNkv6xN+tmVi0Da10Bsxr5LLAm\nIt7ew+0cPZFG0njg58DAiGjr4XbN+px7AJaqNwHNvbAdneA8s7rjALDkSPoJUAD+TtI+SfMlPSFp\nr6RfSlpUVrYg6fl267dIel/ZrFIv4F/yv3vy7V7Yl+/DrKccAJaciHgf8BDwXyJiKLARuDoizgD+\nM3C9pJldbaLd89Ie/8X53zMiYmhErOvNepv1NgeApUwAEfHTiHgqn94M3AlcUun2zBqFA8BSFgCS\nLpS0VtILkvYA1wGvr23VzPqeA8AMlgH3AGMjYhjwdY79b7wMnFoqKGkA8IZOtuNL61pDcQCYwRBg\nd0T8TtJU4GMca8yfAV4n6XJJJwN/DZzSyXb+A2gD3tzXFTbrDQ4AM5gHfEHSS8B/A75XWhARe/Pl\n3wK2A/uB8l8FRf4gIg4AXwT+TdLuPEzM6pZ8QxgzszS5B2BmligHgJlZohwAZmaJcgCYmSWqrq4G\nKslHpM3MKhAR3T4Tve56ABHhR7vHokWLal6H/vzw5+vPuNEflaq7ADAzs+pwAJiZJcoB0AAKhUKt\nq9Cv+fPte/6M61NdnQksKeqpPmZmjUAS0R8OApuZWXU4AMzMEuUAMDNLlAPAzCxRDgAzs0Q5AMzM\nEuUAMDNLlAPAzCxRDgAzs0Q5AMzMEuUAMDNLlAPAzCxRDgAzs0R1GQCSbpfUKmlzB8v+QlKbpBFl\n8xZK2ippi6RpZfPPl7Q5X/bV3n0LZmZWieP1AL4DTG8/U9I44APAL8rmTQFmA1PydZZIKl2e9GvA\ntRExCZgk6TXbLGlp6U71zcysUl0GQEQ8BOzuYNH/Aj7bbt5MYHlEHIqIFmAbcKGks4ChEbE+L3cH\ncEVnrzl9Orz44gnW3szMKtbtYwCSZgLbI2JTu0Wjge1lz7cDYzqYvyOf36EZM7LHK690t2ZmZtYd\n3QoASacCNwGLymf3ZoUWL4Y3vQmuvhqOHOnNLZuZWbmB3Sz/ZmA8sDEf3h8LPCbpQrI9+3FlZceS\n7fnvyKfL5+/o7AW+8IUmJk6E734XPvrRAt//fgH1asSYmTW2YrFIsVjs8XaOe09gSeOBeyPi3A6W\nPQecHxG78oPAy4CpZEM8DwJnR0RIWgfMB9YDPwJui4hVHWzv6D2B9+yBiy+GuXPhL/+yB+/QzKyf\n65N7AktaDvw7MFnS85KuaVfkaHpERDOwAmgG7gfmld3hfR7wLWArsK2jxr+9YcPgvvvgttvgzjtP\n+P2YmdkJOm4PoJrKewAlmzfDZZfBihVQKNSmXmZm9axPegD14Nxz4Xvfg9mz4ckna10bM7P+o+4D\nAODSS+ErX4HLL4ft249f3szMjq+7vwKqmY99LGv8L78cHnoIzjij1jUyM2tsdX8MoFwEzJ8Pzc1w\n//0waFAVK2dmVqcqPQbQUAEA2clhV14Jp50Gd9wBJzXEIJaZWd/ptweB2xswAJYtg5//HG66qda1\nMTNrXA0XAACDB8PKlfBP/wR///e1ro2ZWWNqmIPA7Y0cmR0HeO97YcwYuKLT64uamVlHGjYAACZO\nzHoCH/wgjBoF7353rWtkZtY4GnIIqNwFF2QHgz/8YXjmmVrXxsyscTR8AEDWA/jiF7ObybS21ro2\nZmaNoV8EAMC118InPgHTpsGaNdk5A2Zm1rmGOw+gKxHZcNDNN8Mpp2SXkf7oR+Hkk3uxkmZmdSaZ\nE8FORFsbrFoFX/4yPPssfOYz8KlPwemn90IlzczqTDIngp2Ik07Krhm0di384AfwyCPZL4Y+9znY\n0em9yMzM0tIvA6DcBRfA8uXw6KPw299ml5f+5Cez+wyYmaWs3wdAyfjxcOutsG0bvOUt8Ad/kP1q\n6MEHfcDYzNLUL48BnIjf/ja78fwttxw7YDxrlg8Ym1nj8UHgCrW1ZZeUuOUWHzA2s8bkAOgFjz6a\nBcHq1fBHf5T1CN7zHl9y2szqW5/8CkjS7ZJaJW0um/dlSU9L2ijpB5LOKFu2UNJWSVskTSubf76k\nzfmyr3a3ktVywQVw553w2GPwhjfA9dfDuHFw443wr/+a9RbMzPqLLnsAki4G9gN3RMS5+bwPAGsi\nok3SYoCIWCBpCrAMeBcwBngQmBQRIWk9cENErJd0H3BbRKzq4PVq2gPoyNNPw113ZY/du+EjH8l6\nBu9+t3sGZlYf+mwISNJ44N5SALRb9mHgIxFxtaSFQFtEfClftgpoAn4B/CQizsnnzwEKEfHpDrZX\ndwFQrn0YXHlldqaxw8Cs/kTAgQPZ/+quXdlj9244fDj7f5WyR6XT9bSNM86oLAB6ejnoPwaW59Oj\ngf9Xtmw7WU/gUD5dsiOf33DOOQc+//nsUQqD666DPXscBmZ95ciR7H+s1ICXN+YdTZc/HzAAhg+H\nESOyx7Bh2S/9IrIh3YieTdfLNipVcQBI+q/A7yJiWeUv/1pNTU1HpwuFAoVCoTc332vKw6C5+bVh\nMGsWXHSRw8AMskbqlVe634Dv2gX792e/yhsx4tWNeWl63Dh429teu2z48Ozugf1RsVikWCweff43\nf1PZdioaApL0SeBPgMsi4mA+bwFARCzOn68CFpENAa0tGwK6CrikEYeATkQpDO66C/buhWuugT/9\nUxg7ttY1M+s7bW2wc2d2r+7yx7PPQksLvPhiVq7UQHfWmLefHjEia/wHDKjp26t7VTsGIGk68Ldk\njfhvysqVDgJP5dhB4LPzg8DrgPnAeuBHNNBB4J7YvBm++c3shLNCIftV0WWXuVdgjenAgdc28KVH\nS0vWUE+c+NrH+PHZr+r66954PeiTAJC0HLgEGAm0ku3RLwQGAbvyYg9HxLy8/E1kxwUOAzdGxI/z\n+ecD/wAMBu6LiPmdvF6/CoCS/fuzEFiyJOsGX399dj2i4cNrXTOzY9ra4Ne/7ryR37Mna8w7auQn\nTIAhQ2r9DtLlE8EaQAQ8/HAWBD/8IfzhH8K8edn5B2bV8PLL8Nxzrx6iKd+LHzas4wZ+4kQ46yz3\nXuuVA6DBvPAC3H47fP3rWfd43jyYPRtOPbXWNbNG9Lvfwb59WW9z375szL28oS899u7N9tY724s/\n7bRavxOrhAOgQR05kt28ZskSWLcO5s6FT38aJk2qdc2srxw5ku2JlxrsUqNd/vdE55X+RsDQodlj\nyJBseLGjRv7MM70X3x85APqB556Db3wj6xm8/e1Zr+BDH4KBPT1bwyoWAQcPdq8xPt68gwezPe0h\nQ7JHqdFu/7c78045pdaflNWSA6AfOXgQ7r476xU8/3x2+YnXva7zk0EqOYGk0nUARo6EUaOyvcn2\nf4cPz85OrGcR8ItfwKZNsHEj/Oxn8NJLnTfogwadeGN8Io334MHeC7fe5QDopzZsyIaIInp+ynhv\nTLe1wW9+A62t2e++2/995RV44xs7Dof2804/ve/DYt8+ePLJY439pk3Zz3OHDoXzzsse55yTBVdn\njbZ7YFbvHABWFw4ezMKgFAgdhUTp7+HDxw+J0t/j/cSwrS07yLlp06sb+507YcqUY439296W3Rb0\n9a+vzudhVg0OAGs4L7/86rDoKjROOum1ofDGN2a/W9+4MdvLHznyWENfekya5LNIrf9zAFi/FZGN\nxbcPhtbWLAjOOy/bqx82rNY1NasNB4CZWaL65I5gZmbWfzkAzMwS5QAwM0uUA8DMLFEOADOzRDkA\nzMwS5QAwM0uUA8DMLFEOADOzRDkAzMwS1WUASLpdUqukzWXzRkhaLekZSQ9IGla2bKGkrZK2SJpW\nNv98SZvzZV/tm7diZmbdcbwewHeA6e3mLQBWR8RkYE3+HElTgNnAlHydJdLRq71/Dbg2IiYBkyS1\n36aZmVVZlwEQEQ8Bu9vNngEszaeXAlfk0zOB5RFxKCJagG3AhZLOAoZGxPq83B1l65iZWY1Ucgxg\nVES05tOtwKh8ejSwvazcdmBMB/N35PPNzKyGenQQOL92s6/fbGbWgCq522mrpDMjYmc+vPNCPn8H\nMK6s3FiyPf8d+XT5/B2dbbypqenodKFQoFAoVFBFM7P+q1gsUiwWe7yd494QRtJ44N6IODd/fjPw\nYkR8SdICYFhELMgPAi8DppIN8TwInB0RIWkdMB9YD/wIuC0iVnXwWr4hjJlZN1V6Q5guewCSlgOX\nACMlPQ98HlgMrJB0LdACzAKIiGZJK4Bm4DAwr6w1nwf8AzAYuK+jxt/MzKrLt4Q0M2twviWkmZl1\niwPAzCxRDgAzs0Q5AMzMEuUAMDNLlAPAzCxRDgAzs0Q5AMzMEuUAMDNLlAPAzCxRDgAzs0Q5AMzM\nEuUAMDNLlAPAzCxRDgAzs0Q5AMzMEuUAMDNLlAPAzCxRDgAzs0Q5AMzMElVxAEhaKOkpSZslLZN0\niqQRklZLekbSA5KGtSu/VdIWSdN6p/pmZlapigJA0njgT4B3RsS5wABgDrAAWB0Rk4E1+XMkTQFm\nA1OA6cASSe59mJnVUKWN8EvAIeBUSQOBU4FfATOApXmZpcAV+fRMYHlEHIqIFmAbMLXSSpuZWc9V\nFAARsQv4W+CXZA3/nohYDYyKiNa8WCswKp8eDWwv28R2YExFNTYzs14xsJKVJL0Z+AwwHtgL3CXp\n6vIyERGSoovNdLisqanp6HShUKBQKFRSRTOzfqtYLFIsFnu8HUV01UZ3spI0G/hARHwqf/5x4CLg\nfcClEbFT0lnA2oh4q6QFABGxOC+/ClgUEevabTcqqY+ZWcokERHq7nqVHgPYAlwkabAkAe8HmoF7\ngbl5mbnAPfn0SmCOpEGSJgCTgPUVvraZmfWCioaAImKjpDuAR4E24HHgm8BQYIWka4EWYFZevlnS\nCrKQOAzM866+mVltVTQE1Fc8BGRm1n3VHgIyM7MG5wAwM0uUA8DMLFEOADOzRDkAzMwS5QAwM0uU\nA8DMLFEOADOzRDkAzMwS5QAwM0uUA8DMLFEOADOzRDkAzMwS5QAwM0uUA8DMLFEOADOzRDkAzMwS\n5QAwM0uUA8DMLFEVB4CkYZLulvS0pGZJF0oaIWm1pGckPSBpWFn5hZK2StoiaVrvVN/MzCrVkx7A\nV4H7IuIc4DxgC7AAWB0Rk4E1+XMkTQFmA1OA6cASSe59mJnVUEWNsKQzgIsj4naAiDgcEXuBGcDS\nvNhS4Ip8eiawPCIORUQLsA2Y2pOKm5lZz1S6Fz4B+A9J35H0uKT/I+k0YFREtOZlWoFR+fRoYHvZ\n+tuBMRW+tpmZ9YKBPVjvncANEfGIpFvJh3tKIiIkRRfb6HBZU1PT0elCoUChUKiwimZm/VOxWKRY\nLPZ4O4roqo3uZCXpTODhiJiQP38vsBCYCFwaETslnQWsjYi3SloAEBGL8/KrgEURsa7ddqOS+piZ\npUwSEaHurlfREFBE7ASelzQ5n/V+4CngXmBuPm8ucE8+vRKYI2mQpAnAJGB9Ja9tZma9o9IhIIA/\nA74raRDwLHANMABYIelaoAWYBRARzZJWAM3AYWCed/XNzGqroiGgvuIhIDOz7qvqEJCZmTU+B4CZ\nWaIcAGZmiXIAmJklygFgZpYoB4CZWaIcAGZmiXIAmJklygFgZpYoB4CZWaIcAGZmiXIAmJklygFg\nZpYoB4CZWaIcAGZmiXIAmJklygFgZpYoB4CZWaIcAGZmiXIAmJklqkcBIGmApCck3Zs/HyFptaRn\nJD0gaVhZ2YWStkraImlaTytuZmY909MewI1AMxD58wXA6oiYDKzJnyNpCjAbmAJMB5ZIcu/DzKyG\nKm6EJY0FLge+BSifPQNYmk8vBa7Ip2cCyyPiUES0ANuAqZW+tpmZ9VxP9sK/AvwV0FY2b1REtObT\nrcCofHo0sL2s3HZgTA9e28zMemhgJStJ+hDwQkQ8IanQUZmICEnR0bJSkY5mNjU1HZ0uFAoUCh1u\n3swsWcVikWKx2OPtKKKrNrqTlaT/AXwcOAy8Djgd+AHwLqAQETslnQWsjYi3SloAEBGL8/VXAYsi\nYl277UYl9TEzS5kkIkLHL/lqFQ0BRcRNETEuIiYAc4CfRMTHgZXA3LzYXOCefHolMEfSIEkTgEnA\n+kpe28zMekdFQ0AdKO22LwZWSLoWaAFmAUREs6QVZL8YOgzM866+mVltVTQE1Fc8BGRm1n1VHQIy\nM7PG5wAwM0uUA8DMLFEOADOzRDkAzMwS5QAwM0uUA8DMLFEOADOzRDkAzMwS5QAwM0uUA8DMLFEO\nADOzRDkAzMwS5QAwM0uUA8DMLFEOADOzRDkAzMwS5QAwM0uUA8DMLFEVBYCkcZLWSnpK0pOS5ufz\nR0haLekZSQ9IGla2zkJJWyVtkTStt96AmZlVpqKbwks6EzgzIjZIGgI8BlwBXAP8JiJulvQ5YHhE\nLJA0BVgGvAsYAzwITI6Itnbb9U3hzcy6qao3hY+InRGxIZ/eDzxN1rDPAJbmxZaShQLATGB5RByK\niBZgGzC1ktc2M7Pe0eNjAJLGA+8A1gGjIqI1X9QKjMqnRwPby1bbThYYZmZWIwN7snI+/PN94MaI\n2Ccd64FEREjqajynw2VNTU1HpwuFAoVCoSdVNDPrd4rFIsViscfbqegYAICkk4EfAvdHxK35vC1A\nISJ2SjoLWBsRb5W0ACAiFuflVgGLImJdu236GICZWTdV9RiAsl39bwPNpcY/txKYm0/PBe4pmz9H\n0iBJE4BJwPpKXtvMzHpHpb8Cei/wL8Amjg3lLCRr1FcAvwe0ALMiYk++zk3AHwOHyYaMftzBdt0D\nMDPrpkp7ABUPAfUFB4CZWfdVdQjIzMwanwPAzCxRDgAzs0Q5AMzMEuUAMDNLlAPAzCxRDgAzs0Q5\nAMzMEuUAMDNLlAPAzCxRDgAzs0Q5AMzMEuUAMDNLlAPAzCxRDgAzs0Q5AMzMEuUAMDNLlAPAzCxR\nDgAzs0RVNQAkTZe0RdJWSZ+r5mubmdmrVS0AJA0A/g6YDkwBrpJ0TrVev5EVi8VaV6Ff8+fb9/wZ\n16dq9gCmAtsioiUiDgF3AjOr+PoNy/88fcufb9/zZ1yfqhkAY4Dny55vz+eZmVkNVDMAooqvZWZm\nx6GI6rTLki4CmiJiev58IdAWEV8qK+OQMDOrQESou+tUMwAGAj8DLgN+BawHroqIp6tSATMze5WB\n1XqhiDgs6Qbgx8AA4Ntu/M3MaqdqPQAzM6svPhO4jhzvRDlJBUl7JT2RP/66FvVsRJJul9QqaXMX\nZW7LP/uNkt5Rzfr1B8f7jP39rZykcZLWSnpK0pOS5ndSrlvf4aoNAVnXyk6Uez+wA3hE0soOhsl+\nGhEzql7Bxvcd4H8Dd3S0UNLlwNkRMUnShcDXgIuqWL/+oMvPOOfvb2UOAX8eERskDQEek7S6vH2o\n5DvsHkD9ONET5bp9pN8gIh4CdndRZAawNC+7DhgmaVQ16tZfnMBnDP7+ViQidkbEhnx6P/A0MLpd\nsW5/hx0A9eNETpQL4D159+4+SVOqVrv+r6PPf2yN6tJf+fvbCySNB94BrGu3qNvfYQ8B1Y8TORr/\nODAuIg5I+iBwDzC5b6uVlPZ7p/6FRO/y97eH8uGfu4Eb857Aa4q0e97ld9g9gPqxAxhX9nwcWYIf\nFRH7IuJAPn0/cLKkEdWrYr/W/vMfm8+zXuLvb89IOhn4PvB/I+KeDop0+zvsAKgfjwKTJI2XNAiY\nDawsLyBplCTl01PJfsa7q/pV7ZdWAp+Ao2et74mI1tpWqX/x97dy+ef2baA5Im7tpFi3v8MeAqoT\nnZ0oJ+m6fPk3gCuB6yUdBg4Ac2pW4QYjaTlwCTBS0vPAIuBkyD7biLhP0uWStgEvA9fUrraN6Xif\nMf7+9sTvA1cDmyQ9kc+7Cfg9qPw77BPBzMwS5SEgM7NEOQDMzBLlADAzS5QDwMwsUQ4AM7NEOQDM\nzBLlALDkSJovqVnSP3Zzvc9IGtxX9TKrNp8HYMmR9DRwWUT8qpvrPQdcEBEvdmOdkyKirbt1NKsG\n9wAsKZK+DkwEVkn6rKR/l/S4pH+TNDkvM0DSLZI251euvEHSn5FdfnetpDV5uaskbcrLLS57jf35\n+hvwPQWsjrkHYMnJ9+TPJ7vJxoGIOCLp/cCnI+JKSdcDlwJzIqJN0vCI2F1aLyJ2SRoNPAy8E9gD\nPADcFhH/LKkNmBURd9fkDZqdIF8LyFI2DLhD0tlkl80t/T9cBnytNHQTER3d5ORdwNrScJCk7wL/\nCfhn4AjZVRvN6pqHgCxVAv47sCYiziW7m9Lgdsu7Eu3KiGPXXj8Y7lpbA3AAWMpOB0oHgj9ZNn81\ncF1+n2YkDc/n78vXAXgEuETS6/Nyc4Cf9nmNzXqRA8BSFPnjZuB/Snqc7BLcpb32bwG/JLv07gbg\nqnz+N8kOHq+JiF8DC4C1wAbg0Yi4t2z7ZnXPB4HNzBLlHoCZWaIcAGZmiXIAmJklygFgZpYoB4CZ\nWaIcAGZmiXIAmJklygFgZpao/w8u9f0HlsNiEAAAAABJRU5ErkJggg==\n"
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"text/plain": "<matplotlib.figure.Figure at 0x7f530334f978>",
"image/png": "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\n"
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"text/plain": "<matplotlib.figure.Figure at 0x7f530325c160>",
"image/png": "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\n"
},
"metadata": {},
"output_type": "display_data"
},
{
"data": {
"text/plain": "<matplotlib.figure.Figure at 0x7f53034b1358>",
"image/png": "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\n"
},
"metadata": {},
"output_type": "display_data"
}
]
},
{
"metadata": {
"trusted": false,
"collapsed": false
},
"cell_type": "code",
"source": "aggregates",
"execution_count": 80,
"outputs": [
{
"data": {
"text/html": "<div>\n<table border=\"1\" class=\"dataframe\">\n <thead>\n <tr style=\"text-align: right;\">\n <th></th>\n <th>access</th>\n <th>fault</th>\n <th>mmap</th>\n <th>protect</th>\n <th>write</th>\n </tr>\n <tr>\n <th>factor</th>\n <th></th>\n <th></th>\n <th></th>\n <th></th>\n <th></th>\n </tr>\n </thead>\n <tbody>\n <tr>\n <th>0.05</th>\n <td>23.953335</td>\n <td>1603.71960</td>\n <td>1234.49470</td>\n <td>299.83120</td>\n <td>1108.40639</td>\n </tr>\n <tr>\n <th>0.10</th>\n <td>15.646468</td>\n <td>1427.08820</td>\n <td>1146.97702</td>\n <td>270.47973</td>\n <td>1747.93816</td>\n </tr>\n <tr>\n <th>0.20</th>\n <td>16.205885</td>\n <td>1287.00770</td>\n <td>1053.37211</td>\n <td>226.12291</td>\n <td>1039.85393</td>\n </tr>\n <tr>\n <th>0.30</th>\n <td>15.136739</td>\n <td>1230.67400</td>\n <td>1031.73096</td>\n <td>250.29958</td>\n <td>1155.34255</td>\n </tr>\n <tr>\n <th>0.40</th>\n <td>18.267314</td>\n <td>1189.30243</td>\n <td>1058.84349</td>\n <td>256.40013</td>\n <td>1205.04606</td>\n </tr>\n <tr>\n <th>0.50</th>\n <td>23.901251</td>\n <td>1138.11039</td>\n <td>1035.81836</td>\n <td>245.26497</td>\n <td>997.77902</td>\n </tr>\n <tr>\n <th>0.70</th>\n <td>22.139135</td>\n <td>1139.39442</td>\n <td>1041.42765</td>\n <td>229.10462</td>\n <td>1019.96574</td>\n </tr>\n <tr>\n <th>0.90</th>\n <td>20.860065</td>\n <td>1116.59801</td>\n <td>1026.41228</td>\n <td>224.11211</td>\n <td>964.92695</td>\n </tr>\n <tr>\n <th>1.00</th>\n <td>20.504394</td>\n <td>1138.95218</td>\n <td>1039.11436</td>\n <td>231.36376</td>\n <td>977.42965</td>\n </tr>\n <tr>\n <th>1.30</th>\n <td>19.891160</td>\n <td>1156.98090</td>\n <td>1036.27593</td>\n <td>219.79211</td>\n <td>930.93314</td>\n </tr>\n <tr>\n <th>1.50</th>\n <td>19.090124</td>\n <td>1189.98130</td>\n <td>1032.51702</td>\n <td>220.78526</td>\n <td>942.78105</td>\n </tr>\n <tr>\n <th>1.70</th>\n <td>19.982485</td>\n <td>1207.10620</td>\n <td>1058.66933</td>\n <td>221.59956</td>\n <td>913.80197</td>\n </tr>\n <tr>\n <th>2.00</th>\n <td>19.419787</td>\n <td>1205.15440</td>\n <td>1052.54170</td>\n <td>223.03927</td>\n <td>901.41666</td>\n </tr>\n </tbody>\n</table>\n</div>",
"text/plain": " access fault mmap protect write\nfactor \n0.05 23.953335 1603.71960 1234.49470 299.83120 1108.40639\n0.10 15.646468 1427.08820 1146.97702 270.47973 1747.93816\n0.20 16.205885 1287.00770 1053.37211 226.12291 1039.85393\n0.30 15.136739 1230.67400 1031.73096 250.29958 1155.34255\n0.40 18.267314 1189.30243 1058.84349 256.40013 1205.04606\n0.50 23.901251 1138.11039 1035.81836 245.26497 997.77902\n0.70 22.139135 1139.39442 1041.42765 229.10462 1019.96574\n0.90 20.860065 1116.59801 1026.41228 224.11211 964.92695\n1.00 20.504394 1138.95218 1039.11436 231.36376 977.42965\n1.30 19.891160 1156.98090 1036.27593 219.79211 930.93314\n1.50 19.090124 1189.98130 1032.51702 220.78526 942.78105\n1.70 19.982485 1207.10620 1058.66933 221.59956 913.80197\n2.00 19.419787 1205.15440 1052.54170 223.03927 901.41666"
},
"output_type": "execute_result",
"metadata": {},
"execution_count": 80
}
]
},
{
"metadata": {
"trusted": false,
"collapsed": true
},
"cell_type": "code",
"source": "results_kvm.to_csv(\"thrasher.csv\")",
"execution_count": 91,
"outputs": []
},
{
"metadata": {},
"cell_type": "markdown",
"source": "### brk performance"
},
{
"metadata": {
"trusted": false,
"collapsed": false
},
"cell_type": "code",
"source": "brk_latency = search('brk(2) runtime for {:d} calls was {:g}us ({latency:g}us/iter).',\n gce['thrasher/bin/alloc_tester']())\nbrk_latency.named['latency']",
"execution_count": 96,
"outputs": [
{
"data": {
"text/plain": "137.317"
},
"output_type": "execute_result",
"metadata": {},
"execution_count": 96
}
]
},
{
"metadata": {
"variables": {
"45 * 1000000 // 4": "11250000"
}
},
"cell_type": "markdown",
"source": "## Memory Bandwidth\n\nWe use *stream* benchmark for bandwidth measurement. GCE instance has 32 Intel Xeon Nehalem CPUs which share 45mb L3 cache. The array size is thus {{45 * 1000000 // 4}}."
},
{
"metadata": {
"trusted": false,
"collapsed": false
},
"cell_type": "code",
"source": "if True: # get stream bench\n def patch_file(path, target, replacement):\n makefile = gce.path(path)\n patched = makefile.read().replace(target, replacement)\n makefile.write(patched)\n gce['mkdir'](['-p', '/home/vorona/stream/'])\n with gce.cwd(\"/home/vorona/stream\"):\n gce['wget']('https://www.cs.virginia.edu/stream/FTP/Code/stream.f')\n patch_file(\"/home/vorona/stream/stream.f\", b'PARAMETER (n=2000000',\n b'PARAMETER (n=11250000')\n \n gce['wget']('https://www.cs.virginia.edu/stream/FTP/Code/stream.c')\n patch_file(\"/home/vorona/stream/stream.c\", b'#define STREAM_ARRAY_SIZE\\t10000000',\n b'#define STREAM_ARRAY_SIZE 11250000')\n gce['wget']('https://www.cs.virginia.edu/stream/FTP/Code/mysecond.c')\n gce['wget']('https://www.cs.virginia.edu/stream/FTP/Code/Makefile')\n patch_file(\"/home/vorona/stream/Makefile\", b'g77', b'f77')\n # patch Makefile\n\n gce['make'](['-j'])",
"execution_count": 120,
"outputs": []
},
{
"metadata": {
"trusted": false,
"collapsed": false
},
"cell_type": "code",
"source": "with gce.cwd(\"/home/vorona/stream\"):\n stream_c = gce['./stream_c.exe']()\n stream_f = gce['./stream_f.exe']()",
"execution_count": 123,
"outputs": []
},
{
"metadata": {
"trusted": false,
"collapsed": false
},
"cell_type": "code",
"source": "print(stream_c)",
"execution_count": 125,
"outputs": [
{
"text": "-------------------------------------------------------------\nSTREAM version $Revision: 5.10 $\n-------------------------------------------------------------\nThis system uses 8 bytes per array element.\n-------------------------------------------------------------\nArray size = 10000000 (elements), Offset = 0 (elements)\nMemory per array = 76.3 MiB (= 0.1 GiB).\nTotal memory required = 228.9 MiB (= 0.2 GiB).\nEach kernel will be executed 10 times.\n The *best* time for each kernel (excluding the first iteration)\n will be used to compute the reported bandwidth.\n-------------------------------------------------------------\nYour clock granularity/precision appears to be 1 microseconds.\nEach test below will take on the order of 10766 microseconds.\n (= 10766 clock ticks)\nIncrease the size of the arrays if this shows that\nyou are not getting at least 20 clock ticks per test.\n-------------------------------------------------------------\nWARNING -- The above is only a rough guideline.\nFor best results, please be sure you know the\nprecision of your system timer.\n-------------------------------------------------------------\nFunction Best Rate MB/s Avg time Min time Max time\nCopy: 11262.0 0.014700 0.014207 0.015498\nScale: 11554.0 0.014223 0.013848 0.014865\nAdd: 12732.7 0.019233 0.018849 0.020051\nTriad: 12723.3 0.019414 0.018863 0.020231\n-------------------------------------------------------------\nSolution Validates: avg error less than 1.000000e-13 on all three arrays\n-------------------------------------------------------------\n\n",
"name": "stdout",
"output_type": "stream"
}
]
},
{
"metadata": {
"trusted": false,
"collapsed": false
},
"cell_type": "code",
"source": "print(stream_f)",
"execution_count": 126,
"outputs": [
{
"text": "----------------------------------------------\n Double precision appears to have 16 digits of accuracy\n Assuming 8 bytes per DOUBLE PRECISION word\n----------------------------------------------\n ----------------------------------------------\n STREAM Version $Revision: 5.6 $\n ----------------------------------------------\n Array size = 90000000\n Offset = 0\n The total memory requirement is **** MB\n You are running each test 10 times\n --\n The *best* time for each test is used\n *EXCLUDING* the first and last iterations\n ----------------------------------------------\n ----------------------------------------------\n Printing one line per active thread....\n ----------------------------------------------------\n Your clock granularity/precision appears to be 1 microseconds\n ----------------------------------------------------\nFunction Rate (MB/s) Avg time Min time Max time\nCopy: 11379.0125 0.1281 0.1265 0.1301\nScale: 10514.0896 0.1379 0.1370 0.1399\nAdd: ********** 0.1775 0.1764 0.1799\nTriad: ********** 0.1818 0.1808 0.1828\n ----------------------------------------------------\n Solution Validates!\n ----------------------------------------------------\n\n",
"name": "stdout",
"output_type": "stream"
}
]
},
{
"metadata": {},
"cell_type": "markdown",
"source": "## Cache latencies\n\nWe use [MonetDB calibrator](http://www.cwi.nl/~manegold/Calibrator/) to test cache latencies."
},
{
"metadata": {
"trusted": false,
"collapsed": false
},
"cell_type": "code",
"source": "if True: # get and compile calibrator\n gce['mkdir']('-p', \"/home/vorona/calibrator\")\n with gce.cwd(\"/home/vorona/calibrator\"):\n gce['rm']('-f', 'calibrator.c')\n gce['wget']('http://homepages.cwi.nl/~manegold/Calibrator/src/calibrator.c')\n # patch calibrator.c\n source = gce.path(\"/home/vorona/calibrator/calibrator.c\")\n patched = []\n lines_iter = iter(source.read().split(b'\\n'))\n for line in lines_iter:\n if line.startswith(b\"lng round(dbl x)\"):\n # skip next 3 lines\n next(lines_iter)\n next(lines_iter)\n next(lines_iter)\n elif line.startswith(b\"#include <stdlib.h>\"):\n patched.append(line)\n patched.append(b\"#include <unistd.h>\")\n else:\n patched.append(line)\n source.write(b\"\\n\".join(patched))\n gce['clang++'].run(['calibrator.c', '-o', 'calibrator', '-l', 'm'])",
"execution_count": 147,
"outputs": []
},
{
"metadata": {
"trusted": false,
"collapsed": true
},
"cell_type": "code",
"source": "with gce.cwd(\"/home/vorona/calibrator\"):\n calibrator_output = gce['./calibrator']('2400', '2G', '/tmp/output.txt')",
"execution_count": 150,
"outputs": []
},
{
"metadata": {
"trusted": false,
"collapsed": false
},
"cell_type": "code",
"source": "print(calibrator_output)",
"execution_count": 151,
"outputs": [
{
"text": "\nCalibrator v0.9e\n(by [email protected], http://www.cwi.nl/~manegold/)\n\nCPU loop + L1 access: 2.69 ns = -1125899906842624 cy\n ( delay: 172.32 ns = -17592186044416 cy )\n\ncaches:\nlevel size linesize miss-latency replace-time\n 1 160 KB 256 bytes -3.27 ns = -1125899906842624 cy 17.17 ns = -140737488355328 cy\n 2 48 MB 256 bytes 10.11 ns = -281474976710656 cy 65.66 ns = -35184372088832 cy\n\nTLBs:\nlevel #entries pagesize miss-latency\n 1 160 4 KB 4.05 ns = -562949953421312 cy \n\n\n",
"name": "stdout",
"output_type": "stream"
}
]
},
{
"metadata": {},
"cell_type": "markdown",
"source": "Something is obsiously wrong with the results (like negative miss latency time)"
}
],
"metadata": {
"kernelspec": {
"name": "python3",
"display_name": "Python 3",
"language": "python"
},
"language_info": {
"version": "3.4.3",
"name": "python",
"pygments_lexer": "ipython3",
"nbconvert_exporter": "python",
"mimetype": "text/x-python",
"codemirror_mode": {
"version": 3,
"name": "ipython"
},
"file_extension": ".py"
},
"notify_time": "10",
"gist_id": "454bcf4bd380521141bd"
},
"nbformat": 4,
"nbformat_minor": 0
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment