Last active
June 29, 2018 15:31
-
-
Save matburt/783c59fc4f02df85c216316980347f42 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
{ | |
"cells": [ | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"### An analysis of allowed simultaneous capacity relative to system specs in Ansible Tower (and AWX)\n", | |
"\n", | |
"In this document we demonstrate the behavior of our capacity algorithms in Ansible Tower version prior to 3.3 and in early versions of AWX [https://github.com/ansible/awx] (prior to 1.0.3)" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 1, | |
"metadata": {}, | |
"outputs": [], | |
"source": [ | |
"%matplotlib inline" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 2, | |
"metadata": {}, | |
"outputs": [], | |
"source": [ | |
"import matplotlib.pyplot as plt\n", | |
"import numpy as np\n", | |
"import psutil\n", | |
"plt.rcParams[\"figure.figsize\"] = (12, 9)" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"### 3.2 (AWX 1.0.2.0) and prior Capacity Algorithm\n", | |
"\n", | |
"This is our classical cluster capacity algorithm in AWX. Interestingly you'll notice that simultaneous allowed jobs is not a linear stair-step pattern as memory increases. This is a gross inefficiency in the algorithm that can't really be explained in a good way." | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 3, | |
"metadata": {}, | |
"outputs": [], | |
"source": [ | |
"def get_old_capacity(mem=4096):\n", | |
" if mem <= 2048:\n", | |
" return 50\n", | |
" return 50 + ((mem / 1024) - 2) * 75" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 13, | |
"metadata": {}, | |
"outputs": [], | |
"source": [ | |
"mem_range = range(2048, 32768)\n", | |
"grow_chart = [get_old_capacity(mem=x) for x in mem_range]\n", | |
"jobs_chart_5 = [max(1, int(x/50)) for x in grow_chart]" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 14, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"data": { | |
"image/png": "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\n", | |
"text/plain": [ | |
"<matplotlib.figure.Figure at 0xa59b150>" | |
] | |
}, | |
"metadata": {}, | |
"output_type": "display_data" | |
}, | |
{ | |
"data": { | |
"image/png": "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\n", | |
"text/plain": [ | |
"<matplotlib.figure.Figure at 0xab4be50>" | |
] | |
}, | |
"metadata": {}, | |
"output_type": "display_data" | |
}, | |
{ | |
"name": "stdout", | |
"output_type": "stream", | |
"text": [ | |
"Last value 44\n" | |
] | |
} | |
], | |
"source": [ | |
"plt.plot(mem_range, grow_chart, 'g')\n", | |
"plt.xlabel(\"mbytes memory\")\n", | |
"plt.ylabel(\"shown capacity value\")\n", | |
"plt.show()\n", | |
"plt.plot(mem_range, jobs_chart_5, 'r')\n", | |
"plt.xlabel(\"mbytes memory\")\n", | |
"plt.ylabel(\"simultaneous jobs\")\n", | |
"plt.show()\n", | |
"jobs_count_at_32_from_old = jobs_chart_5[-1]\n", | |
"print(\"Last value {}\".format(jobs_count_at_32_from_old))" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"### 3.3 (AWX 1.0.3+) Experiment - Aligning more to forks values\n", | |
"\n", | |
"We can effectively divide the `get_capacity` algorithm values by 10 to bring them more in-line with real fork values. We switch the constant from `75` to `7` so we aren't dealing with fractional bits.\n", | |
"\n", | |
"Due to the overall growth reduction from the constant `7` we see that it alleviates some of the odd growth in number of simultaneous jobs but not all.\n", | |
"\n", | |
"What we are trying to get to is a capacity value that is meaningful to the end user and accurately represents how many simultaneous jobs of a particular complexity are capable of being run by a single node.\n", | |
"\n", | |
"Our baseline is to evaluate the number of simultaneous 5-fork jobs we can run." | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 6, | |
"metadata": {}, | |
"outputs": [], | |
"source": [ | |
"def get_capacity(mem=4096, cpu=2):\n", | |
" if mem <= 2048:\n", | |
" return 5.0\n", | |
" return 5 + ((mem / 1024) - 2) * 7" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 7, | |
"metadata": {}, | |
"outputs": [], | |
"source": [ | |
"mem_range = range(2048, 32768)\n", | |
"grow_chart = [get_capacity(mem=x) for x in mem_range] # Capacity per-gigabytes over the memory range\n", | |
"jobs_chart_5 = [max(1,int((x/6))) for x in grow_chart] # number of simultaneous 5-fork jobs" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 8, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"data": { | |
"image/png": "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\n", | |
"text/plain": [ | |
"<matplotlib.figure.Figure at 0x9842b50>" | |
] | |
}, | |
"metadata": {}, | |
"output_type": "display_data" | |
}, | |
{ | |
"data": { | |
"image/png": "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\n", | |
"text/plain": [ | |
"<matplotlib.figure.Figure at 0xa2eb310>" | |
] | |
}, | |
"metadata": {}, | |
"output_type": "display_data" | |
} | |
], | |
"source": [ | |
"plt.plot(mem_range, grow_chart, 'g')\n", | |
"plt.xlabel('mbytes memory')\n", | |
"plt.ylabel('shown capacity')\n", | |
"plt.show()\n", | |
"plt.plot(mem_range, jobs_chart_5)\n", | |
"plt.xlabel(\"mbytes memory\")\n", | |
"plt.ylabel(\"simultaneous jobs\")\n", | |
"plt.show()\n" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"## Analyzing ansible-playbook run behavior and memory usage\n", | |
"\n", | |
"In looking at typical Ansible runs we can see that forks hover in the 25MB - 40MB memory usage. The parent of the forks also seems to typically have around this much." | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"### valgrind - massif (parent process)\n", | |
"\n", | |
"```\n", | |
"--------------------------------------------------------------------------------\n", | |
"Command: /usr/bin/ansible -i localhost,foo,bar,bing all -c local -m shell -a sleep 5\n", | |
"Massif arguments: (none)\n", | |
"ms_print arguments: massif.out.662\n", | |
"--------------------------------------------------------------------------------\n", | |
"\n", | |
"\n", | |
" MB\n", | |
"27.31^ # \n", | |
" | @#:::::@:\n", | |
" | @:@#:::::@:\n", | |
" | : @:@#:::::@:\n", | |
" | @@::::@:@#:::::@:\n", | |
" | @@@ :@@:: :@:@#:::::@:\n", | |
" | :::::@@ :::::@@:: :@:@#:::::@:\n", | |
" | ::::::: ::@@ ::: : :@@:: :@:@#:::::@:\n", | |
" | :@@@: :: :: ::@@ ::: : :@@:: :@:@#:::::@:\n", | |
" | ::@@:@ @: :: :: ::@@ @@::: : :@@:: :@:@#:::::@:\n", | |
" | @::@:: @@:@ @: :: :: ::@@ @ ::: : :@@:: :@:@#:::::@:\n", | |
" | ::::@: @:: @@:@ @: :: :: ::@@ ::@ ::: : :@@:: :@:@#:::::@:\n", | |
" | @@::::: @: @:: @@:@ @: :: :: ::@@ :::@ ::: : :@@:: :@:@#:::::@:\n", | |
" | :::::@ ::::: @: @:: @@:@ @: :: :: ::@@ :::@ ::: : :@@:: :@:@#:::::@:\n", | |
" | :: ::@ ::::: @: @:: @@:@ @: :: :: ::@@ :::@ ::: : :@@:: :@:@#:::::@:\n", | |
" | @:: ::@ ::::: @: @:: @@:@ @: :: :: ::@@ :::@ ::: : :@@:: :@:@#:::::@:\n", | |
" | @:: ::@ ::::: @: @:: @@:@ @: :: :: ::@@ :::@ ::: : :@@:: :@:@#:::::@:\n", | |
" | :@:: ::@ ::::: @: @:: @@:@ @: :: :: ::@@ :::@ ::: : :@@:: :@:@#:::::@:\n", | |
" | ::@:: ::@ ::::: @: @:: @@:@ @: :: :: ::@@ :::@ ::: : :@@:: :@:@#:::::@:\n", | |
" | ::@:: ::@ ::::: @: @:: @@:@ @: :: :: ::@@ :::@ ::: : :@@:: :@:@#:::::@:\n", | |
" 0 +----------------------------------------------------------------------->Gi\n", | |
" 0 3.480\n", | |
"\n", | |
"Number of snapshots: 66\n", | |
" Detailed snapshots: [3, 8, 14, 16, 19, 20, 22, 23, 31, 32, 36, 42, 43, 47, 49, 50, 51, 52 (peak), 62]\n", | |
"\n", | |
"--------------------------------------------------------------------------------\n", | |
" n time(i) total(B) useful-heap(B) extra-heap(B) stacks(B)\n", | |
"--------------------------------------------------------------------------------\n", | |
" 0 0 0 0 0 0\n", | |
" 1 67,644,245 3,475,664 3,161,038 314,626 0\n", | |
" 2 123,861,379 5,395,040 4,962,463 432,577 0\n", | |
" 3 193,072,538 7,691,664 6,987,949 703,715 0\n", | |
"...\n", | |
"--------------------------------------------------------------------------------\n", | |
" n time(i) total(B) useful-heap(B) extra-heap(B) stacks(B)\n", | |
"--------------------------------------------------------------------------------\n", | |
" 61 3,609,926,526 28,600,328 26,141,617 2,458,711 0\n", | |
" 62 3,639,714,345 28,602,792 26,143,633 2,459,159 0\n", | |
" 63 3,669,502,245 28,605,256 26,145,649 2,459,607 0\n", | |
" 64 3,699,301,974 28,603,888 26,144,577 2,459,311 0\n", | |
" 65 3,736,563,442 28,600,544 26,143,774 2,456,770 0\n", | |
"```" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"### valgrind - massif (fork-1)\n", | |
"\n", | |
"```\n", | |
"--------------------------------------------------------------------------------\n", | |
"Command: /usr/bin/ansible -i localhost,foo,bar,bing all -c local -m shell -a sleep 5\n", | |
"Massif arguments: (none)\n", | |
"ms_print arguments: massif.out.670\n", | |
"--------------------------------------------------------------------------------\n", | |
"\n", | |
"\n", | |
" MB\n", | |
"34.52^ # \n", | |
" | @ #:\n", | |
" | @ ::::@#:\n", | |
" | @:::::@#:\n", | |
" | @@:::::@#:\n", | |
" | @@@:::::@#:\n", | |
" | @:@@@:::::@#:\n", | |
" | : :@:@@@:::::@#:\n", | |
" | @@ @@::::@:@@@:::::@#:\n", | |
" | ::::::@@ ::::@@:: :@:@@@:::::@#:\n", | |
" | @::::: ::: @@ ::::: :@@:: :@:@@@:::::@#:\n", | |
" | @@:@@@: ::: ::: @@ @:: :: :@@:: :@:@@@:::::@#:\n", | |
" | :@:::@@:@ @: ::: ::: @@ @:: :: :@@:: :@:@@@:::::@#:\n", | |
" | :::::@@:@:: @@:@ @: ::: ::: @@ :::@:: :: :@@:: :@:@@@:::::@#:\n", | |
" | ::@@:: :::@ :@:: @@:@ @: ::: ::: @@::: @:: :: :@@:: :@:@@@:::::@#:\n", | |
" | ::::@ :: :::@ :@:: @@:@ @: ::: ::: @@::: @:: :: :@@:: :@:@@@:::::@#:\n", | |
" | @::::@ :: :::@ :@:: @@:@ @: ::: ::: @@::: @:: :: :@@:: :@:@@@:::::@#:\n", | |
" | @::::@ :: :::@ :@:: @@:@ @: ::: ::: @@::: @:: :: :@@:: :@:@@@:::::@#:\n", | |
" | :@::::@ :: :::@ :@:: @@:@ @: ::: ::: @@::: @:: :: :@@:: :@:@@@:::::@#:\n", | |
" | ::@::::@ :: :::@ :@:: @@:@ @: ::: ::: @@::: @:: :: :@@:: :@:@@@:::::@#:\n", | |
" 0 +----------------------------------------------------------------------->Gi\n", | |
" 0 3.603\n", | |
"\n", | |
"Number of snapshots: 75\n", | |
" Detailed snapshots: [3, 8, 14, 16, 19, 20, 22, 23, 31, 32, 36, 42, 43, 47, 49, 50, 51, 53, 54, 56, 58, 59, 69, 71 (peak)]\n", | |
"\n", | |
"--------------------------------------------------------------------------------\n", | |
" n time(i) total(B) useful-heap(B) extra-heap(B) stacks(B)\n", | |
"--------------------------------------------------------------------------------\n", | |
" 0 0 0 0 0 0\n", | |
" 1 67,644,245 3,475,664 3,161,038 314,626 0\n", | |
" 2 123,861,379 5,395,040 4,962,463 432,577 0\n", | |
" 3 193,072,538 7,691,664 6,987,949 703,715 0\n", | |
"...\n", | |
"--------------------------------------------------------------------------------\n", | |
" n time(i) total(B) useful-heap(B) extra-heap(B) stacks(B)\n", | |
"--------------------------------------------------------------------------------\n", | |
" 70 3,765,509,072 34,403,160 31,516,692 2,886,468 0\n", | |
" 71 3,778,388,676 36,193,752 32,844,014 3,349,738 0\n", | |
" 72 3,808,176,489 35,776,744 32,788,856 2,987,888 0\n", | |
" 73 3,837,965,928 35,776,352 32,788,466 2,987,886 0\n", | |
" 74 3,868,367,424 29,669,456 26,997,450 2,672,006 0\n", | |
"```" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"### Working with fixed memory based forks capacity" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 21, | |
"metadata": {}, | |
"outputs": [], | |
"source": [ | |
"mem_mbytes = 4096\n", | |
"# 70MB per fork\n", | |
"per_fork_mbytes = 100" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 66, | |
"metadata": {}, | |
"outputs": [], | |
"source": [ | |
"def new_capacity(mem_mbytes=mem_mbytes, per_fork_mbytes=per_fork_mbytes):\n", | |
" if mem_mbytes <= 2048:\n", | |
" return 1\n", | |
" return max(1, ( mem_mbytes-2048 ) / per_fork_mbytes)" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"Fork Capacity of a 4G system" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 31, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"data": { | |
"text/plain": [ | |
"20" | |
] | |
}, | |
"execution_count": 31, | |
"metadata": {}, | |
"output_type": "execute_result" | |
} | |
], | |
"source": [ | |
"# fork impact == 10\n", | |
"get_old_capacity(4096) / 10" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 46, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"data": { | |
"text/plain": [ | |
"20" | |
] | |
}, | |
"execution_count": 46, | |
"metadata": {}, | |
"output_type": "execute_result" | |
} | |
], | |
"source": [ | |
"# if per_fork cost is as above\n", | |
"new_capacity(4096, 100)" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 47, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"data": { | |
"text/plain": [ | |
"1" | |
] | |
}, | |
"execution_count": 47, | |
"metadata": {}, | |
"output_type": "execute_result" | |
} | |
], | |
"source": [ | |
"# if we reserve 2G of memory for other things\n", | |
"new_capacity(2048, 100)" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"...8G system" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 68, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"data": { | |
"text/plain": [ | |
"50" | |
] | |
}, | |
"execution_count": 68, | |
"metadata": {}, | |
"output_type": "execute_result" | |
} | |
], | |
"source": [ | |
"get_old_capacity(8192) / 10" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 67, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"data": { | |
"text/plain": [ | |
"61" | |
] | |
}, | |
"execution_count": 67, | |
"metadata": {}, | |
"output_type": "execute_result" | |
} | |
], | |
"source": [ | |
"new_capacity(8192, 100)" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 65, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"data": { | |
"text/plain": [ | |
"8" | |
] | |
}, | |
"execution_count": 65, | |
"metadata": {}, | |
"output_type": "execute_result" | |
} | |
], | |
"source": [ | |
"new_capacity(2900, 100)" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"## Algorithm Adjustment between Memory and CPU as an upper and lower bound relative to a percentage (represented as a number between 0 and 1)" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 1, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"name": "stdout", | |
"output_type": "stream", | |
"text": [ | |
"half: 13.0\n" | |
] | |
} | |
], | |
"source": [ | |
"cpu_forks = 8\n", | |
"mem_forks = 18\n", | |
"# 50 percent\n", | |
"half_scale = (mem_forks - cpu_forks) * 0.5\n", | |
"print(\"half: {}\".format(cpu_forks + half_scale))" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": null, | |
"metadata": {}, | |
"outputs": [], | |
"source": [] | |
} | |
], | |
"metadata": { | |
"kernelspec": { | |
"display_name": "Django Shell-Plus", | |
"language": "python", | |
"name": "django_extensions" | |
}, | |
"language_info": { | |
"codemirror_mode": { | |
"name": "ipython", | |
"version": 2 | |
}, | |
"file_extension": ".py", | |
"mimetype": "text/x-python", | |
"name": "python", | |
"nbconvert_exporter": "python", | |
"pygments_lexer": "ipython2", | |
"version": "2.7.5" | |
} | |
}, | |
"nbformat": 4, | |
"nbformat_minor": 2 | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment