amps-python-client 5.3.4.1__zip

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (550) hide show
  1. amps-python-client-5.3.4.1/HISTORY +7 -0
  2. amps-python-client-5.3.4.1/LICENSE +157 -0
  3. amps-python-client-5.3.4.1/PKG-INFO +112 -0
  4. amps-python-client-5.3.4.1/README.md +96 -0
  5. amps-python-client-5.3.4.1/docs/command-reference/doctrees/chapters/ack-messages.doctree +0 -0
  6. amps-python-client-5.3.4.1/docs/command-reference/doctrees/chapters/content-messages.doctree +0 -0
  7. amps-python-client-5.3.4.1/docs/command-reference/doctrees/chapters/intro.doctree +0 -0
  8. amps-python-client-5.3.4.1/docs/command-reference/doctrees/chapters/logon.doctree +0 -0
  9. amps-python-client-5.3.4.1/docs/command-reference/doctrees/chapters/protocol-reference.doctree +0 -0
  10. amps-python-client-5.3.4.1/docs/command-reference/doctrees/chapters/publishing.doctree +0 -0
  11. amps-python-client-5.3.4.1/docs/command-reference/doctrees/chapters/query-delimiters.doctree +0 -0
  12. amps-python-client-5.3.4.1/docs/command-reference/doctrees/chapters/query-subscribe.doctree +0 -0
  13. amps-python-client-5.3.4.1/docs/command-reference/doctrees/chapters/removing.doctree +0 -0
  14. amps-python-client-5.3.4.1/docs/command-reference/doctrees/chapters/utilities.doctree +0 -0
  15. amps-python-client-5.3.4.1/docs/command-reference/doctrees/environment.pickle +0 -0
  16. amps-python-client-5.3.4.1/docs/command-reference/doctrees/index.doctree +0 -0
  17. amps-python-client-5.3.4.1/docs/command-reference/html/.buildinfo +4 -0
  18. amps-python-client-5.3.4.1/docs/command-reference/html/_images/caution.svg +25 -0
  19. amps-python-client-5.3.4.1/docs/command-reference/html/_sources/chapters/ack-messages.rst.txt +32 -0
  20. amps-python-client-5.3.4.1/docs/command-reference/html/_sources/chapters/content-messages.rst.txt +27 -0
  21. amps-python-client-5.3.4.1/docs/command-reference/html/_sources/chapters/intro.rst.txt +43 -0
  22. amps-python-client-5.3.4.1/docs/command-reference/html/_sources/chapters/logon.rst.txt +231 -0
  23. amps-python-client-5.3.4.1/docs/command-reference/html/_sources/chapters/protocol-reference.rst.txt +1474 -0
  24. amps-python-client-5.3.4.1/docs/command-reference/html/_sources/chapters/publishing.rst.txt +25 -0
  25. amps-python-client-5.3.4.1/docs/command-reference/html/_sources/chapters/query-delimiters.rst.txt +12 -0
  26. amps-python-client-5.3.4.1/docs/command-reference/html/_sources/chapters/query-subscribe.rst.txt +23 -0
  27. amps-python-client-5.3.4.1/docs/command-reference/html/_sources/chapters/removing.rst.txt +6 -0
  28. amps-python-client-5.3.4.1/docs/command-reference/html/_sources/chapters/utilities.rst.txt +13 -0
  29. amps-python-client-5.3.4.1/docs/command-reference/html/_sources/index.rst.txt +56 -0
  30. amps-python-client-5.3.4.1/docs/command-reference/html/_static/ajax-loader.gif +0 -0
  31. amps-python-client-5.3.4.1/docs/command-reference/html/_static/alabaster.css +699 -0
  32. amps-python-client-5.3.4.1/docs/command-reference/html/_static/basic.css +632 -0
  33. amps-python-client-5.3.4.1/docs/command-reference/html/_static/comment-bright.png +0 -0
  34. amps-python-client-5.3.4.1/docs/command-reference/html/_static/comment-close.png +0 -0
  35. amps-python-client-5.3.4.1/docs/command-reference/html/_static/comment.png +0 -0
  36. amps-python-client-5.3.4.1/docs/command-reference/html/_static/custom.css +192 -0
  37. amps-python-client-5.3.4.1/docs/command-reference/html/_static/custom.css.backup +161 -0
  38. amps-python-client-5.3.4.1/docs/command-reference/html/_static/doctools.js +287 -0
  39. amps-python-client-5.3.4.1/docs/command-reference/html/_static/down-pressed.png +0 -0
  40. amps-python-client-5.3.4.1/docs/command-reference/html/_static/down.png +0 -0
  41. amps-python-client-5.3.4.1/docs/command-reference/html/_static/file.png +0 -0
  42. amps-python-client-5.3.4.1/docs/command-reference/html/_static/flag_logo.png +0 -0
  43. amps-python-client-5.3.4.1/docs/command-reference/html/_static/flag_logo.svg +153 -0
  44. amps-python-client-5.3.4.1/docs/command-reference/html/_static/jquery-3.1.0.js +10074 -0
  45. amps-python-client-5.3.4.1/docs/command-reference/html/_static/jquery.js +4 -0
  46. amps-python-client-5.3.4.1/docs/command-reference/html/_static/minus.png +0 -0
  47. amps-python-client-5.3.4.1/docs/command-reference/html/_static/plus.png +0 -0
  48. amps-python-client-5.3.4.1/docs/command-reference/html/_static/pygments.css +74 -0
  49. amps-python-client-5.3.4.1/docs/command-reference/html/_static/searchtools.js +758 -0
  50. amps-python-client-5.3.4.1/docs/command-reference/html/_static/underscore-1.3.1.js +999 -0
  51. amps-python-client-5.3.4.1/docs/command-reference/html/_static/underscore.js +31 -0
  52. amps-python-client-5.3.4.1/docs/command-reference/html/_static/up-pressed.png +0 -0
  53. amps-python-client-5.3.4.1/docs/command-reference/html/_static/up.png +0 -0
  54. amps-python-client-5.3.4.1/docs/command-reference/html/_static/websupport.js +808 -0
  55. amps-python-client-5.3.4.1/docs/command-reference/html/chapters/ack-messages.html +417 -0
  56. amps-python-client-5.3.4.1/docs/command-reference/html/chapters/content-messages.html +417 -0
  57. amps-python-client-5.3.4.1/docs/command-reference/html/chapters/intro.html +126 -0
  58. amps-python-client-5.3.4.1/docs/command-reference/html/chapters/logon.html +295 -0
  59. amps-python-client-5.3.4.1/docs/command-reference/html/chapters/protocol-reference.html +1190 -0
  60. amps-python-client-5.3.4.1/docs/command-reference/html/chapters/publishing.html +436 -0
  61. amps-python-client-5.3.4.1/docs/command-reference/html/chapters/query-delimiters.html +173 -0
  62. amps-python-client-5.3.4.1/docs/command-reference/html/chapters/query-subscribe.html +2123 -0
  63. amps-python-client-5.3.4.1/docs/command-reference/html/chapters/removing.html +299 -0
  64. amps-python-client-5.3.4.1/docs/command-reference/html/chapters/utilities.html +287 -0
  65. amps-python-client-5.3.4.1/docs/command-reference/html/genindex.html +97 -0
  66. amps-python-client-5.3.4.1/docs/command-reference/html/index.html +138 -0
  67. amps-python-client-5.3.4.1/docs/command-reference/html/objects.inv +0 -0
  68. amps-python-client-5.3.4.1/docs/command-reference/html/search.html +107 -0
  69. amps-python-client-5.3.4.1/docs/command-reference/html/searchindex.js +1 -0
  70. amps-python-client-5.3.4.1/docs/html/.buildinfo +4 -0
  71. amps-python-client-5.3.4.1/docs/html/_sources/code.rst.txt +6 -0
  72. amps-python-client-5.3.4.1/docs/html/_sources/index.rst.txt +29 -0
  73. amps-python-client-5.3.4.1/docs/html/_static/ajax-loader.gif +0 -0
  74. amps-python-client-5.3.4.1/docs/html/_static/basic.css +632 -0
  75. amps-python-client-5.3.4.1/docs/html/_static/classic.css +261 -0
  76. amps-python-client-5.3.4.1/docs/html/_static/comment-bright.png +0 -0
  77. amps-python-client-5.3.4.1/docs/html/_static/comment-close.png +0 -0
  78. amps-python-client-5.3.4.1/docs/html/_static/comment.png +0 -0
  79. amps-python-client-5.3.4.1/docs/html/_static/default.css +1 -0
  80. amps-python-client-5.3.4.1/docs/html/_static/doctools.js +287 -0
  81. amps-python-client-5.3.4.1/docs/html/_static/down-pressed.png +0 -0
  82. amps-python-client-5.3.4.1/docs/html/_static/down.png +0 -0
  83. amps-python-client-5.3.4.1/docs/html/_static/file.png +0 -0
  84. amps-python-client-5.3.4.1/docs/html/_static/jquery-3.1.0.js +10074 -0
  85. amps-python-client-5.3.4.1/docs/html/_static/jquery.js +4 -0
  86. amps-python-client-5.3.4.1/docs/html/_static/minus.png +0 -0
  87. amps-python-client-5.3.4.1/docs/html/_static/plus.png +0 -0
  88. amps-python-client-5.3.4.1/docs/html/_static/pygments.css +74 -0
  89. amps-python-client-5.3.4.1/docs/html/_static/searchtools.js +758 -0
  90. amps-python-client-5.3.4.1/docs/html/_static/sidebar.js +159 -0
  91. amps-python-client-5.3.4.1/docs/html/_static/underscore-1.3.1.js +999 -0
  92. amps-python-client-5.3.4.1/docs/html/_static/underscore.js +31 -0
  93. amps-python-client-5.3.4.1/docs/html/_static/up-pressed.png +0 -0
  94. amps-python-client-5.3.4.1/docs/html/_static/up.png +0 -0
  95. amps-python-client-5.3.4.1/docs/html/_static/websupport.js +808 -0
  96. amps-python-client-5.3.4.1/docs/html/code.html +6503 -0
  97. amps-python-client-5.3.4.1/docs/html/genindex.html +1361 -0
  98. amps-python-client-5.3.4.1/docs/html/index.html +131 -0
  99. amps-python-client-5.3.4.1/docs/html/objects.inv +0 -0
  100. amps-python-client-5.3.4.1/docs/html/py-modindex.html +111 -0
  101. amps-python-client-5.3.4.1/docs/html/search.html +107 -0
  102. amps-python-client-5.3.4.1/docs/html/searchindex.js +1 -0
  103. amps-python-client-5.3.4.1/docs/python/doctrees/chapters/advanced-topics.doctree +0 -0
  104. amps-python-client-5.3.4.1/docs/python/doctrees/chapters/cpp-compiler-list.doctree +0 -0
  105. amps-python-client-5.3.4.1/docs/python/doctrees/chapters/cpp-feature-table.doctree +0 -0
  106. amps-python-client-5.3.4.1/docs/python/doctrees/chapters/creating-commands.doctree +0 -0
  107. amps-python-client-5.3.4.1/docs/python/doctrees/chapters/deltas.doctree +0 -0
  108. amps-python-client-5.3.4.1/docs/python/doctrees/chapters/error-handling.doctree +0 -0
  109. amps-python-client-5.3.4.1/docs/python/doctrees/chapters/exceptions.doctree +0 -0
  110. amps-python-client-5.3.4.1/docs/python/doctrees/chapters/first-program.doctree +0 -0
  111. amps-python-client-5.3.4.1/docs/python/doctrees/chapters/high-availability.doctree +0 -0
  112. amps-python-client-5.3.4.1/docs/python/doctrees/chapters/installing.doctree +0 -0
  113. amps-python-client-5.3.4.1/docs/python/doctrees/chapters/introduction.doctree +0 -0
  114. amps-python-client-5.3.4.1/docs/python/doctrees/chapters/moving-from-python-lite.doctree +0 -0
  115. amps-python-client-5.3.4.1/docs/python/doctrees/chapters/performance-tips.doctree +0 -0
  116. amps-python-client-5.3.4.1/docs/python/doctrees/chapters/queues.doctree +0 -0
  117. amps-python-client-5.3.4.1/docs/python/doctrees/chapters/sow.doctree +0 -0
  118. amps-python-client-5.3.4.1/docs/python/doctrees/chapters/subscriptions.doctree +0 -0
  119. amps-python-client-5.3.4.1/docs/python/doctrees/chapters/utilities.doctree +0 -0
  120. amps-python-client-5.3.4.1/docs/python/doctrees/environment.pickle +0 -0
  121. amps-python-client-5.3.4.1/docs/python/doctrees/index.doctree +0 -0
  122. amps-python-client-5.3.4.1/docs/python/html/.buildinfo +4 -0
  123. amps-python-client-5.3.4.1/docs/python/html/_images/caution.png +0 -0
  124. amps-python-client-5.3.4.1/docs/python/html/_images/caution.svg +25 -0
  125. amps-python-client-5.3.4.1/docs/python/html/_images/connection_string.svg +461 -0
  126. amps-python-client-5.3.4.1/docs/python/html/_images/important.png +0 -0
  127. amps-python-client-5.3.4.1/docs/python/html/_images/important.svg +25 -0
  128. amps-python-client-5.3.4.1/docs/python/html/_images/tip.png +0 -0
  129. amps-python-client-5.3.4.1/docs/python/html/_images/tip.svg +31 -0
  130. amps-python-client-5.3.4.1/docs/python/html/_images/warning.png +0 -0
  131. amps-python-client-5.3.4.1/docs/python/html/_sources/chapters/advanced-topics.rst.txt +398 -0
  132. amps-python-client-5.3.4.1/docs/python/html/_sources/chapters/cpp-compiler-list.rst.txt +6 -0
  133. amps-python-client-5.3.4.1/docs/python/html/_sources/chapters/cpp-feature-table.rst.txt +26 -0
  134. amps-python-client-5.3.4.1/docs/python/html/_sources/chapters/creating-commands.rst.txt +159 -0
  135. amps-python-client-5.3.4.1/docs/python/html/_sources/chapters/deltas.rst.txt +79 -0
  136. amps-python-client-5.3.4.1/docs/python/html/_sources/chapters/error-handling.rst.txt +482 -0
  137. amps-python-client-5.3.4.1/docs/python/html/_sources/chapters/exceptions.rst.txt +128 -0
  138. amps-python-client-5.3.4.1/docs/python/html/_sources/chapters/first-program.rst.txt +142 -0
  139. amps-python-client-5.3.4.1/docs/python/html/_sources/chapters/high-availability.rst.txt +876 -0
  140. amps-python-client-5.3.4.1/docs/python/html/_sources/chapters/installing.rst.txt +184 -0
  141. amps-python-client-5.3.4.1/docs/python/html/_sources/chapters/introduction.rst.txt +50 -0
  142. amps-python-client-5.3.4.1/docs/python/html/_sources/chapters/moving-from-python-lite.rst.txt +32 -0
  143. amps-python-client-5.3.4.1/docs/python/html/_sources/chapters/performance-tips.rst.txt +434 -0
  144. amps-python-client-5.3.4.1/docs/python/html/_sources/chapters/queues.rst.txt +282 -0
  145. amps-python-client-5.3.4.1/docs/python/html/_sources/chapters/sow.rst.txt +292 -0
  146. amps-python-client-5.3.4.1/docs/python/html/_sources/chapters/subscriptions.rst.txt +374 -0
  147. amps-python-client-5.3.4.1/docs/python/html/_sources/chapters/utilities.rst.txt +214 -0
  148. amps-python-client-5.3.4.1/docs/python/html/_sources/index.rst.txt +44 -0
  149. amps-python-client-5.3.4.1/docs/python/html/_static/ajax-loader.gif +0 -0
  150. amps-python-client-5.3.4.1/docs/python/html/_static/alabaster.css +699 -0
  151. amps-python-client-5.3.4.1/docs/python/html/_static/basic.css +632 -0
  152. amps-python-client-5.3.4.1/docs/python/html/_static/comment-bright.png +0 -0
  153. amps-python-client-5.3.4.1/docs/python/html/_static/comment-close.png +0 -0
  154. amps-python-client-5.3.4.1/docs/python/html/_static/comment.png +0 -0
  155. amps-python-client-5.3.4.1/docs/python/html/_static/custom.css +192 -0
  156. amps-python-client-5.3.4.1/docs/python/html/_static/custom.css.backup +161 -0
  157. amps-python-client-5.3.4.1/docs/python/html/_static/doctools.js +287 -0
  158. amps-python-client-5.3.4.1/docs/python/html/_static/down-pressed.png +0 -0
  159. amps-python-client-5.3.4.1/docs/python/html/_static/down.png +0 -0
  160. amps-python-client-5.3.4.1/docs/python/html/_static/file.png +0 -0
  161. amps-python-client-5.3.4.1/docs/python/html/_static/flag_logo.png +0 -0
  162. amps-python-client-5.3.4.1/docs/python/html/_static/flag_logo.svg +153 -0
  163. amps-python-client-5.3.4.1/docs/python/html/_static/jquery-3.1.0.js +10074 -0
  164. amps-python-client-5.3.4.1/docs/python/html/_static/jquery.js +4 -0
  165. amps-python-client-5.3.4.1/docs/python/html/_static/minus.png +0 -0
  166. amps-python-client-5.3.4.1/docs/python/html/_static/plus.png +0 -0
  167. amps-python-client-5.3.4.1/docs/python/html/_static/pygments.css +74 -0
  168. amps-python-client-5.3.4.1/docs/python/html/_static/searchtools.js +758 -0
  169. amps-python-client-5.3.4.1/docs/python/html/_static/underscore-1.3.1.js +999 -0
  170. amps-python-client-5.3.4.1/docs/python/html/_static/underscore.js +31 -0
  171. amps-python-client-5.3.4.1/docs/python/html/_static/up-pressed.png +0 -0
  172. amps-python-client-5.3.4.1/docs/python/html/_static/up.png +0 -0
  173. amps-python-client-5.3.4.1/docs/python/html/_static/websupport.js +808 -0
  174. amps-python-client-5.3.4.1/docs/python/html/chapters/advanced-topics.html +447 -0
  175. amps-python-client-5.3.4.1/docs/python/html/chapters/cpp-compiler-list.html +92 -0
  176. amps-python-client-5.3.4.1/docs/python/html/chapters/cpp-feature-table.html +156 -0
  177. amps-python-client-5.3.4.1/docs/python/html/chapters/creating-commands.html +2837 -0
  178. amps-python-client-5.3.4.1/docs/python/html/chapters/deltas.html +169 -0
  179. amps-python-client-5.3.4.1/docs/python/html/chapters/error-handling.html +746 -0
  180. amps-python-client-5.3.4.1/docs/python/html/chapters/exceptions.html +272 -0
  181. amps-python-client-5.3.4.1/docs/python/html/chapters/first-program.html +499 -0
  182. amps-python-client-5.3.4.1/docs/python/html/chapters/high-availability.html +1014 -0
  183. amps-python-client-5.3.4.1/docs/python/html/chapters/installing.html +264 -0
  184. amps-python-client-5.3.4.1/docs/python/html/chapters/introduction.html +245 -0
  185. amps-python-client-5.3.4.1/docs/python/html/chapters/moving-from-python-lite.html +118 -0
  186. amps-python-client-5.3.4.1/docs/python/html/chapters/performance-tips.html +499 -0
  187. amps-python-client-5.3.4.1/docs/python/html/chapters/queues.html +352 -0
  188. amps-python-client-5.3.4.1/docs/python/html/chapters/sow.html +381 -0
  189. amps-python-client-5.3.4.1/docs/python/html/chapters/subscriptions.html +535 -0
  190. amps-python-client-5.3.4.1/docs/python/html/chapters/utilities.html +302 -0
  191. amps-python-client-5.3.4.1/docs/python/html/genindex.html +351 -0
  192. amps-python-client-5.3.4.1/docs/python/html/index.html +380 -0
  193. amps-python-client-5.3.4.1/docs/python/html/objects.inv +0 -0
  194. amps-python-client-5.3.4.1/docs/python/html/search.html +107 -0
  195. amps-python-client-5.3.4.1/docs/python/html/searchindex.js +1 -0
  196. amps-python-client-5.3.4.1/docs/python-quickstart/doctrees/chapters/crankitup.doctree +0 -0
  197. amps-python-client-5.3.4.1/docs/python-quickstart/doctrees/chapters/equipment.doctree +0 -0
  198. amps-python-client-5.3.4.1/docs/python-quickstart/doctrees/environment.pickle +0 -0
  199. amps-python-client-5.3.4.1/docs/python-quickstart/doctrees/index.doctree +0 -0
  200. amps-python-client-5.3.4.1/docs/python-quickstart/html/.buildinfo +4 -0
  201. amps-python-client-5.3.4.1/docs/python-quickstart/html/_sources/chapters/crankitup.rst.txt +155 -0
  202. amps-python-client-5.3.4.1/docs/python-quickstart/html/_sources/chapters/equipment.rst.txt +19 -0
  203. amps-python-client-5.3.4.1/docs/python-quickstart/html/_sources/index.rst.txt +20 -0
  204. amps-python-client-5.3.4.1/docs/python-quickstart/html/_static/ajax-loader.gif +0 -0
  205. amps-python-client-5.3.4.1/docs/python-quickstart/html/_static/alabaster.css +699 -0
  206. amps-python-client-5.3.4.1/docs/python-quickstart/html/_static/basic.css +632 -0
  207. amps-python-client-5.3.4.1/docs/python-quickstart/html/_static/comment-bright.png +0 -0
  208. amps-python-client-5.3.4.1/docs/python-quickstart/html/_static/comment-close.png +0 -0
  209. amps-python-client-5.3.4.1/docs/python-quickstart/html/_static/comment.png +0 -0
  210. amps-python-client-5.3.4.1/docs/python-quickstart/html/_static/custom.css +192 -0
  211. amps-python-client-5.3.4.1/docs/python-quickstart/html/_static/custom.css.backup +161 -0
  212. amps-python-client-5.3.4.1/docs/python-quickstart/html/_static/doctools.js +287 -0
  213. amps-python-client-5.3.4.1/docs/python-quickstart/html/_static/down-pressed.png +0 -0
  214. amps-python-client-5.3.4.1/docs/python-quickstart/html/_static/down.png +0 -0
  215. amps-python-client-5.3.4.1/docs/python-quickstart/html/_static/file.png +0 -0
  216. amps-python-client-5.3.4.1/docs/python-quickstart/html/_static/flag_logo.png +0 -0
  217. amps-python-client-5.3.4.1/docs/python-quickstart/html/_static/flag_logo.svg +153 -0
  218. amps-python-client-5.3.4.1/docs/python-quickstart/html/_static/jquery-3.1.0.js +10074 -0
  219. amps-python-client-5.3.4.1/docs/python-quickstart/html/_static/jquery.js +4 -0
  220. amps-python-client-5.3.4.1/docs/python-quickstart/html/_static/minus.png +0 -0
  221. amps-python-client-5.3.4.1/docs/python-quickstart/html/_static/plus.png +0 -0
  222. amps-python-client-5.3.4.1/docs/python-quickstart/html/_static/pygments.css +74 -0
  223. amps-python-client-5.3.4.1/docs/python-quickstart/html/_static/searchtools.js +758 -0
  224. amps-python-client-5.3.4.1/docs/python-quickstart/html/_static/underscore-1.3.1.js +999 -0
  225. amps-python-client-5.3.4.1/docs/python-quickstart/html/_static/underscore.js +31 -0
  226. amps-python-client-5.3.4.1/docs/python-quickstart/html/_static/up-pressed.png +0 -0
  227. amps-python-client-5.3.4.1/docs/python-quickstart/html/_static/up.png +0 -0
  228. amps-python-client-5.3.4.1/docs/python-quickstart/html/_static/websupport.js +808 -0
  229. amps-python-client-5.3.4.1/docs/python-quickstart/html/chapters/crankitup.html +271 -0
  230. amps-python-client-5.3.4.1/docs/python-quickstart/html/chapters/equipment.html +105 -0
  231. amps-python-client-5.3.4.1/docs/python-quickstart/html/genindex.html +97 -0
  232. amps-python-client-5.3.4.1/docs/python-quickstart/html/index.html +382 -0
  233. amps-python-client-5.3.4.1/docs/python-quickstart/html/objects.inv +0 -0
  234. amps-python-client-5.3.4.1/docs/python-quickstart/html/search.html +107 -0
  235. amps-python-client-5.3.4.1/docs/python-quickstart/html/searchindex.js +1 -0
  236. amps-python-client-5.3.4.1/docs/resources/custom.css +9 -0
  237. amps-python-client-5.3.4.1/docs/resources/flag_logo.svg +153 -0
  238. amps-python-client-5.3.4.1/docs/user-guide/doctrees/chapters/acks.doctree +0 -0
  239. amps-python-client-5.3.4.1/docs/user-guide/doctrees/chapters/actions.doctree +0 -0
  240. amps-python-client-5.3.4.1/docs/user-guide/doctrees/chapters/amps-statistics.doctree +0 -0
  241. amps-python-client-5.3.4.1/docs/user-guide/doctrees/chapters/amps_expressions.doctree +0 -0
  242. amps-python-client-5.3.4.1/docs/user-guide/doctrees/chapters/amps_functions.doctree +0 -0
  243. amps-python-client-5.3.4.1/docs/user-guide/doctrees/chapters/auxiliary_modules.doctree +0 -0
  244. amps-python-client-5.3.4.1/docs/user-guide/doctrees/chapters/config-file-shortcuts.doctree +0 -0
  245. amps-python-client-5.3.4.1/docs/user-guide/doctrees/chapters/conflated_topics.doctree +0 -0
  246. amps-python-client-5.3.4.1/docs/user-guide/doctrees/chapters/constructing-fields.doctree +0 -0
  247. amps-python-client-5.3.4.1/docs/user-guide/doctrees/chapters/daemon.doctree +0 -0
  248. amps-python-client-5.3.4.1/docs/user-guide/doctrees/chapters/delta.doctree +0 -0
  249. amps-python-client-5.3.4.1/docs/user-guide/doctrees/chapters/distribution.doctree +0 -0
  250. amps-python-client-5.3.4.1/docs/user-guide/doctrees/chapters/enrichment.doctree +0 -0
  251. amps-python-client-5.3.4.1/docs/user-guide/doctrees/chapters/events.doctree +0 -0
  252. amps-python-client-5.3.4.1/docs/user-guide/doctrees/chapters/file_format_versions.doctree +0 -0
  253. amps-python-client-5.3.4.1/docs/user-guide/doctrees/chapters/glossary.doctree +0 -0
  254. amps-python-client-5.3.4.1/docs/user-guide/doctrees/chapters/ha.doctree +0 -0
  255. amps-python-client-5.3.4.1/docs/user-guide/doctrees/chapters/installing_and_starting.doctree +0 -0
  256. amps-python-client-5.3.4.1/docs/user-guide/doctrees/chapters/intro.doctree +0 -0
  257. amps-python-client-5.3.4.1/docs/user-guide/doctrees/chapters/logging.doctree +0 -0
  258. amps-python-client-5.3.4.1/docs/user-guide/doctrees/chapters/messageTypes.doctree +0 -0
  259. amps-python-client-5.3.4.1/docs/user-guide/doctrees/chapters/monitoring.doctree +0 -0
  260. amps-python-client-5.3.4.1/docs/user-guide/doctrees/chapters/oof.doctree +0 -0
  261. amps-python-client-5.3.4.1/docs/user-guide/doctrees/chapters/operation.doctree +0 -0
  262. amps-python-client-5.3.4.1/docs/user-guide/doctrees/chapters/pub_sub.doctree +0 -0
  263. amps-python-client-5.3.4.1/docs/user-guide/doctrees/chapters/queues.doctree +0 -0
  264. amps-python-client-5.3.4.1/docs/user-guide/doctrees/chapters/replication.doctree +0 -0
  265. amps-python-client-5.3.4.1/docs/user-guide/doctrees/chapters/securing.doctree +0 -0
  266. amps-python-client-5.3.4.1/docs/user-guide/doctrees/chapters/sow.doctree +0 -0
  267. amps-python-client-5.3.4.1/docs/user-guide/doctrees/chapters/sow_queries.doctree +0 -0
  268. amps-python-client-5.3.4.1/docs/user-guide/doctrees/chapters/spark.doctree +0 -0
  269. amps-python-client-5.3.4.1/docs/user-guide/doctrees/chapters/transports.doctree +0 -0
  270. amps-python-client-5.3.4.1/docs/user-guide/doctrees/chapters/troubleshooting.doctree +0 -0
  271. amps-python-client-5.3.4.1/docs/user-guide/doctrees/chapters/txlog.doctree +0 -0
  272. amps-python-client-5.3.4.1/docs/user-guide/doctrees/chapters/usecases.doctree +0 -0
  273. amps-python-client-5.3.4.1/docs/user-guide/doctrees/chapters/utilities.doctree +0 -0
  274. amps-python-client-5.3.4.1/docs/user-guide/doctrees/chapters/views.doctree +0 -0
  275. amps-python-client-5.3.4.1/docs/user-guide/doctrees/environment.pickle +0 -0
  276. amps-python-client-5.3.4.1/docs/user-guide/doctrees/index.doctree +0 -0
  277. amps-python-client-5.3.4.1/docs/user-guide/html/.buildinfo +4 -0
  278. amps-python-client-5.3.4.1/docs/user-guide/html/_images/AMPS-Queues-Intro.svg +1330 -0
  279. amps-python-client-5.3.4.1/docs/user-guide/html/_images/GeoRepl.png +0 -0
  280. amps-python-client-5.3.4.1/docs/user-guide/html/_images/HA_async_ack.png +0 -0
  281. amps-python-client-5.3.4.1/docs/user-guide/html/_images/HA_sync_ack.png +0 -0
  282. amps-python-client-5.3.4.1/docs/user-guide/html/_images/Hot-Hot-Replication.png +0 -0
  283. amps-python-client-5.3.4.1/docs/user-guide/html/_images/MessageOrdering.svg +235 -0
  284. amps-python-client-5.3.4.1/docs/user-guide/html/_images/OOF5.png +0 -0
  285. amps-python-client-5.3.4.1/docs/user-guide/html/_images/OOF6.png +0 -0
  286. amps-python-client-5.3.4.1/docs/user-guide/html/_images/OOF7.png +0 -0
  287. amps-python-client-5.3.4.1/docs/user-guide/html/_images/OOF8.png +0 -0
  288. amps-python-client-5.3.4.1/docs/user-guide/html/_images/PubSub1.svg +1 -0
  289. amps-python-client-5.3.4.1/docs/user-guide/html/_images/PubSub2.svg +1 -0
  290. amps-python-client-5.3.4.1/docs/user-guide/html/_images/SOWAndSubscribeAndReplace.svg +684 -0
  291. amps-python-client-5.3.4.1/docs/user-guide/html/_images/SOWQuery1.svg +402 -0
  292. amps-python-client-5.3.4.1/docs/user-guide/html/_images/SOWQuery2.svg +505 -0
  293. amps-python-client-5.3.4.1/docs/user-guide/html/_images/UseCaseFig1.svg +1 -0
  294. amps-python-client-5.3.4.1/docs/user-guide/html/_images/UseCaseFig2.svg +1 -0
  295. amps-python-client-5.3.4.1/docs/user-guide/html/_images/UseCaseFig3.svg +1 -0
  296. amps-python-client-5.3.4.1/docs/user-guide/html/_images/UseCaseFig4.svg +1 -0
  297. amps-python-client-5.3.4.1/docs/user-guide/html/_images/caution.png +0 -0
  298. amps-python-client-5.3.4.1/docs/user-guide/html/_images/caution.svg +25 -0
  299. amps-python-client-5.3.4.1/docs/user-guide/html/_images/chicago_group.png +0 -0
  300. amps-python-client-5.3.4.1/docs/user-guide/html/_images/delta_original_messages.png +0 -0
  301. amps-python-client-5.3.4.1/docs/user-guide/html/_images/delta_update_message.png +0 -0
  302. amps-python-client-5.3.4.1/docs/user-guide/html/_images/important.png +0 -0
  303. amps-python-client-5.3.4.1/docs/user-guide/html/_images/important.svg +25 -0
  304. amps-python-client-5.3.4.1/docs/user-guide/html/_images/inline_view_conflation.svg +1 -0
  305. amps-python-client-5.3.4.1/docs/user-guide/html/_images/paginated_subs_pub.png +0 -0
  306. amps-python-client-5.3.4.1/docs/user-guide/html/_images/paginated_subs_sub.png +0 -0
  307. amps-python-client-5.3.4.1/docs/user-guide/html/_images/queue_usage_overview.svg +627 -0
  308. amps-python-client-5.3.4.1/docs/user-guide/html/_images/replication_hub.png +0 -0
  309. amps-python-client-5.3.4.1/docs/user-guide/html/_images/replication_scenario_with_ha.png +0 -0
  310. amps-python-client-5.3.4.1/docs/user-guide/html/_images/sow_overview_1.svg +248 -0
  311. amps-python-client-5.3.4.1/docs/user-guide/html/_images/sow_overview_2.svg +183 -0
  312. amps-python-client-5.3.4.1/docs/user-guide/html/_images/sow_update_sequence.svg +1 -0
  313. amps-python-client-5.3.4.1/docs/user-guide/html/_images/tip.png +0 -0
  314. amps-python-client-5.3.4.1/docs/user-guide/html/_images/tip.svg +31 -0
  315. amps-python-client-5.3.4.1/docs/user-guide/html/_images/warning.png +0 -0
  316. amps-python-client-5.3.4.1/docs/user-guide/html/_images/warning.svg +23 -0
  317. amps-python-client-5.3.4.1/docs/user-guide/html/_sources/chapters/acks.rst.txt +232 -0
  318. amps-python-client-5.3.4.1/docs/user-guide/html/_sources/chapters/actions.rst.txt +111 -0
  319. amps-python-client-5.3.4.1/docs/user-guide/html/_sources/chapters/amps-statistics.rst.txt +358 -0
  320. amps-python-client-5.3.4.1/docs/user-guide/html/_sources/chapters/amps_expressions.rst.txt +83 -0
  321. amps-python-client-5.3.4.1/docs/user-guide/html/_sources/chapters/amps_functions.rst.txt +11 -0
  322. amps-python-client-5.3.4.1/docs/user-guide/html/_sources/chapters/auxiliary_modules.rst.txt +86 -0
  323. amps-python-client-5.3.4.1/docs/user-guide/html/_sources/chapters/config-file-shortcuts.rst.txt +9 -0
  324. amps-python-client-5.3.4.1/docs/user-guide/html/_sources/chapters/conflated_topics.rst.txt +111 -0
  325. amps-python-client-5.3.4.1/docs/user-guide/html/_sources/chapters/constructing-fields.rst.txt +269 -0
  326. amps-python-client-5.3.4.1/docs/user-guide/html/_sources/chapters/daemon.rst.txt +232 -0
  327. amps-python-client-5.3.4.1/docs/user-guide/html/_sources/chapters/delta.rst.txt +556 -0
  328. amps-python-client-5.3.4.1/docs/user-guide/html/_sources/chapters/distribution.rst.txt +186 -0
  329. amps-python-client-5.3.4.1/docs/user-guide/html/_sources/chapters/enrichment.rst.txt +191 -0
  330. amps-python-client-5.3.4.1/docs/user-guide/html/_sources/chapters/events.rst.txt +39 -0
  331. amps-python-client-5.3.4.1/docs/user-guide/html/_sources/chapters/file_format_versions.rst.txt +203 -0
  332. amps-python-client-5.3.4.1/docs/user-guide/html/_sources/chapters/glossary.rst.txt +101 -0
  333. amps-python-client-5.3.4.1/docs/user-guide/html/_sources/chapters/ha.rst.txt +465 -0
  334. amps-python-client-5.3.4.1/docs/user-guide/html/_sources/chapters/installing_and_starting.rst.txt +23 -0
  335. amps-python-client-5.3.4.1/docs/user-guide/html/_sources/chapters/intro.rst.txt +116 -0
  336. amps-python-client-5.3.4.1/docs/user-guide/html/_sources/chapters/logging.rst.txt +34 -0
  337. amps-python-client-5.3.4.1/docs/user-guide/html/_sources/chapters/messageTypes.rst.txt +1398 -0
  338. amps-python-client-5.3.4.1/docs/user-guide/html/_sources/chapters/monitoring.rst.txt +326 -0
  339. amps-python-client-5.3.4.1/docs/user-guide/html/_sources/chapters/oof.rst.txt +312 -0
  340. amps-python-client-5.3.4.1/docs/user-guide/html/_sources/chapters/operation.rst.txt +27 -0
  341. amps-python-client-5.3.4.1/docs/user-guide/html/_sources/chapters/pub_sub.rst.txt +49 -0
  342. amps-python-client-5.3.4.1/docs/user-guide/html/_sources/chapters/queues.rst.txt +1351 -0
  343. amps-python-client-5.3.4.1/docs/user-guide/html/_sources/chapters/replication.rst.txt +1228 -0
  344. amps-python-client-5.3.4.1/docs/user-guide/html/_sources/chapters/securing.rst.txt +657 -0
  345. amps-python-client-5.3.4.1/docs/user-guide/html/_sources/chapters/sow.rst.txt +57 -0
  346. amps-python-client-5.3.4.1/docs/user-guide/html/_sources/chapters/sow_queries.rst.txt +25 -0
  347. amps-python-client-5.3.4.1/docs/user-guide/html/_sources/chapters/spark.rst.txt +824 -0
  348. amps-python-client-5.3.4.1/docs/user-guide/html/_sources/chapters/transports.rst.txt +291 -0
  349. amps-python-client-5.3.4.1/docs/user-guide/html/_sources/chapters/troubleshooting.rst.txt +517 -0
  350. amps-python-client-5.3.4.1/docs/user-guide/html/_sources/chapters/txlog.rst.txt +62 -0
  351. amps-python-client-5.3.4.1/docs/user-guide/html/_sources/chapters/usecases.rst.txt +21 -0
  352. amps-python-client-5.3.4.1/docs/user-guide/html/_sources/chapters/utilities.rst.txt +62 -0
  353. amps-python-client-5.3.4.1/docs/user-guide/html/_sources/chapters/views.rst.txt +175 -0
  354. amps-python-client-5.3.4.1/docs/user-guide/html/_sources/index.rst.txt +110 -0
  355. amps-python-client-5.3.4.1/docs/user-guide/html/_static/ajax-loader.gif +0 -0
  356. amps-python-client-5.3.4.1/docs/user-guide/html/_static/alabaster.css +695 -0
  357. amps-python-client-5.3.4.1/docs/user-guide/html/_static/basic.css +632 -0
  358. amps-python-client-5.3.4.1/docs/user-guide/html/_static/comment-bright.png +0 -0
  359. amps-python-client-5.3.4.1/docs/user-guide/html/_static/comment-close.png +0 -0
  360. amps-python-client-5.3.4.1/docs/user-guide/html/_static/comment.png +0 -0
  361. amps-python-client-5.3.4.1/docs/user-guide/html/_static/custom.css +192 -0
  362. amps-python-client-5.3.4.1/docs/user-guide/html/_static/custom.css.backup +161 -0
  363. amps-python-client-5.3.4.1/docs/user-guide/html/_static/doctools.js +287 -0
  364. amps-python-client-5.3.4.1/docs/user-guide/html/_static/down-pressed.png +0 -0
  365. amps-python-client-5.3.4.1/docs/user-guide/html/_static/down.png +0 -0
  366. amps-python-client-5.3.4.1/docs/user-guide/html/_static/file.png +0 -0
  367. amps-python-client-5.3.4.1/docs/user-guide/html/_static/flag_logo.png +0 -0
  368. amps-python-client-5.3.4.1/docs/user-guide/html/_static/flag_logo.svg +153 -0
  369. amps-python-client-5.3.4.1/docs/user-guide/html/_static/jquery-3.1.0.js +10074 -0
  370. amps-python-client-5.3.4.1/docs/user-guide/html/_static/jquery.js +4 -0
  371. amps-python-client-5.3.4.1/docs/user-guide/html/_static/minus.png +0 -0
  372. amps-python-client-5.3.4.1/docs/user-guide/html/_static/plus.png +0 -0
  373. amps-python-client-5.3.4.1/docs/user-guide/html/_static/pygments.css +74 -0
  374. amps-python-client-5.3.4.1/docs/user-guide/html/_static/searchtools.js +758 -0
  375. amps-python-client-5.3.4.1/docs/user-guide/html/_static/underscore-1.3.1.js +999 -0
  376. amps-python-client-5.3.4.1/docs/user-guide/html/_static/underscore.js +31 -0
  377. amps-python-client-5.3.4.1/docs/user-guide/html/_static/up-pressed.png +0 -0
  378. amps-python-client-5.3.4.1/docs/user-guide/html/_static/up.png +0 -0
  379. amps-python-client-5.3.4.1/docs/user-guide/html/_static/websupport.js +808 -0
  380. amps-python-client-5.3.4.1/docs/user-guide/html/chapters/acks.html +289 -0
  381. amps-python-client-5.3.4.1/docs/user-guide/html/chapters/actions.html +3782 -0
  382. amps-python-client-5.3.4.1/docs/user-guide/html/chapters/amps-statistics.html +439 -0
  383. amps-python-client-5.3.4.1/docs/user-guide/html/chapters/amps_expressions.html +1552 -0
  384. amps-python-client-5.3.4.1/docs/user-guide/html/chapters/amps_functions.html +1626 -0
  385. amps-python-client-5.3.4.1/docs/user-guide/html/chapters/auxiliary_modules.html +2548 -0
  386. amps-python-client-5.3.4.1/docs/user-guide/html/chapters/config-file-shortcuts.html +508 -0
  387. amps-python-client-5.3.4.1/docs/user-guide/html/chapters/conflated_topics.html +328 -0
  388. amps-python-client-5.3.4.1/docs/user-guide/html/chapters/constructing-fields.html +447 -0
  389. amps-python-client-5.3.4.1/docs/user-guide/html/chapters/daemon.html +295 -0
  390. amps-python-client-5.3.4.1/docs/user-guide/html/chapters/delta.html +609 -0
  391. amps-python-client-5.3.4.1/docs/user-guide/html/chapters/distribution.html +246 -0
  392. amps-python-client-5.3.4.1/docs/user-guide/html/chapters/enrichment.html +264 -0
  393. amps-python-client-5.3.4.1/docs/user-guide/html/chapters/events.html +449 -0
  394. amps-python-client-5.3.4.1/docs/user-guide/html/chapters/file_format_versions.html +229 -0
  395. amps-python-client-5.3.4.1/docs/user-guide/html/chapters/glossary.html +215 -0
  396. amps-python-client-5.3.4.1/docs/user-guide/html/chapters/ha.html +978 -0
  397. amps-python-client-5.3.4.1/docs/user-guide/html/chapters/installing_and_starting.html +357 -0
  398. amps-python-client-5.3.4.1/docs/user-guide/html/chapters/intro.html +572 -0
  399. amps-python-client-5.3.4.1/docs/user-guide/html/chapters/logging.html +972 -0
  400. amps-python-client-5.3.4.1/docs/user-guide/html/chapters/messageTypes.html +1280 -0
  401. amps-python-client-5.3.4.1/docs/user-guide/html/chapters/monitoring.html +718 -0
  402. amps-python-client-5.3.4.1/docs/user-guide/html/chapters/oof.html +341 -0
  403. amps-python-client-5.3.4.1/docs/user-guide/html/chapters/operation.html +1515 -0
  404. amps-python-client-5.3.4.1/docs/user-guide/html/chapters/pub_sub.html +934 -0
  405. amps-python-client-5.3.4.1/docs/user-guide/html/chapters/queues.html +1767 -0
  406. amps-python-client-5.3.4.1/docs/user-guide/html/chapters/replication.html +1777 -0
  407. amps-python-client-5.3.4.1/docs/user-guide/html/chapters/securing.html +697 -0
  408. amps-python-client-5.3.4.1/docs/user-guide/html/chapters/sow.html +1038 -0
  409. amps-python-client-5.3.4.1/docs/user-guide/html/chapters/sow_queries.html +621 -0
  410. amps-python-client-5.3.4.1/docs/user-guide/html/chapters/spark.html +819 -0
  411. amps-python-client-5.3.4.1/docs/user-guide/html/chapters/transports.html +352 -0
  412. amps-python-client-5.3.4.1/docs/user-guide/html/chapters/troubleshooting.html +530 -0
  413. amps-python-client-5.3.4.1/docs/user-guide/html/chapters/txlog.html +1013 -0
  414. amps-python-client-5.3.4.1/docs/user-guide/html/chapters/usecases.html +288 -0
  415. amps-python-client-5.3.4.1/docs/user-guide/html/chapters/utilities.html +133 -0
  416. amps-python-client-5.3.4.1/docs/user-guide/html/chapters/views.html +1120 -0
  417. amps-python-client-5.3.4.1/docs/user-guide/html/genindex.html +1261 -0
  418. amps-python-client-5.3.4.1/docs/user-guide/html/index.html +163 -0
  419. amps-python-client-5.3.4.1/docs/user-guide/html/objects.inv +0 -0
  420. amps-python-client-5.3.4.1/docs/user-guide/html/search.html +106 -0
  421. amps-python-client-5.3.4.1/docs/user-guide/html/searchindex.js +1 -0
  422. amps-python-client-5.3.4.1/include/ampspy_bookmarkstore.hpp +63 -0
  423. amps-python-client-5.3.4.1/include/ampspy_compat.h +63 -0
  424. amps-python-client-5.3.4.1/include/ampspy_defs.hpp +181 -0
  425. amps-python-client-5.3.4.1/include/ampspy_recoverypointadapter.hpp +52 -0
  426. amps-python-client-5.3.4.1/include/ampspy_shims.hpp +113 -0
  427. amps-python-client-5.3.4.1/include/ampspy_type_object.hpp +242 -0
  428. amps-python-client-5.3.4.1/include/ampspy_types.hpp +1139 -0
  429. amps-python-client-5.3.4.1/include/ampspyver.h +30 -0
  430. amps-python-client-5.3.4.1/index.html +66 -0
  431. amps-python-client-5.3.4.1/samples/AMPSConsolePublisher.py +59 -0
  432. amps-python-client-5.3.4.1/samples/AMPSConsoleSubscriber.py +63 -0
  433. amps-python-client-5.3.4.1/samples/AMPSFIXBuilderPublisher.py +71 -0
  434. amps-python-client-5.3.4.1/samples/AMPSFIXShredderSubscriber.py +69 -0
  435. amps-python-client-5.3.4.1/samples/AMPSNVFIXBuilderPublisher.py +71 -0
  436. amps-python-client-5.3.4.1/samples/AMPSNVFIXShredderSubscriber.py +67 -0
  437. amps-python-client-5.3.4.1/samples/AMPSPublishForReplay.py +81 -0
  438. amps-python-client-5.3.4.1/samples/AMPSQueueConsumer.py +69 -0
  439. amps-python-client-5.3.4.1/samples/AMPSQueuePublisher.py +59 -0
  440. amps-python-client-5.3.4.1/samples/AMPSSOWConsolePublisher.py +67 -0
  441. amps-python-client-5.3.4.1/samples/AMPSSOWConsoleSubscriber.py +77 -0
  442. amps-python-client-5.3.4.1/samples/AMPSSOWandSubscribeConsoleSubscriber.py +79 -0
  443. amps-python-client-5.3.4.1/samples/AMPSSOWandSubscribeWithOOF.py +108 -0
  444. amps-python-client-5.3.4.1/samples/AMPSSubscribeForReplay.py +128 -0
  445. amps-python-client-5.3.4.1/samples/AMPSUpdateForOOF.py +123 -0
  446. amps-python-client-5.3.4.1/samples/CompositeMessagePublisher.py +84 -0
  447. amps-python-client-5.3.4.1/samples/CompositeMessageSubscriber.py +87 -0
  448. amps-python-client-5.3.4.1/samples/RandomServerChooser.py +41 -0
  449. amps-python-client-5.3.4.1/samples/sample.xml +335 -0
  450. amps-python-client-5.3.4.1/setup.py +209 -0
  451. amps-python-client-5.3.4.1/setup_amps.py +94 -0
  452. amps-python-client-5.3.4.1/src/ampspy_shims.cpp +203 -0
  453. amps-python-client-5.3.4.1/src/ampspy_type_object.cpp +484 -0
  454. amps-python-client-5.3.4.1/src/authenticator.cpp +128 -0
  455. amps-python-client-5.3.4.1/src/bookmarkstore.cpp +238 -0
  456. amps-python-client-5.3.4.1/src/client.cpp +2430 -0
  457. amps-python-client-5.3.4.1/src/client_docs.h +956 -0
  458. amps-python-client-5.3.4.1/src/cmessagehandler.cpp +151 -0
  459. amps-python-client-5.3.4.1/src/command.cpp +164 -0
  460. amps-python-client-5.3.4.1/src/command_docs.h +194 -0
  461. amps-python-client-5.3.4.1/src/compositemessagebuilder.cpp +111 -0
  462. amps-python-client-5.3.4.1/src/compositemessageparser.cpp +146 -0
  463. amps-python-client-5.3.4.1/src/conflatingrecoverypointadapter.cpp +194 -0
  464. amps-python-client-5.3.4.1/src/cpp/include/amps/BlockPublishStore.hpp +2053 -0
  465. amps-python-client-5.3.4.1/src/cpp/include/amps/BlockStore.hpp +677 -0
  466. amps-python-client-5.3.4.1/src/cpp/include/amps/BookmarkStore.hpp +542 -0
  467. amps-python-client-5.3.4.1/src/cpp/include/amps/Buffer.hpp +214 -0
  468. amps-python-client-5.3.4.1/src/cpp/include/amps/CompositeMessageBuilder.hpp +174 -0
  469. amps-python-client-5.3.4.1/src/cpp/include/amps/CompositeMessageParser.hpp +151 -0
  470. amps-python-client-5.3.4.1/src/cpp/include/amps/DefaultServerChooser.hpp +162 -0
  471. amps-python-client-5.3.4.1/src/cpp/include/amps/Field.hpp +719 -0
  472. amps-python-client-5.3.4.1/src/cpp/include/amps/HAClient.hpp +370 -0
  473. amps-python-client-5.3.4.1/src/cpp/include/amps/HAClientImpl.hpp +460 -0
  474. amps-python-client-5.3.4.1/src/cpp/include/amps/HybridPublishStore.hpp +481 -0
  475. amps-python-client-5.3.4.1/src/cpp/include/amps/LoggedBookmarkStore.hpp +1255 -0
  476. amps-python-client-5.3.4.1/src/cpp/include/amps/MMapBookmarkStore.hpp +1283 -0
  477. amps-python-client-5.3.4.1/src/cpp/include/amps/MMapStoreBuffer.hpp +290 -0
  478. amps-python-client-5.3.4.1/src/cpp/include/amps/MemoryBookmarkStore.hpp +1622 -0
  479. amps-python-client-5.3.4.1/src/cpp/include/amps/MemoryPublishStore.hpp +66 -0
  480. amps-python-client-5.3.4.1/src/cpp/include/amps/MemoryStoreBuffer.hpp +244 -0
  481. amps-python-client-5.3.4.1/src/cpp/include/amps/MemorySubscriptionManager.hpp +850 -0
  482. amps-python-client-5.3.4.1/src/cpp/include/amps/Message.hpp +1819 -0
  483. amps-python-client-5.3.4.1/src/cpp/include/amps/MessageRouter.hpp +618 -0
  484. amps-python-client-5.3.4.1/src/cpp/include/amps/PublishStore.hpp +158 -0
  485. amps-python-client-5.3.4.1/src/cpp/include/amps/ReconnectDelayStrategy.hpp +106 -0
  486. amps-python-client-5.3.4.1/src/cpp/include/amps/ReconnectDelayStrategyImpl.hpp +317 -0
  487. amps-python-client-5.3.4.1/src/cpp/include/amps/RecoveryPoint.hpp +323 -0
  488. amps-python-client-5.3.4.1/src/cpp/include/amps/RecoveryPointAdapter.hpp +501 -0
  489. amps-python-client-5.3.4.1/src/cpp/include/amps/RingBookmarkStore.hpp +669 -0
  490. amps-python-client-5.3.4.1/src/cpp/include/amps/SOWRecoveryPointAdapter.hpp +490 -0
  491. amps-python-client-5.3.4.1/src/cpp/include/amps/ServerChooser.hpp +145 -0
  492. amps-python-client-5.3.4.1/src/cpp/include/amps/ServerChooserImpl.hpp +95 -0
  493. amps-python-client-5.3.4.1/src/cpp/include/amps/amps.h +775 -0
  494. amps-python-client-5.3.4.1/src/cpp/include/amps/amps_generated.h +46 -0
  495. amps-python-client-5.3.4.1/src/cpp/include/amps/amps_impl.h +204 -0
  496. amps-python-client-5.3.4.1/src/cpp/include/amps/amps_ssl.h +78 -0
  497. amps-python-client-5.3.4.1/src/cpp/include/amps/ampscrc.hpp +210 -0
  498. amps-python-client-5.3.4.1/src/cpp/include/amps/ampsplusplus.hpp +8817 -0
  499. amps-python-client-5.3.4.1/src/cpp/include/amps/ampsuri.h +84 -0
  500. amps-python-client-5.3.4.1/src/cpp/include/amps/ampsver.h +41 -0
  501. amps-python-client-5.3.4.1/src/cpp/include/amps/ampsver.h.in +41 -0
  502. amps-python-client-5.3.4.1/src/cpp/include/amps/constants.hpp +194 -0
  503. amps-python-client-5.3.4.1/src/cpp/include/amps/util.hpp +1692 -0
  504. amps-python-client-5.3.4.1/src/cpp/src/amps_protocol.c +688 -0
  505. amps-python-client-5.3.4.1/src/cpp/src/amps_protocol_generated.h +80 -0
  506. amps-python-client-5.3.4.1/src/cpp/src/amps_ssl.c +489 -0
  507. amps-python-client-5.3.4.1/src/cpp/src/atfork.c +446 -0
  508. amps-python-client-5.3.4.1/src/cpp/src/client.c +483 -0
  509. amps-python-client-5.3.4.1/src/cpp/src/makefile +92 -0
  510. amps-python-client-5.3.4.1/src/cpp/src/message.c +837 -0
  511. amps-python-client-5.3.4.1/src/cpp/src/message_generated.h +611 -0
  512. amps-python-client-5.3.4.1/src/cpp/src/tcp.c +1489 -0
  513. amps-python-client-5.3.4.1/src/cpp/src/tcps.c +1894 -0
  514. amps-python-client-5.3.4.1/src/cpp/src/transports.c +123 -0
  515. amps-python-client-5.3.4.1/src/cpp/src/unix.c +984 -0
  516. amps-python-client-5.3.4.1/src/cpp/src/uri.c +301 -0
  517. amps-python-client-5.3.4.1/src/exponentialdelaystrategy.cpp +137 -0
  518. amps-python-client-5.3.4.1/src/failedwritehandler.cpp +116 -0
  519. amps-python-client-5.3.4.1/src/fixbuilder.cpp +146 -0
  520. amps-python-client-5.3.4.1/src/fixeddelaystrategy.cpp +114 -0
  521. amps-python-client-5.3.4.1/src/fixshredder.cpp +105 -0
  522. amps-python-client-5.3.4.1/src/fixshredder_docs.h +38 -0
  523. amps-python-client-5.3.4.1/src/haclient.cpp +691 -0
  524. amps-python-client-5.3.4.1/src/haclient_docs.h +132 -0
  525. amps-python-client-5.3.4.1/src/hybridpublishstore.cpp +137 -0
  526. amps-python-client-5.3.4.1/src/hybridpublishstore_docs.h +31 -0
  527. amps-python-client-5.3.4.1/src/memorybookmarkstore.cpp +373 -0
  528. amps-python-client-5.3.4.1/src/memorybookmarkstore_docs.h +39 -0
  529. amps-python-client-5.3.4.1/src/memorypublishstore.cpp +160 -0
  530. amps-python-client-5.3.4.1/src/memorypublishstore_docs.h +32 -0
  531. amps-python-client-5.3.4.1/src/message.cpp +765 -0
  532. amps-python-client-5.3.4.1/src/message_docs.h +306 -0
  533. amps-python-client-5.3.4.1/src/messagestream.cpp +623 -0
  534. amps-python-client-5.3.4.1/src/messagestream_docs.h +45 -0
  535. amps-python-client-5.3.4.1/src/mmapbookmarkstore.cpp +422 -0
  536. amps-python-client-5.3.4.1/src/nvfixbuilder.cpp +160 -0
  537. amps-python-client-5.3.4.1/src/nvfixbuilder_docs.h +33 -0
  538. amps-python-client-5.3.4.1/src/nvfixshredder.cpp +99 -0
  539. amps-python-client-5.3.4.1/src/nvfixshredder_docs.h +39 -0
  540. amps-python-client-5.3.4.1/src/publishstore.cpp +183 -0
  541. amps-python-client-5.3.4.1/src/raw_wrapper.cpp +756 -0
  542. amps-python-client-5.3.4.1/src/reason.cpp +71 -0
  543. amps-python-client-5.3.4.1/src/recoverypoint.cpp +135 -0
  544. amps-python-client-5.3.4.1/src/recoverypointadapter.cpp +171 -0
  545. amps-python-client-5.3.4.1/src/ringbookmarkstore.cpp +360 -0
  546. amps-python-client-5.3.4.1/src/serverchooser.cpp +245 -0
  547. amps-python-client-5.3.4.1/src/serverchooser_docs.h +39 -0
  548. amps-python-client-5.3.4.1/src/sowrecoverypointadapter.cpp +248 -0
  549. amps-python-client-5.3.4.1/src/store.cpp +62 -0
  550. amps-python-client-5.3.4.1/src/versioninfo.cpp +175 -0
@@ -0,0 +1,1515 @@
1
+ <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
2
+ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
3
+
4
+
5
+ <html xmlns="http://www.w3.org/1999/xhtml">
6
+ <head>
7
+ <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
8
+
9
+ <title>27. Operation and Deployment &#8212; AMPS User Guide develop documentation</title>
10
+
11
+ <link rel="stylesheet" href="../_static/alabaster.css" type="text/css" />
12
+ <link rel="stylesheet" href="../_static/pygments.css" type="text/css" />
13
+
14
+ <script type="text/javascript">
15
+ var DOCUMENTATION_OPTIONS = {
16
+ URL_ROOT: '../',
17
+ VERSION: 'develop',
18
+ COLLAPSE_INDEX: false,
19
+ FILE_SUFFIX: '.html',
20
+ HAS_SOURCE: true,
21
+ SOURCELINK_SUFFIX: '.txt'
22
+ };
23
+ </script>
24
+ <script type="text/javascript" src="../_static/jquery.js"></script>
25
+ <script type="text/javascript" src="../_static/underscore.js"></script>
26
+ <script type="text/javascript" src="../_static/doctools.js"></script>
27
+ <link rel="index" title="Index" href="../genindex.html" />
28
+ <link rel="search" title="Search" href="../search.html" />
29
+ <link rel="next" title="28. Securing AMPS" href="securing.html" />
30
+ <link rel="prev" title="26. Highly Available AMPS Installations" href="ha.html" />
31
+
32
+ <link rel="stylesheet" href="../_static/custom.css" type="text/css" />
33
+
34
+
35
+ <meta name="viewport" content="width=device-width, initial-scale=0.9, maximum-scale=0.9" />
36
+
37
+ </head>
38
+ <body role="document">
39
+ <div class="document">
40
+
41
+ <div class="sphinxsidebar" role="navigation" aria-label="main navigation">
42
+ <div class="sphinxsidebarwrapper">
43
+ <p class="logo"><a href="../index.html">
44
+ <img class="logo" src="../_static/flag_logo.png" alt="Logo"/>
45
+ </a></p>
46
+ <h3><a href="../index.html">Table Of Contents</a></h3>
47
+ <ul>
48
+ <li><a class="reference internal" href="#">27. Operation and Deployment</a><ul>
49
+ <li><a class="reference internal" href="#capacity-planning">Capacity Planning</a><ul>
50
+ <li><a class="reference internal" href="#system-goals-and-requirements">System Goals and Requirements</a><ul>
51
+ <li><a class="reference internal" href="#single-tenant-or-multi-tenant">Single-Tenant or Multi-Tenant</a></li>
52
+ <li><a class="reference internal" href="#physical-server-or-virtual-machines">Physical Server or Virtual Machines</a></li>
53
+ </ul>
54
+ </li>
55
+ <li><a class="reference internal" href="#memory">Memory</a><ul>
56
+ <li><a class="reference internal" href="#estimating-amps-instance-memory-usage">Estimating AMPS Instance Memory Usage</a></li>
57
+ <li><a class="reference internal" href="#estimating-overall-system-capacity">Estimating Overall System Capacity</a></li>
58
+ </ul>
59
+ </li>
60
+ <li><a class="reference internal" href="#storage">Storage</a><ul>
61
+ <li><a class="reference internal" href="#amps-log-files">AMPS Log Files</a></li>
62
+ <li><a class="reference internal" href="#sow-topics">SOW Topics</a></li>
63
+ <li><a class="reference internal" href="#transaction-logs">Transaction Logs</a></li>
64
+ <li><a class="reference internal" href="#file-backed-queue-metadata">File-Backed Queue Metadata</a></li>
65
+ <li><a class="reference internal" href="#choosing-storage-devices">Choosing Storage Devices</a></li>
66
+ </ul>
67
+ </li>
68
+ <li><a class="reference internal" href="#cpu">CPU</a></li>
69
+ <li><a class="reference internal" href="#network">Network</a><ul>
70
+ <li><a class="reference internal" href="#replication-network-bandwidth">Replication Network Bandwidth</a></li>
71
+ <li><a class="reference internal" href="#additional-network-considerations">Additional Network Considerations</a></li>
72
+ </ul>
73
+ </li>
74
+ <li><a class="reference internal" href="#numa-considerations">NUMA Considerations</a></li>
75
+ </ul>
76
+ </li>
77
+ <li><a class="reference internal" href="#linux-operating-system-configuration">Linux Operating System Configuration</a><ul>
78
+ <li><a class="reference internal" href="#ulimit">ulimit</a></li>
79
+ <li><a class="reference internal" href="#transparent-huge-pages">Transparent Huge Pages</a></li>
80
+ <li><a class="reference internal" href="#proc-sys-fs-aio-max-nr">/proc/sys/fs/aio-max-nr</a></li>
81
+ <li><a class="reference internal" href="#proc-sys-fs-file-max">/proc/sys/fs/file-max</a></li>
82
+ <li><a class="reference internal" href="#proc-sys-vm-min-free-kbytes">/proc/sys/vm/min_free_kbytes</a></li>
83
+ <li><a class="reference internal" href="#proc-sys-vm-max-map-count">/proc/sys/vm/max_map_count</a></li>
84
+ <li><a class="reference internal" href="#proc-sys-vm-swappiness">/proc/sys/vm/swappiness</a></li>
85
+ <li><a class="reference internal" href="#proc-sys-net-ipv4-tcp-frto">/proc/sys/net/ipv4/tcp_frto</a></li>
86
+ </ul>
87
+ </li>
88
+ <li><a class="reference internal" href="#upgrading-an-amps-installation">Upgrading an AMPS Installation</a><ul>
89
+ <li><a class="reference internal" href="#upgrade-steps">Upgrade Steps</a></li>
90
+ <li><a class="reference internal" href="#upgrading-amps-data-files">Upgrading AMPS Data Files</a></li>
91
+ <li><a class="reference internal" href="#downgrading-amps-data-files">Downgrading AMPS Data Files</a></li>
92
+ </ul>
93
+ </li>
94
+ <li><a class="reference internal" href="#best-practices">Best Practices</a><ul>
95
+ <li><a class="reference internal" href="#monitoring">Monitoring</a></li>
96
+ <li><a class="reference internal" href="#logging">Logging</a></li>
97
+ <li><a class="reference internal" href="#stopping-amps">Stopping AMPS</a></li>
98
+ <li><a class="reference internal" href="#sow-parameters">SOW Parameters</a></li>
99
+ <li><a class="reference internal" href="#slow-clients">Slow Clients</a><ul>
100
+ <li><a class="reference internal" href="#slow-client-offlining-for-large-result-sets">Slow Client Offlining for Large Result Sets</a></li>
101
+ <li><a class="reference internal" href="#wan-traffic-and-slow-client-settings">WAN Traffic and Slow Client Settings</a></li>
102
+ </ul>
103
+ </li>
104
+ <li><a class="reference internal" href="#minidump">Minidump</a></li>
105
+ <li><a class="reference internal" href="#deployment-and-upgrade-plan">Deployment and Upgrade Plan</a></li>
106
+ </ul>
107
+ </li>
108
+ <li><a class="reference internal" href="#accessing-amps-through-a-proxy">Accessing AMPS Through a Proxy</a><ul>
109
+ <li><a class="reference internal" href="#websocket-connections">Websocket Connections</a></li>
110
+ <li><a class="reference internal" href="#galvanometer-connections">Galvanometer Connections</a></li>
111
+ <li><a class="reference internal" href="#load-balancing-considerations">Load-Balancing Considerations</a></li>
112
+ </ul>
113
+ </li>
114
+ </ul>
115
+ </li>
116
+ </ul>
117
+ <div class="relations">
118
+ <h3>Related Topics</h3>
119
+ <ul>
120
+ <li><a href="../index.html">Documentation overview</a><ul>
121
+ <li>Previous: <a href="ha.html" title="previous chapter">26. Highly Available AMPS Installations</a></li>
122
+ <li>Next: <a href="securing.html" title="next chapter">28. Securing AMPS</a></li>
123
+ </ul></li>
124
+ </ul>
125
+ </div>
126
+ <div id="searchbox" style="display: none" role="search">
127
+ <h3>Quick search</h3>
128
+ <form class="search" action="../search.html" method="get">
129
+ <div><input type="text" name="q" /></div>
130
+ <div><input type="submit" value="Go" /></div>
131
+ <input type="hidden" name="check_keywords" value="yes" />
132
+ <input type="hidden" name="area" value="default" />
133
+ </form>
134
+ </div>
135
+ <script type="text/javascript">$('#searchbox').show(0);</script>
136
+ </div>
137
+ </div>
138
+ <div class="documentwrapper">
139
+ <div class="bodywrapper">
140
+ <div class="body" role="main">
141
+
142
+ <div class="section" id="operation-and-deployment">
143
+ <span id="operation"></span><span id="operation-deployment-capacity-planning"></span><span id="ug-operation"></span><span id="index-0"></span><h1>27. Operation and Deployment<a class="headerlink" href="#operation-and-deployment" title="Permalink to this headline">¶</a></h1>
144
+ <p>This chapter contains guidelines and best practices to help plan
145
+ and prepare an environment, to ensure optimal performance and
146
+ stability for AMPS deployments.</p>
147
+ <p>See the <a class="reference internal" href="troubleshooting.html#ug-troubleshooting"><span class="std std-ref">Troubleshooting</span></a> chapter for
148
+ information on troubleshooting problems with AMPS, including
149
+ information on using the utilities that come with AMPS.</p>
150
+ <div class="section" id="capacity-planning">
151
+ <h2>Capacity Planning<a class="headerlink" href="#capacity-planning" title="Permalink to this headline">¶</a></h2>
152
+ <p id="index-1">Sizing an AMPS deployment can be a complicated process that includes
153
+ many factors, such as: configuration parameters used for AMPS, the data
154
+ used within the deployment and how the deployment will be used. This
155
+ section presents guidelines that you can use in sizing your host
156
+ environment for an AMPS deployment given the following components that
157
+ need to be taken into account: Memory, Storage, CPU and Network.</p>
158
+ <p>Capacity planning is one of the most important aspects of ensuring
159
+ that an AMPS deployment can meet the needs of the application.</p>
160
+ <div class="admonition important">
161
+ <p class="first admonition-title">Important</p>
162
+ <p class="last">The capacity planning formulas in this section are
163
+ intended to help you size a system to run an instance
164
+ of AMPS. The actual resource consumption will vary
165
+ based on usage and configuration.</p>
166
+ </div>
167
+ <div class="section" id="system-goals-and-requirements">
168
+ <h3>System Goals and Requirements<a class="headerlink" href="#system-goals-and-requirements" title="Permalink to this headline">¶</a></h3>
169
+ <p>When planning the capacity for a system, the most important questions
170
+ to understand are: the purpose of the instance and the Service Level Agreement
171
+ (SLA) offered by the instance. For example, is this a server for use by a
172
+ development team for early exploration of ideas, or will this instance be
173
+ core infrastructure for a major application? Is it important that the instance
174
+ has the absolute minimum latency possible, or is the most important aspect
175
+ of the system query response time for a 1TB topic in the SOW?</p>
176
+ <p>Since AMPS efficiently uses the system hardware, the limits of an AMPS
177
+ instance are typically a result of the limitations of the underlying host
178
+ system. Proper capacity planning (and operating system tuning) can mean
179
+ the difference between an instance that performs well and handles increased
180
+ traffic without incident and an instance that constantly pushes the
181
+ hardware to the limit and becomes less responsive when traffic increases.</p>
182
+ <div class="section" id="single-tenant-or-multi-tenant">
183
+ <h4>Single-Tenant or Multi-Tenant<a class="headerlink" href="#single-tenant-or-multi-tenant" title="Permalink to this headline">¶</a></h4>
184
+ <p>AMPS performs well in both single-tenant and multi-tenant installations. When
185
+ choosing whether to host more than one AMPS instance on a given system, it is
186
+ important to plan for the <em>highest</em> level of traffic expected on all
187
+ instances simultaneously. In a business setting, it is common for a sudden
188
+ increase in traffic to affect a number of systems in the business, rather than
189
+ being isolated to just one system. When planning capacity for a multi-tenant
190
+ system, provision a host that exceeds the total maximum capacity required
191
+ for <strong>all</strong> AMPS instances on the system at peak load.</p>
192
+ <p>For multi-tenant installations, disable AMPS-level NUMA tuning in the
193
+ configuration file.</p>
194
+ </div>
195
+ <div class="section" id="physical-server-or-virtual-machines">
196
+ <h4>Physical Server or Virtual Machines<a class="headerlink" href="#physical-server-or-virtual-machines" title="Permalink to this headline">¶</a></h4>
197
+ <p>Although AMPS is designed to be highly adaptive to hardware on which
198
+ it runs, AMPS does not require a dedicated physical server.
199
+ AMPS can be successfully deployed on either physical hardware or virtual
200
+ machines. In either deployment model, 60East recommends tuning Linux for
201
+ best performance rather than accepting the distribution defaults (which
202
+ are typically tuned for interactive use rather than for a high performance
203
+ server).</p>
204
+ <p>Typically, installations that require the highest level of performance
205
+ and lowest levels of latency deploy on physical hardware (with a single
206
+ AMPS instance per server). Installations that are willing to trade
207
+ predictable performance for ease and flexibility of deployment often use
208
+ virtual machines.</p>
209
+ <p>When deployed on a virtual machine, disable AMPS-level NUMA tuning in the
210
+ configuration file.</p>
211
+ <p>60East does not recommend over-committing the underlying hardware.
212
+ When deploying on a virtual machine, it is important to consider the
213
+ capacity of <em>both</em> the virtual machine itself and the underlying host hardware.
214
+ In other words, the total memory needed by all virtual machines &#8211; with all
215
+ applications hosted by those machines running at peak traffic simultaneously &#8211;
216
+ should not exceed the physical memory of the hardware. Likewise, the total
217
+ number of CPUs specified in all of the virtual machines on the host should not
218
+ exceed the number of CPUs on the host hardware, the network bandwidth needed
219
+ should not exceed the bandwidth allocated to the host, the traffic to the
220
+ storage device should not exceed the throughput that the storage device is
221
+ capable of, and so on. In an enterprise environment, it is not unusual
222
+ for a wide variety of applications to all see peak loads at the same time,
223
+ so the system should be provisioned to provide enough capacity that
224
+ every hosted application can meet peak throughput requirements at the
225
+ same time.</p>
226
+ <p>Develop a plan for monitoring the physical hardware
227
+ as well as the virtualized host environment. If possible, the
228
+ monitoring plan should include a method for correlating the activity
229
+ on the virtual machine to the activity on the physical host (for example,
230
+ it would be important to be able to correlate CPU saturation on the
231
+ virtual machine to CPU saturation on the physical host).</p>
232
+ <p>60East does not recommend using virtualization systems that dynamically move
233
+ running virtual machines for load-balancing purposes in an application that
234
+ requires low latency or predictable response times. Although these systems
235
+ work well for their intended purpose, a machine migration typically takes an
236
+ extended period of time (for example, a target maximum time of 1s) to finalize
237
+ the migration. During that time, the virtual machine (and therefore, AMPS) is
238
+ temporarily paused. A pause this long is typically orders of magnitude longer
239
+ than the typical low-latency system can tolerate for service interruption,
240
+ and is effectively a temporary service outage during the migration.</p>
241
+ <p>Although this sort of migration is typically unworkable for load-balancing,
242
+ the migration is much less downtime than would be required to stop and
243
+ restart AMPS. These systems could be a good choice for reducing downtime
244
+ for hardware-level or network-level maintenance.</p>
245
+ </div>
246
+ </div>
247
+ <div class="section" id="memory">
248
+ <h3>Memory<a class="headerlink" href="#memory" title="Permalink to this headline">¶</a></h3>
249
+ <p id="index-2">AMPS is designed for high performance. It is designed to use memory,
250
+ as needed, to improve performance and reduce latency. One of the most
251
+ important aspects of managing an AMPS instance is, being sure that the
252
+ instance has enough physical memory available to perform well.</p>
253
+ <p>This section contains general guidelines for creating an approximate
254
+ sizing estimate for the AMPS process itself. An estimate on total
255
+ memory capacity for a server would include the estimate for the
256
+ AMPS process itself and estimates for any other processes running on
257
+ the system (including monitoring software, security software, other
258
+ applications, update and maintenance tasks, and so on). Notice that
259
+ it is possible for AMPS to maintain quantities of data much larger
260
+ than physical memory (for example, terabytes of SOW data). For
261
+ instances that have this requirement, contact 60East support for
262
+ tuning and sizing guidance.</p>
263
+ <div class="section" id="estimating-amps-instance-memory-usage">
264
+ <h4>Estimating AMPS Instance Memory Usage<a class="headerlink" href="#estimating-amps-instance-memory-usage" title="Permalink to this headline">¶</a></h4>
265
+ <p>The best way to estimate the memory usage for an AMPS instance is
266
+ to simulate, as closely as possible, the traffic and usage pattern
267
+ for the instance and collect statistics that show the amount of
268
+ memory that the instance uses.</p>
269
+ <p>If actual numbers aren&#8217;t available, you can use the formulas in this
270
+ section to come up with a working approximation of the amount of
271
+ memory to make available to AMPS for a given amount of data, number
272
+ of clients, and so on. The AMPS server will use memory as necessary for
273
+ performance, so the formulas here offer general estimates for system sizing
274
+ purposes rather than precise predictions.</p>
275
+ <p>AMPS needs less than 1GB for its own binary image and initial start up
276
+ state for most configurations. For production instances, we estimate
277
+ 5GB as a typical working memory footprint for an active installation.</p>
278
+ <p>As a general estimate, because of indexing for queries, AMPS may need
279
+ up to twice the size of messages stored in a topic in the SOW to fully
280
+ index that topic (the same sizing applies to messages in views and
281
+ conflated topics). AMPS maintains a copy of the latest journal file
282
+ in memory for quick access, and maintains a small amount of metadata for
283
+ each message in an AMPS queue. The <code class="docutils literal"><span class="pre">MessageMemoryLimit</span></code> configured for the
284
+ instance (or the total of all <code class="docutils literal"><span class="pre">MessageMemoryLimit</span></code> settings for each <code class="docutils literal"><span class="pre">Transport</span></code>
285
+ in the instance) specifies the total amount of memory devoted to buffering
286
+ messages for clients, including conflated subscriptions, aggregated
287
+ subscriptions, and paginated subscriptions.</p>
288
+ <p>This puts a general estimate of the amount of memory to be available for
289
+ the AMPS server itself at:</p>
290
+ <div class="code highlight-default"><div class="highlight"><pre><span></span>5GB + ``SowSizeEstimate``
291
+ + ( C * 4096 bytes)
292
+ + ( TMemLimit ) + (J * 2) + (Q * 250 bytes) [ + (QA * 20 bytes) ]
293
+ </pre></div>
294
+ </div>
295
+ <p><em>Memory capacity estimate equation</em></p>
296
+ <p>where:</p>
297
+ <blockquote>
298
+ <div><div class="line-block">
299
+ <div class="line"><code class="docutils literal"><span class="pre">SowSizeEstimate</span> <span class="pre">=</span> <span class="pre">Estimates</span> <span class="pre">for</span> <span class="pre">SOW</span> <span class="pre">topic</span> <span class="pre">size,</span> <span class="pre">as</span> <span class="pre">described</span> <span class="pre">below</span> <span class="pre">(in</span> <span class="pre">bytes)</span></code></div>
300
+ <div class="line"><code class="docutils literal"><span class="pre">C</span> <span class="pre">=</span> <span class="pre">Number</span> <span class="pre">of</span> <span class="pre">Clients</span></code></div>
301
+ <div class="line"><code class="docutils literal"><span class="pre">TMemLimit</span> <span class="pre">=</span> <span class="pre">Total</span> <span class="pre">of</span> <span class="pre">all</span> <span class="pre">MessageMemoryLimit</span> <span class="pre">settings</span> <span class="pre">in</span> <span class="pre">the</span> <span class="pre">instance</span></code></div>
302
+ <div class="line"><code class="docutils literal"><span class="pre">J</span> <span class="pre">=</span> <span class="pre">JournalSize</span> <span class="pre">setting</span></code></div>
303
+ <div class="line"><code class="docutils literal"><span class="pre">Q</span> <span class="pre">=</span> <span class="pre">Total</span> <span class="pre">number</span> <span class="pre">of</span> <span class="pre">active</span> <span class="pre">unacknowledged</span> <span class="pre">messages</span> <span class="pre">in</span> <span class="pre">the</span> <span class="pre">queues</span> <span class="pre">for</span> <span class="pre">the</span> <span class="pre">instance</span></code></div>
304
+ <div class="line"><code class="docutils literal"><span class="pre">QA</span> <span class="pre">=</span> <span class="pre">Total</span> <span class="pre">number</span> <span class="pre">of</span> <span class="pre">acknowledgments</span> <span class="pre">received</span> <span class="pre">for</span> <span class="pre">messages</span> <span class="pre">that</span> <span class="pre">are</span> <span class="pre">not</span> <span class="pre">yet</span> <span class="pre">in</span> <span class="pre">the</span> <span class="pre">queue</span></code></div>
305
+ </div>
306
+ </div></blockquote>
307
+ <p>By default, all unacknowledged messages in the instance will be active in the queue.
308
+ When a queue specifies a <code class="docutils literal"><span class="pre">TargetQueueDepth</span></code>, the total number of active unacknowledged messages for
309
+ the queue will, in most cases, be limited to the <code class="docutils literal"><span class="pre">TargetQueueDepth</span></code>.</p>
310
+ <p>When acknowledgment messages are received for messages that are not currently active in the queue, AMPS
311
+ must track those acknowledgments to be able to efficiently prevent those messages from entering the queue.
312
+ Not every application consumption pattern can produce this situation; however, if it arises, this calculation
313
+ can help estimate the amount of memory required to maintain information about these acknowledgments until
314
+ the message enters the queue.</p>
315
+ <p>To calculate the <code class="docutils literal"><span class="pre">SowSizeEstimate</span></code>, the memory footprint required for topics, views and conflated topics in
316
+ the SOW, use the following formula to calculate for each (<code class="docutils literal"><span class="pre">Topic</span></code>, <code class="docutils literal"><span class="pre">View</span></code> and <code class="docutils literal"><span class="pre">ConflatedTopic</span></code>):</p>
317
+ <div class="code highlight-default"><div class="highlight"><pre><span></span><span class="p">(</span> <span class="mi">2</span> <span class="o">*</span> <span class="p">(</span><span class="n">S</span> <span class="o">+</span> <span class="mi">128</span> <span class="nb">bytes</span><span class="p">)</span> <span class="o">*</span> <span class="n">M</span> <span class="p">)</span> <span class="o">+</span> <span class="p">((</span><span class="mi">16</span> <span class="nb">bytes</span> <span class="o">*</span> <span class="n">M</span><span class="p">)</span> <span class="o">*</span> <span class="n">H</span><span class="p">)</span>
318
+ </pre></div>
319
+ </div>
320
+ <p><em>Sow Topic memory capacity estimate equation</em></p>
321
+ <p>where:</p>
322
+ <blockquote>
323
+ <div><div class="line-block">
324
+ <div class="line"><code class="docutils literal"><span class="pre">S</span> <span class="pre">=</span> <span class="pre">Average</span> <span class="pre">message</span> <span class="pre">size</span> <span class="pre">for</span> <span class="pre">the</span> <span class="pre">Topic,</span> <span class="pre">View</span> <span class="pre">or</span> <span class="pre">ConflatedTopic</span> <span class="pre">in</span> <span class="pre">the</span> <span class="pre">SOW</span> <span class="pre">(in</span> <span class="pre">bytes)</span></code></div>
325
+ <div class="line"><code class="docutils literal"><span class="pre">M</span> <span class="pre">=</span> <span class="pre">Maximum</span> <span class="pre">expected</span> <span class="pre">number</span> <span class="pre">of</span> <span class="pre">messages</span> <span class="pre">for</span> <span class="pre">the</span> <span class="pre">Topic,</span> <span class="pre">View</span> <span class="pre">or</span> <span class="pre">ConflatedTopic</span></code></div>
326
+ <div class="line"><code class="docutils literal"><span class="pre">H</span> <span class="pre">=</span> <span class="pre">Number</span> <span class="pre">of</span> <span class="pre">hash</span> <span class="pre">indexes</span> <span class="pre">for</span> <span class="pre">the</span> <span class="pre">Topic,</span> <span class="pre">View</span> <span class="pre">or</span> <span class="pre">ConflatedTopic</span></code></div>
327
+ </div>
328
+ </div></blockquote>
329
+ <p>Estimating topic-by-topic generally gives a more precise estimate. However,
330
+ if that data is not available, you can also use overall message sizes and
331
+ message count for the instance.</p>
332
+ <p>If more configuration detail is available, it may be possible to create a more
333
+ precise estimate. For example, if the <code class="docutils literal"><span class="pre">SlabSize</span></code> configured for a SOW topic
334
+ is not an exact fit for the message size + header, it is possible to estimate
335
+ the amount of free space remaining in each slab.</p>
336
+ <p>As a simple example, a general estimate of the amount of memory that should be left
337
+ available to run an instance of AMPS might be:</p>
338
+ <div class="code highlight-default"><div class="highlight"><pre><span></span><span class="mi">5</span><span class="n">GB</span> <span class="o">+</span> <span class="p">[</span> <span class="p">(</span> <span class="mi">2</span> <span class="o">*</span> <span class="p">(</span><span class="mi">1024</span><span class="o">+</span><span class="mi">128</span><span class="p">)</span> <span class="o">*</span> <span class="mi">1</span><span class="p">,</span><span class="mi">000</span><span class="p">,</span><span class="mi">000</span> <span class="p">)</span> <span class="o">+</span> <span class="p">(</span><span class="mi">16</span> <span class="o">*</span> <span class="p">(</span><span class="mi">1</span><span class="p">,</span><span class="mi">000</span><span class="p">,</span><span class="mi">000</span> <span class="o">*</span> <span class="mi">2</span><span class="p">)</span> <span class="p">)</span> <span class="o">+</span>
339
+ <span class="p">(</span> <span class="mi">2</span> <span class="o">*</span> <span class="p">(</span> <span class="mi">512</span><span class="o">+</span><span class="mi">128</span><span class="p">)</span> <span class="o">*</span> <span class="mi">1</span><span class="p">,</span><span class="mi">000</span><span class="p">,</span><span class="mi">000</span> <span class="p">)</span> <span class="o">+</span> <span class="p">(</span> <span class="mi">0</span> <span class="p">)</span> <span class="o">+</span>
340
+ <span class="p">(</span> <span class="mi">2</span> <span class="o">*</span> <span class="p">(</span><span class="mi">1024</span><span class="o">+</span><span class="mi">128</span><span class="p">)</span> <span class="o">*</span> <span class="mi">8</span><span class="p">,</span><span class="mi">000</span><span class="p">,</span><span class="mi">000</span> <span class="p">)</span> <span class="o">+</span> <span class="p">(</span><span class="mi">16</span> <span class="o">*</span> <span class="p">(</span><span class="mi">8</span><span class="p">,</span><span class="mi">000</span><span class="p">,</span><span class="mi">000</span> <span class="o">*</span> <span class="mi">4</span><span class="p">)</span> <span class="p">]</span>
341
+ <span class="o">+</span> <span class="p">(</span> <span class="mi">200</span> <span class="o">*</span> <span class="mi">4096</span><span class="p">)</span> <span class="o">+</span> <span class="p">(</span> <span class="mi">10</span><span class="p">,</span><span class="mi">000</span><span class="p">,</span><span class="mi">000</span><span class="p">,</span><span class="mi">000</span><span class="p">)</span> <span class="o">+</span>
342
+ <span class="p">(</span> <span class="mi">1</span><span class="p">,</span><span class="mi">000</span><span class="p">,</span><span class="mi">000</span><span class="p">,</span><span class="mi">000</span> <span class="o">*</span> <span class="mi">2</span> <span class="p">)</span> <span class="o">+</span> <span class="p">(</span> <span class="mi">750</span><span class="p">,</span><span class="mi">000</span> <span class="o">*</span> <span class="mi">250</span><span class="p">)</span>
343
+ </pre></div>
344
+ </div>
345
+ <p><em>Example memory estimation equation</em></p>
346
+ <p>where:</p>
347
+ <blockquote>
348
+ <div><div class="line-block">
349
+ <div class="line">For the <code class="docutils literal"><span class="pre">SowSizeEstimate</span></code>, the instance will have two</div>
350
+ <div class="line">Topics and a View.</div>
351
+ <div class="line"><br /></div>
352
+ <div class="line">For the first topic:</div>
353
+ <div class="line"><code class="docutils literal"><span class="pre">S</span> <span class="pre">=</span> <span class="pre">1024</span></code></div>
354
+ <div class="line"><code class="docutils literal"><span class="pre">M</span> <span class="pre">=</span> <span class="pre">4,750,000</span></code></div>
355
+ <div class="line"><code class="docutils literal"><span class="pre">H</span> <span class="pre">=</span> <span class="pre">2</span></code></div>
356
+ <div class="line"><br /></div>
357
+ <div class="line">For a view over the first topic (the view uses no HashIndexes):</div>
358
+ <div class="line"><code class="docutils literal"><span class="pre">S</span> <span class="pre">=</span> <span class="pre">512</span></code></div>
359
+ <div class="line"><code class="docutils literal"><span class="pre">M</span> <span class="pre">=</span> <span class="pre">3,000,000</span></code></div>
360
+ <div class="line"><code class="docutils literal"><span class="pre">H</span> <span class="pre">=</span> <span class="pre">0</span></code></div>
361
+ <div class="line"><br /></div>
362
+ <div class="line">For the second topic:</div>
363
+ <div class="line"><code class="docutils literal"><span class="pre">S</span> <span class="pre">=</span> <span class="pre">1024</span></code></div>
364
+ <div class="line"><code class="docutils literal"><span class="pre">M</span> <span class="pre">=</span> <span class="pre">8,000,000</span></code></div>
365
+ <div class="line"><code class="docutils literal"><span class="pre">H</span> <span class="pre">=</span> <span class="pre">4</span></code></div>
366
+ <div class="line"><br /></div>
367
+ <div class="line">For the overall AMPS estimate:</div>
368
+ <div class="line"><code class="docutils literal"><span class="pre">C</span> <span class="pre">=</span> <span class="pre">200</span></code></div>
369
+ <div class="line"><code class="docutils literal"><span class="pre">TMemLimit</span> <span class="pre">=</span> <span class="pre">10,000,000,000</span> <span class="pre">(10GB)</span></code></div>
370
+ <div class="line"><code class="docutils literal"><span class="pre">J</span> <span class="pre">=</span> <span class="pre">1,000,000,000</span> <span class="pre">(1GB)</span></code></div>
371
+ <div class="line"><code class="docutils literal"><span class="pre">Q</span> <span class="pre">=</span> <span class="pre">750,000</span></code></div>
372
+ </div>
373
+ </div></blockquote>
374
+ <p>This shows sizing for an AMPS deployment with the following characteristics:</p>
375
+ <ul class="simple">
376
+ <li>Three topics in the SOW (including one view):<ul>
377
+ <li>One topic has a message size of 1024 bytes, will hold 5 million messages
378
+ and configure 2 hash indexes.</li>
379
+ <li>One view has a message size of 512 bytes, will hold 3 million messages
380
+ and does not configure a hash index.</li>
381
+ <li>One topic has a message size of 1024 bytes, will hold 8 million messages
382
+ and will configure 4 hash indexes.</li>
383
+ </ul>
384
+ </li>
385
+ <li>A maximum of 10GB of memory for in-flight messages and working state (for aggregated subscriptions,
386
+ pagination sets and so on)</li>
387
+ <li>A journal size setting configured to 1GB</li>
388
+ <li>A maximum of 750,000 total unacknowledged messages at a time across all message queues</li>
389
+ <li>No more than 200 clients connected simultaneously</li>
390
+ <li>No external modules loaded</li>
391
+ </ul>
392
+ <p>This estimate suggests that <em>no less than</em> 52GB of physical memory on the server
393
+ should be available for the AMPS instance itself while AMPS is processing the
394
+ expected volume of messages. When AMPS first starts, or if traffic is light,
395
+ AMPS may consume less than the estimated amount. AMPS may also consume more than
396
+ this amount of memory during memory-intensive operations in some cases.</p>
397
+ <div class="admonition important">
398
+ <p class="first admonition-title">Important</p>
399
+ <p class="last">The formula in this section is a general estimate designed to produce
400
+ a recommended minimum amount of physical memory to have available for AMPS.
401
+ It is intended as a guideline when actual measurements are not available.
402
+ For more accurate estimates, use measurements of the expected workload.
403
+ A given instance of AMPS may not match these estimates at any particular
404
+ time, based on usage, precise configuration, traffic, client activity,
405
+ and so forth.</p>
406
+ </div>
407
+ </div>
408
+ <div class="section" id="estimating-overall-system-capacity">
409
+ <h4>Estimating Overall System Capacity<a class="headerlink" href="#estimating-overall-system-capacity" title="Permalink to this headline">¶</a></h4>
410
+ <p>The AMPS instance memory usage is one component of estimating the needs of
411
+ the overall system. In addition to this, there is also: operating system
412
+ tasks, management and maintenance (including monitoring, security and
413
+ management software), and any other applications running on the system
414
+ must also be taken into consideration.</p>
415
+ <p>Further, Linux memory management is most efficient when the operating
416
+ system has 10-20% headroom.</p>
417
+ <p>For best performance and a lower risk of problems related to an unexpected
418
+ spike in message volume, 60East recommends factoring in all of the components
419
+ that will consume memory on the system, and then sizing the overall physical
420
+ memory to handle 200% of the capacity estimated while still retaining 10-20%
421
+ physical RAM. Note that these are rough guidelines. An especially critical
422
+ system, or a system that has in the past seen larger volumes might size memory
423
+ to 350% or more, while a less critical system might allocate less than 200% of
424
+ the estimated capacity. A VM on a developer desktop might be sized at
425
+ or below the capacity estimate, since the system is completely
426
+ under the control of a single user and is not intended to handle production
427
+ loads.</p>
428
+ <p>For example, in the estimate above, the system should reserve a minimum of
429
+ 52GB of free RAM for the AMPS process itself. Suppose that the monitoring,
430
+ access control and server management software are very lightweight and only
431
+ consume 3GB of memory under production load. The following estimates would be reasonable:</p>
432
+ <ul>
433
+ <li><p class="first"><strong>Production server with strict SLA and tolerance for usage variation</strong> - <em>128GB</em></p>
434
+ <p>This estimate accounts for 200% of the estimated required capacity while still allowing
435
+ 16GB (between 10 and 20% of the physical memory) free for efficient
436
+ memory management. (Calculation: 52GB for AMPS, 3GB for the monitoring
437
+ software = 55GB. Multiply by 2 = 110GB.) For a server that needs to be available
438
+ during periods of heavy activity, this sizing could be a good option.</p>
439
+ </li>
440
+ <li><p class="first"><strong>Production server with stable usage or variable SLA</strong> - <em>96GB</em></p>
441
+ <p>This estimate covers the expected capacity of the AMPS server and monitoring software
442
+ and leaves enough headroom for the operating system, but does not allow for
443
+ large growth in volume or changes in usage patterns. For a server with predictable
444
+ usage and volumes, or a server where some performance impact is acceptable if volume
445
+ or usage increases and where the general estimates for AMPS capacity are known to be
446
+ very precise, this server size could be a good option.</p>
447
+ </li>
448
+ <li><p class="first"><strong>Shared development server with minimal performance SLA</strong> - <em>64GB</em></p>
449
+ <p>This minimal estimate covers the expected capacity of the AMPS server and monitoring system,
450
+ but does not leave enough excess capacity for the server to absorb unexpected
451
+ traffic. This server would be expected to have periodic performance
452
+ degradation and to possibly exit due to out of memory conditions
453
+ if the volume of traffic increases or the usage pattern changes.
454
+ This could be a good sizing for an instance that is used only for
455
+ development, where the instance is not guaranteed to provide any particular
456
+ performance guarantees and it is acceptable for the server to be temporarily
457
+ unavailable if there was an unexpected increase in load.</p>
458
+ </li>
459
+ </ul>
460
+ </div>
461
+ </div>
462
+ <div class="section" id="storage">
463
+ <h3>Storage<a class="headerlink" href="#storage" title="Permalink to this headline">¶</a></h3>
464
+ <p id="index-3">AMPS needs enough space to store its own binary images, configuration files, SOW persistence
465
+ files, log files, transaction log journals, and slow client offline storage, if any. Not
466
+ every deployment configures a SOW or transaction log, so the storage
467
+ requirements are largely driven by the configuration.</p>
468
+ <div class="section" id="amps-log-files">
469
+ <h4>AMPS Log Files<a class="headerlink" href="#amps-log-files" title="Permalink to this headline">¶</a></h4>
470
+ <p>Log file sizes vary depending on the log level and how the engine is
471
+ used. For example, in the worst-case, <code class="docutils literal"><span class="pre">trace</span></code> level logging. AMPS will need
472
+ at least enough storage for every message published into AMPS and every
473
+ message sent out of AMPS plus 20%.</p>
474
+ <p>For <code class="docutils literal"><span class="pre">info</span></code> level logging, a good estimate of AMPS log file sizes would
475
+ be 2MB per 10 million messages published.</p>
476
+ <p>Logging space overhead can be capped by implementing a log rotation
477
+ strategy which uses the same file name for each rotation. This strategy
478
+ effectively truncates the file when it reaches the log rotation
479
+ threshold to prevent it from growing larger.</p>
480
+ </div>
481
+ <div class="section" id="sow-topics">
482
+ <h4>SOW Topics<a class="headerlink" href="#sow-topics" title="Permalink to this headline">¶</a></h4>
483
+ <p id="index-4">When calculating the amount of storage to reserve for topics in the
484
+ SOW, there are a couple of factors to keep in mind.
485
+ The first is the average size of messages stored in the SOW,
486
+ the number of messages stored in the SOW and the <code class="docutils literal"><span class="pre">SlabSize</span></code> defined in
487
+ the configuration file for each <code class="docutils literal"><span class="pre">Topic</span></code>. Using these values, it is possible
488
+ to estimate the minimum and maximum storage requirements for the SOW.</p>
489
+ <p>A rough estimate of the minimum size for a SOW topic is as follows:</p>
490
+ <div class="code highlight-default"><div class="highlight"><pre><span></span><span class="n">Min</span> <span class="o">=</span> <span class="p">(</span> <span class="n">MsgSize</span> <span class="o">*</span> <span class="n">MsgCount</span> <span class="p">)</span> <span class="o">+</span> <span class="p">(</span> <span class="n">Cores</span> <span class="o">*</span> <span class="n">SlabSize</span> <span class="p">)</span>
491
+ </pre></div>
492
+ </div>
493
+ <p><em>Minimum SOW Size</em></p>
494
+ <p>where:</p>
495
+ <blockquote>
496
+ <div><div class="line-block">
497
+ <div class="line"><code class="docutils literal"><span class="pre">Min</span> <span class="pre">=</span> <span class="pre">Minimum</span> <span class="pre">SOW</span> <span class="pre">size</span></code></div>
498
+ <div class="line"><code class="docutils literal"><span class="pre">MsgSize</span> <span class="pre">=</span> <span class="pre">Average</span> <span class="pre">SOW</span> <span class="pre">message</span> <span class="pre">size</span></code></div>
499
+ <div class="line"><code class="docutils literal"><span class="pre">MsgCount</span> <span class="pre">=</span> <span class="pre">Number</span> <span class="pre">of</span> <span class="pre">SOW</span> <span class="pre">messages</span></code></div>
500
+ <div class="line"><code class="docutils literal"><span class="pre">Cores</span> <span class="pre">=</span> <span class="pre">Number</span> <span class="pre">of</span> <span class="pre">processor</span> <span class="pre">cores</span> <span class="pre">in</span> <span class="pre">the</span> <span class="pre">system</span></code></div>
501
+ <div class="line"><code class="docutils literal"><span class="pre">SlabSize</span> <span class="pre">=</span> <span class="pre">Slab</span> <span class="pre">Size</span> <span class="pre">for</span> <span class="pre">the</span> <span class="pre">SOW</span></code></div>
502
+ </div>
503
+ </div></blockquote>
504
+ <p>A rough estimate of the maximum size for a SOW topic is as follows:</p>
505
+ <div class="code highlight-default"><div class="highlight"><pre><span></span><span class="n">Max</span> <span class="o">=</span> <span class="p">(</span> <span class="p">(</span> <span class="n">MsgCount</span> <span class="o">/</span> <span class="p">(</span> <span class="p">(</span> <span class="n">SlabSize</span> <span class="o">/</span> <span class="n">MsgSize</span><span class="p">)</span> <span class="o">/</span> <span class="mi">2</span><span class="p">)</span> <span class="p">)</span> <span class="o">*</span> <span class="n">SlabSize</span><span class="p">)</span> <span class="o">+</span> <span class="p">(</span><span class="n">Cores</span> <span class="o">*</span> <span class="n">SlabSize</span><span class="p">)</span>
506
+ </pre></div>
507
+ </div>
508
+ <p><em>Maximum SOW Size</em></p>
509
+ <p>where:</p>
510
+ <blockquote>
511
+ <div><div class="line-block">
512
+ <div class="line"><code class="docutils literal"><span class="pre">Max</span> <span class="pre">=</span> <span class="pre">Maximum</span> <span class="pre">SOW</span> <span class="pre">size</span></code></div>
513
+ <div class="line"><code class="docutils literal"><span class="pre">MsgCount</span> <span class="pre">=</span> <span class="pre">Number</span> <span class="pre">of</span> <span class="pre">SOW</span> <span class="pre">messages</span></code></div>
514
+ <div class="line"><code class="docutils literal"><span class="pre">SlabSize</span> <span class="pre">=</span> <span class="pre">Slab</span> <span class="pre">size</span> <span class="pre">for</span> <span class="pre">the</span> <span class="pre">SOW</span></code></div>
515
+ <div class="line"><code class="docutils literal"><span class="pre">MsgSize</span> <span class="pre">=</span> <span class="pre">Average</span> <span class="pre">SOW</span> <span class="pre">message</span> <span class="pre">size</span></code></div>
516
+ <div class="line"><code class="docutils literal"><span class="pre">Cores</span> <span class="pre">=</span> <span class="pre">Number</span> <span class="pre">of</span> <span class="pre">CPU</span> <span class="pre">cores</span> <span class="pre">in</span> <span class="pre">the</span> <span class="pre">system</span></code></div>
517
+ </div>
518
+ </div></blockquote>
519
+ <p>The storage requirements should be between the two values above, however
520
+ it is still possible for the SOW to consume additional storage based on
521
+ the unused capacity configured for each SOW topic.</p>
522
+ <p>Notice that, as suggested in this calculation, AMPS reserves the configured
523
+ <code class="docutils literal"><span class="pre">SlabSize</span></code> for each processor core in the system the first time a thread
524
+ running on that core writes to the SOW.</p>
525
+ <p>For example, in an AMPS configuration file with the <code class="docutils literal"><span class="pre">SlabSize</span></code> set to
526
+ 1MB, the SOW for this topic will consume 1MB per processor core with no
527
+ messages stored in the SOW. Pre-allocating SOW capacity in chunks, as a
528
+ chunk is needed, is more efficient for the operating system and storage
529
+ devices, and helps amortize the SOW extension costs over more messages.</p>
530
+ <p>It is also important to be aware of the maximum message size that AMPS
531
+ guarantees the SOW can hold. The maximum message size is calculated in
532
+ the following manner:</p>
533
+ <div class="code highlight-default"><div class="highlight"><pre><span></span><span class="n">Max</span> <span class="o">=</span> <span class="n">SlabSize</span> <span class="o">-</span> <span class="mi">64</span> <span class="nb">bytes</span>
534
+ </pre></div>
535
+ </div>
536
+ <p><em>Maximum Message Size allowed in SOW</em></p>
537
+ <p>where:</p>
538
+ <blockquote>
539
+ <div><div class="line-block">
540
+ <div class="line"><code class="docutils literal"><span class="pre">Max</span> <span class="pre">=</span> <span class="pre">Maximum</span> <span class="pre">message</span> <span class="pre">size</span> <span class="pre">that</span> <span class="pre">can</span> <span class="pre">be</span> <span class="pre">stored</span> <span class="pre">in</span> <span class="pre">the</span> <span class="pre">SOW</span></code></div>
541
+ <div class="line"><code class="docutils literal"><span class="pre">SlabSize</span> <span class="pre">=</span> <span class="pre">The</span> <span class="pre">configured</span> <span class="pre">SlabSize</span> <span class="pre">for</span> <span class="pre">the</span> <span class="pre">SOW</span></code></div>
542
+ </div>
543
+ </div></blockquote>
544
+ <p>This calculation says that the maximum message size that can be stored
545
+ in the SOW in a single message is the <code class="docutils literal"><span class="pre">SlabSize</span></code> minus 64
546
+ bytes for the record header information.</p>
547
+ </div>
548
+ <div class="section" id="transaction-logs">
549
+ <h4>Transaction Logs<a class="headerlink" href="#transaction-logs" title="Permalink to this headline">¶</a></h4>
550
+ <p>Transaction logs are used for message replay, replication and to ensure
551
+ consistency in environments where each message is critical. Transaction
552
+ logs are optional in AMPS (though some features require them), and transaction
553
+ logs can be configured to record specific topics.</p>
554
+ <p>When planning for transaction logs, there are three main considerations:</p>
555
+ <ol class="arabic simple">
556
+ <li>The total size needed for the transaction log, including in
557
+ disaster recovery scenarios</li>
558
+ <li>The size to allow for each file that makes up the transaction log</li>
559
+ <li>How many files to preallocate</li>
560
+ </ol>
561
+ <p>You can calculate the approximate total size of the transaction log
562
+ once the system reaches steady state as follows:</p>
563
+ <div class="code highlight-default"><div class="highlight"><pre><span></span><span class="n">Capacity</span> <span class="o">=</span> <span class="p">(</span> <span class="n">S</span> <span class="o">+</span> <span class="mi">512</span> <span class="nb">bytes</span> <span class="p">)</span> <span class="o">*</span> <span class="n">N</span> <span class="o">+</span> <span class="p">(</span> <span class="n">J</span> <span class="p">)</span> <span class="o">+</span> <span class="p">(</span> <span class="n">TI</span> <span class="p">)</span>
564
+ </pre></div>
565
+ </div>
566
+ <p><em>Transaction Log Sizing Approximation</em></p>
567
+ <p>where:</p>
568
+ <blockquote>
569
+ <div><div class="line-block">
570
+ <div class="line"><code class="docutils literal"><span class="pre">Capacity</span> <span class="pre">=</span> <span class="pre">Estimated</span> <span class="pre">storage</span> <span class="pre">capacity</span> <span class="pre">required</span> <span class="pre">for</span> <span class="pre">transaction</span> <span class="pre">log</span></code></div>
571
+ <div class="line"><code class="docutils literal"><span class="pre">S</span> <span class="pre">=</span> <span class="pre">Average</span> <span class="pre">message</span> <span class="pre">size</span></code></div>
572
+ <div class="line"><code class="docutils literal"><span class="pre">N</span> <span class="pre">=</span> <span class="pre">Number</span> <span class="pre">of</span> <span class="pre">messages</span> <span class="pre">to</span> <span class="pre">retain</span></code></div>
573
+ <div class="line"><code class="docutils literal"><span class="pre">J</span> <span class="pre">=</span> <span class="pre">Journal</span> <span class="pre">file</span> <span class="pre">size</span></code></div>
574
+ <div class="line"><code class="docutils literal"><span class="pre">TI</span> <span class="pre">=</span> <span class="pre">Topic</span> <span class="pre">Index</span> <span class="pre">(if</span> <span class="pre">configured),</span> <span class="pre">larger</span> <span class="pre">of</span> <span class="pre">200MB</span> <span class="pre">or</span> <span class="pre">(64</span> <span class="pre">*</span> <span class="pre">number</span> <span class="pre">of</span> <span class="pre">messages</span> <span class="pre">indexed)</span></code></div>
575
+ </div>
576
+ </div></blockquote>
577
+ <p>Size your files to match the aging policy for the transaction log data.
578
+ To remove data from the transaction log, use AMPS actions to remove the
579
+ journal files that are no longer needed. You can size your files to make this
580
+ easier. For example, if your application typically generates 100GB a day
581
+ of transaction log, you could size your files in 25GB units to make it
582
+ easier to remove 100GB increments.</p>
583
+ <p>AMPS allows you to preallocate files for the transaction log. For
584
+ applications that are very latency-sensitive, preallocation can help
585
+ provide consistent latency. We recommend that those applications
586
+ preallocate files, if storage capacity and retention policy permit. For
587
+ example, an application that sees heavy throughput during a working day
588
+ might preallocate enough files so that there is no need for additional
589
+ allocation within the working day.</p>
590
+ <p>Notice that, if your application uses replication, the AMPS transaction log
591
+ maintenance actions will not delete unreplicated messages that this instance
592
+ is responsible for replicating. This means that, when calculating the maximum
593
+ storage space required, the recovery window for a failure is also important.
594
+ For example, many systems have a policy of not restarting a failed system
595
+ until a scheduled maintenance window: if one server in a replicated set of
596
+ servers could, potentially, be offline for up to 8 hours, then the other
597
+ servers must be able to store a minimum of 8 hours of journals, even in cases
598
+ where the normal retention period would be shorter.</p>
599
+ </div>
600
+ <div class="section" id="file-backed-queue-metadata">
601
+ <h4>File-Backed Queue Metadata<a class="headerlink" href="#file-backed-queue-metadata" title="Permalink to this headline">¶</a></h4>
602
+ <p>AMPS can, optionally, persist queue metadata to the filesystem to
603
+ allow metadata to be paged out of memory and potentially
604
+ improve recovery time.</p>
605
+ <p>For any queue that uses the <code class="docutils literal"><span class="pre">FileBackedMetadata</span></code> option,
606
+ the following formula can be used to estimate the storage space
607
+ that AMPS may use for each queue:</p>
608
+ <div class="code highlight-default"><div class="highlight"><pre><span></span><span class="n">GREATER</span> <span class="n">OF</span> <span class="p">(</span> <span class="p">(</span><span class="n">MaxMsgCount</span> <span class="o">*</span> <span class="mi">250</span> <span class="nb">bytes</span> <span class="p">)</span> <span class="ow">or</span> <span class="mi">4</span><span class="n">MB</span> <span class="p">)</span>
609
+ </pre></div>
610
+ </div>
611
+ <p><em>Queue Metadata Size</em></p>
612
+ <p>where:</p>
613
+ <blockquote>
614
+ <div><div class="line-block">
615
+ <div class="line"><code class="docutils literal"><span class="pre">MaxMsgCount</span> <span class="pre">=</span> <span class="pre">Maximum</span> <span class="pre">number</span> <span class="pre">of</span> <span class="pre">messages</span> <span class="pre">active</span> <span class="pre">in</span> <span class="pre">the</span> <span class="pre">queue</span></code></div>
616
+ </div>
617
+ </div></blockquote>
618
+ <p>The maximum number of messages active is the largest number of
619
+ unacknowledged messages in the queue since the instance was
620
+ started, as measured by the maximum value of the <code class="docutils literal"><span class="pre">queue_depth</span></code>
621
+ metric for the queue. Notice that if the queue also uses
622
+ the <code class="docutils literal"><span class="pre">TargetQueueDepth</span></code> option, the active message count will
623
+ typically be the <code class="docutils literal"><span class="pre">TargetQueueDepth</span></code> unless AMPS has temporarily
624
+ expanded this depth to avoid halting queue delivery.</p>
625
+ <p>AMPS preallocates files of approximately 4MB for the metadata
626
+ cache, then grows the file if needed to maintain metadata. The
627
+ size of the file does not shrink while the instance is running.
628
+ AMPS may reduce the size of the file during recovery. As with
629
+ all capacity estimates, this formula is intended to provide a
630
+ working approximation of the amount of disk space needed, and
631
+ does not mean that the file will be precisely the size the
632
+ formula indicates.</p>
633
+ </div>
634
+ <div class="section" id="choosing-storage-devices">
635
+ <h4>Choosing Storage Devices<a class="headerlink" href="#choosing-storage-devices" title="Permalink to this headline">¶</a></h4>
636
+ <p>The previous sections discuss the scope of sizing the storage, however
637
+ scenarios exist where the performance of the storage devices must also
638
+ be taken into consideration.</p>
639
+ <p>In cases where messages are persisted (to the transaction log, to a
640
+ topic in the SOW, or both), overall throughput of the instance
641
+ can be limited by the performance of the storage device. It
642
+ is important that the storage device be able to keep up with the peak
643
+ rate at which the instance will receive messages.</p>
644
+ <p>Different aspects of the AMPS server have different patterns of
645
+ access to storage, as shown below:</p>
646
+ <table border="1" class="docutils" id="id1">
647
+ <caption><span class="caption-text"><em>Access patterns for AMPS features</em></span><a class="headerlink" href="#id1" title="Permalink to this table">¶</a></caption>
648
+ <colgroup>
649
+ <col width="50%" />
650
+ <col width="50%" />
651
+ </colgroup>
652
+ <thead valign="bottom">
653
+ <tr class="row-odd"><th class="head"><strong>Feature</strong></th>
654
+ <th class="head"><strong>Storage Usage</strong></th>
655
+ </tr>
656
+ </thead>
657
+ <tbody valign="top">
658
+ <tr class="row-even"><td>State of the World</td>
659
+ <td>Random access read/write/update</td>
660
+ </tr>
661
+ <tr class="row-odd"><td>Transaction Log</td>
662
+ <td>Sequential write for recording
663
+ messages / sequential read for
664
+ replay, replication and queue
665
+ message distribution</td>
666
+ </tr>
667
+ <tr class="row-even"><td>Error and Event Log</td>
668
+ <td>Sequential write only</td>
669
+ </tr>
670
+ <tr class="row-odd"><td>Statistics Database</td>
671
+ <td>Random access read/write/update</td>
672
+ </tr>
673
+ </tbody>
674
+ </table>
675
+ <p>For each of these uses, ensure that the underlying system has enough
676
+ I/O bandwidth to meet the needs of an instance. For example, publishing
677
+ to a topic that is in the SOW and also recorded in the transaction
678
+ log will write the message to both the SOW and the transaction
679
+ log, and may (depending on logging settings) also generate a write to the
680
+ error and event log.</p>
681
+ <p>Consider a case where an instance is recording messages in the transaction
682
+ log at a high incoming message rate. If performance greater than 50MB/second
683
+ is required for the AMPS transaction log, experience has demonstrated
684
+ that flash storage (or better) would be recommended. Magnetic hard disks
685
+ lack the performance to produce results greater than this with a consistent
686
+ latency profile.</p>
687
+ <p>For applications that require high performance and persist state, 60East
688
+ recommends separate storage for the SOW, the transaction log and the
689
+ error and event log where practical.</p>
690
+ </div>
691
+ </div>
692
+ <div class="section" id="cpu">
693
+ <h3>CPU<a class="headerlink" href="#cpu" title="Permalink to this headline">¶</a></h3>
694
+ <p id="index-5">SOW queries with content filtering make heavy use
695
+ of CPU-based operations and, as such, CPU performance directly impacts
696
+ the content filtering performance and rates at which AMPS processes
697
+ messages. The number of cores within a CPU largely determines how
698
+ quickly SOW queries execute.</p>
699
+ <p>AMPS contains optimizations which are only enabled on recent 64-bit x86
700
+ CPUs. To achieve the highest level performance, consider deploying on a
701
+ CPU which includes support for the SSE 4.2 instruction set.</p>
702
+ <p>To give an idea of AMPS performance, repeated testing has demonstrated
703
+ that a moderate query filter with 5 predicates can be executed against
704
+ 1KB messages at more than 1,000,000 messages per second, per core on an
705
+ Intel i7 3GHz CPU. This applies to both subscription based content
706
+ filtering and SOW queries. Actual messaging rates will vary based on
707
+ matching ratios and network utilization.</p>
708
+ </div>
709
+ <div class="section" id="network">
710
+ <h3>Network<a class="headerlink" href="#network" title="Permalink to this headline">¶</a></h3>
711
+ <p id="index-6">When capacity planning a network for AMPS, the requirements for messaging
712
+ traffic are largely dependent on the following factors:</p>
713
+ <ul class="simple">
714
+ <li>Average message size</li>
715
+ <li>The rate at which publishers will publish messages to AMPS</li>
716
+ <li>The number of publishers and the number of subscribers</li>
717
+ </ul>
718
+ <p>AMPS requires sufficient network capacity to service inbound publishing
719
+ as well as outbound messaging requirements. In most deployments,
720
+ outbound messaging to subscribers and query clients has the highest
721
+ bandwidth requirements due to the increased likeliness for a “one to
722
+ many” relationship of a single published message matching
723
+ subscriptions/queries for many clients.</p>
724
+ <p>Estimating network capacity requires knowledge about several factors,
725
+ including but not limited to: the average message size published to the
726
+ AMPS instance, the number of messages published per second, the average
727
+ expected match ratio per subscription, the number of subscriptions, and
728
+ the background query load. Once these key metrics are known, then the
729
+ necessary network capacity can be calculated:</p>
730
+ <div class="code highlight-default"><div class="highlight"><pre><span></span><span class="n">R</span> <span class="o">*</span> <span class="n">Sz</span> <span class="p">(</span> <span class="mi">1</span> <span class="o">+</span> <span class="n">M</span> <span class="o">*</span> <span class="n">Sb</span> <span class="p">)</span> <span class="o">+</span> <span class="n">Q</span>
731
+ </pre></div>
732
+ </div>
733
+ <p><em>Network capacity formula</em></p>
734
+ <p>where:</p>
735
+ <blockquote>
736
+ <div><div class="line-block">
737
+ <div class="line"><code class="docutils literal"><span class="pre">R</span>&#160; <span class="pre">=</span> <span class="pre">Rate</span></code></div>
738
+ <div class="line"><code class="docutils literal"><span class="pre">Sz</span> <span class="pre">=</span> <span class="pre">Average</span> <span class="pre">Message</span> <span class="pre">Size</span></code></div>
739
+ <div class="line"><code class="docutils literal"><span class="pre">M</span>&#160; <span class="pre">=</span> <span class="pre">Match</span> <span class="pre">Ratio</span></code></div>
740
+ <div class="line"><code class="docutils literal"><span class="pre">Sb</span> <span class="pre">=</span> <span class="pre">Number</span> <span class="pre">of</span> <span class="pre">Subscribers</span></code></div>
741
+ <div class="line"><code class="docutils literal"><span class="pre">Q</span>&#160; <span class="pre">=</span> <span class="pre">Query</span> <span class="pre">Load</span></code></div>
742
+ </div>
743
+ </div></blockquote>
744
+ <p>where “Query Load” is defined as:</p>
745
+ <div class="code highlight-default"><div class="highlight"><pre><span></span><span class="n">Mq</span> <span class="o">*</span> <span class="n">S</span> <span class="o">*</span> <span class="n">Qs</span>
746
+ </pre></div>
747
+ </div>
748
+ <p>where:</p>
749
+ <blockquote>
750
+ <div><div class="line-block">
751
+ <div class="line"><code class="docutils literal"><span class="pre">Mq</span> <span class="pre">=</span> <span class="pre">Messages</span> <span class="pre">per</span> <span class="pre">Query</span></code></div>
752
+ <div class="line"><code class="docutils literal"><span class="pre">S</span> <span class="pre">=</span> <span class="pre">Average</span> <span class="pre">Message</span> <span class="pre">Size</span></code></div>
753
+ <div class="line"><code class="docutils literal"><span class="pre">Qs</span> <span class="pre">=</span> <span class="pre">Queries</span> <span class="pre">per</span> <span class="pre">Second</span></code></div>
754
+ </div>
755
+ </div></blockquote>
756
+ <p>In a deployment required to process published messages at a rate of 5000
757
+ messages per second, with each message having an average message size of
758
+ 600 bytes, the expected match rate per subscription is 2% (or 0.02) with
759
+ 100 subscriptions. The deployment is also expected to process 5 queries
760
+ per 1 minute (or 12 queries per second), with each query expected to
761
+ return 1000 messages.</p>
762
+ <div class="code highlight-default"><div class="highlight"><pre><span></span><span class="mi">5000</span> <span class="o">*</span> <span class="mi">600</span> <span class="n">B</span> <span class="o">*</span> <span class="p">(</span> <span class="mi">1</span> <span class="o">+</span> <span class="mf">0.02</span> <span class="o">*</span> <span class="mi">100</span> <span class="p">)</span> <span class="o">+</span> <span class="p">(</span> <span class="mi">1000</span> <span class="o">*</span> <span class="mi">600</span> <span class="n">B</span> <span class="o">*</span> <span class="mi">1</span><span class="o">/</span><span class="mi">12</span> <span class="p">)</span> <span class="o">~</span> <span class="mi">9</span> <span class="n">MB</span> <span class="o">/</span> <span class="n">s</span> <span class="o">~</span> <span class="mi">72</span> <span class="n">Mb</span> <span class="o">/</span> <span class="n">s</span>
763
+ </pre></div>
764
+ </div>
765
+ <p>Based on these requirements, this deployment would need at least 72Mb/s
766
+ of network capacity to achieve the desired goals. This analysis
767
+ demonstrates AMPS by itself would fall into a 100Mb/s class network. It
768
+ is important to note, this analysis does not examine any other network
769
+ based activity which may exist on the host and as such, a larger
770
+ capacity networking infrastructure than 100Mb/s would likely be
771
+ required.</p>
772
+ <div class="section" id="replication-network-bandwidth">
773
+ <h4>Replication Network Bandwidth<a class="headerlink" href="#replication-network-bandwidth" title="Permalink to this headline">¶</a></h4>
774
+ <p>For replication connections, the general recommendation is to estimate
775
+ bandwidth needs as though each outgoing replication destination is
776
+ a subscriber that subscribes to all of the replicated topics, and each incoming
777
+ destination is a publisher that fully publishes the replicated topics. Although
778
+ AMPS replication connections support compression, the general recommendation
779
+ is to provision enough network capacity to support the full replication
780
+ stream, and then to use compression to save capacity.</p>
781
+ </div>
782
+ <div class="section" id="additional-network-considerations">
783
+ <h4>Additional Network Considerations<a class="headerlink" href="#additional-network-considerations" title="Permalink to this headline">¶</a></h4>
784
+ <p>When calculating the available bandwidth for an instance, it is also
785
+ important to take into account any other use of the network. For example,
786
+ if the system uses network attached storage, and the traffic to that
787
+ storage is not isolated from messaging traffic, bandwidth to the
788
+ storage device should also be taken into account when planning the
789
+ network capacity available to the instance.</p>
790
+ <p>Likewise, any other process that consumes bandwidth, such as monitoring
791
+ applications or log collection processes, should be considered when
792
+ planning the overall bandwidth capacity available.</p>
793
+ </div>
794
+ </div>
795
+ <div class="section" id="numa-considerations">
796
+ <h3>NUMA Considerations<a class="headerlink" href="#numa-considerations" title="Permalink to this headline">¶</a></h3>
797
+ <p>AMPS is designed to take advantage of non-uniform memory access (NUMA).
798
+ For the lowest latency in networking, we recommend that you install your
799
+ NIC in the slot closest to NUMA node 0. When AMPS NUMA tuning is enabled,
800
+ AMPS runs critical threads on node 0, so positioning the NIC closest to that
801
+ node provides the shortest path from processor to NIC.</p>
802
+ <p>When a single instance of AMPS is deployed on the system (physical host), as
803
+ is the case with most critical production systems, 60East recommends leaving
804
+ AMPS NUMA tuning enabled (this is the default).</p>
805
+ <p>If more than one instance of AMPS is running on the same physical host,
806
+ or if other CPU-intensive processes are running on the same physical
807
+ host, 60East recommends disabling AMPS NUMA tuning in the AMPS
808
+ configuration file and relying on the operating system NUMA management.
809
+ Likewise, if a mechanism is used to restrict AMPS to specific processors,
810
+ AMPS NUMA tuning should be disabled.</p>
811
+ <div class="admonition important">
812
+ <p class="first admonition-title">Important</p>
813
+ <p class="last">When AMPS is deployed on a virtual machine, 60East recommends disabling
814
+ the AMPS level NUMA tuning in the configuration file.</p>
815
+ </div>
816
+ </div>
817
+ </div>
818
+ <div class="section" id="linux-operating-system-configuration">
819
+ <span id="operation-linux-os-system-configuration"></span><h2>Linux Operating System Configuration<a class="headerlink" href="#linux-operating-system-configuration" title="Permalink to this headline">¶</a></h2>
820
+ <p>This section covers some settings which are specific to running AMPS on
821
+ a Linux Operating System.</p>
822
+ <div class="section" id="ulimit">
823
+ <span id="section-operation-deployment-linux-ulimit"></span><h3>ulimit<a class="headerlink" href="#ulimit" title="Permalink to this headline">¶</a></h3>
824
+ <p>The <code class="docutils literal"><span class="pre">ulimit</span></code> command is used by a Linux administrator to get and set
825
+ user limits on various system resources.</p>
826
+ <p><code class="docutils literal"><span class="pre">ulimit</span> <span class="pre">-c</span></code></p>
827
+ <p>It is common for an AMPS instance to be configured to consume gigabytes
828
+ of memory for large SOW caches. If a failure were to occur in a large
829
+ deployment it could take seconds (maybe even hours, depending on storage
830
+ performance and process size) to dump the core file. AMPS has a
831
+ minidump reporting mechanism built in that collects information
832
+ important to debugging an instance before exiting. This minidump is much
833
+ faster than dumping a core file to disk. For this reason, it is
834
+ recommended that the per user core file size limit is set to 0 to
835
+ prevent a large process image from being dumped to storage.</p>
836
+ <p><code class="docutils literal"><span class="pre">ulimit</span> <span class="pre">-n</span></code></p>
837
+ <p>The number of file descriptors allowed for a user running AMPS needs to
838
+ be at least double the sum of counts for the following: connected
839
+ clients, SOW topics and pre-allocated journal files.</p>
840
+ <ul class="simple">
841
+ <li><em>Minimum:</em> 4096</li>
842
+ <li><em>Recommended:</em> 32768, or the value recommended by AMPS in any diagnostic
843
+ messages, whichever is greater</li>
844
+ </ul>
845
+ </div>
846
+ <div class="section" id="transparent-huge-pages">
847
+ <span id="index-7"></span><h3>Transparent Huge Pages<a class="headerlink" href="#transparent-huge-pages" title="Permalink to this headline">¶</a></h3>
848
+ <p>Transparent huge pages is enabled by default for most linux distributions,
849
+ which can add significant overhead to memory management. For this reason
850
+ 60East recommends changing the setting to <code class="docutils literal"><span class="pre">madvise</span></code>, which requires
851
+ applications to explicitly request use of transparent huge pages. Previously
852
+ the recommendation was to use <code class="docutils literal"><span class="pre">never</span></code>, which is still acceptable, but is
853
+ less flexible as it disables transparent huge pages for all applications
854
+ running on the system.</p>
855
+ <p>To change the setting until the operating system is rebooted, the following
856
+ command can be used:</p>
857
+ <div class="code bash highlight-default"><div class="highlight"><pre><span></span><span class="n">echo</span> <span class="n">never</span> <span class="o">&gt;</span> <span class="o">/</span><span class="n">sys</span><span class="o">/</span><span class="n">kernel</span><span class="o">/</span><span class="n">mm</span><span class="o">/</span><span class="n">transparent_hugepage</span><span class="o">/</span><span class="n">enabled</span>
858
+ </pre></div>
859
+ </div>
860
+ <p>To make a permanent change to this setting, add the above command to the
861
+ startup scripts, or add the <code class="docutils literal"><span class="pre">transparent_hugepage=madvise</span></code> option to the kernel
862
+ startup flags (see the documentation for your Linux distribution for details).</p>
863
+ <p><em>Recommended: madvise</em></p>
864
+ </div>
865
+ <div class="section" id="proc-sys-fs-aio-max-nr">
866
+ <h3>/proc/sys/fs/aio-max-nr<a class="headerlink" href="#proc-sys-fs-aio-max-nr" title="Permalink to this headline">¶</a></h3>
867
+ <p>Each AMPS instance requires AIO in the kernel to support at least 16384
868
+ plus 8192 for each SOW topic in simultaneous I/O operations. The setting
869
+ <code class="docutils literal"><span class="pre">aio-max-nr</span></code> is global to the host and impacts all applications. As
870
+ such this value needs to be set high enough to service all applications
871
+ using AIO on the host.</p>
872
+ <ul class="simple">
873
+ <li><em>Minimum:</em> 65536</li>
874
+ <li><em>Recommended:</em> 1048576</li>
875
+ </ul>
876
+ <p>To view the value of this setting, as root you can enter the following
877
+ command:</p>
878
+ <div class="code bash highlight-default"><div class="highlight"><pre><span></span><span class="n">cat</span> <span class="o">/</span><span class="n">proc</span><span class="o">/</span><span class="n">sys</span><span class="o">/</span><span class="n">fs</span><span class="o">/</span><span class="n">aio</span><span class="o">-</span><span class="nb">max</span><span class="o">-</span><span class="n">nr</span>
879
+ </pre></div>
880
+ </div>
881
+ <p>To edit this value, as root you can enter the following command:</p>
882
+ <div class="code bash highlight-default"><div class="highlight"><pre><span></span><span class="n">sysctl</span> <span class="o">-</span><span class="n">w</span> <span class="n">fs</span><span class="o">.</span><span class="n">aio</span><span class="o">-</span><span class="nb">max</span><span class="o">-</span><span class="n">nr</span> <span class="o">=</span> <span class="mi">1048576</span>
883
+ </pre></div>
884
+ </div>
885
+ <p>This command will update the value for <code class="docutils literal"><span class="pre">/proc/sys/fs/aio-max-nr</span></code> and
886
+ allow 1,048,576 simultaneous I/O operations, but will only do so until
887
+ the next time the machine is rebooted. To make a permanent change to
888
+ this setting, as a root user, edit the <code class="docutils literal"><span class="pre">/etc/sysctl.conf</span></code> file and
889
+ either edit or append the following setting:</p>
890
+ <div class="code bash highlight-default"><div class="highlight"><pre><span></span><span class="n">fs</span><span class="o">.</span><span class="n">aio</span><span class="o">-</span><span class="nb">max</span><span class="o">-</span><span class="n">nr</span> <span class="o">=</span> <span class="mi">1048576</span>
891
+ </pre></div>
892
+ </div>
893
+ </div>
894
+ <div class="section" id="proc-sys-fs-file-max">
895
+ <h3>/proc/sys/fs/file-max<a class="headerlink" href="#proc-sys-fs-file-max" title="Permalink to this headline">¶</a></h3>
896
+ <p>Each AMPS instance needs file descriptors to service connections and
897
+ maintain file handles for open files. This number needs to be at least
898
+ double the sum of counts for the following: connected clients, SOW
899
+ topics and pre-allocated journal files. This file-max setting is global
900
+ to the host and impacts all applications, so this needs to be set high
901
+ enough to service all applications on the host.</p>
902
+ <ul class="simple">
903
+ <li><em>Minimum:</em> 262144</li>
904
+ <li><em>Recommended:</em> 6815744</li>
905
+ </ul>
906
+ <p>To view the value of this setting, as root you can enter the following
907
+ command:</p>
908
+ <div class="code bash highlight-default"><div class="highlight"><pre><span></span><span class="n">cat</span> <span class="o">/</span><span class="n">proc</span><span class="o">/</span><span class="n">sys</span><span class="o">/</span><span class="n">fs</span><span class="o">/</span><span class="n">file</span><span class="o">-</span><span class="nb">max</span>
909
+ </pre></div>
910
+ </div>
911
+ <p>To edit this value, as root you can enter the following command:</p>
912
+ <div class="code bash highlight-default"><div class="highlight"><pre><span></span><span class="n">sysctl</span> <span class="o">-</span><span class="n">w</span> <span class="n">fs</span><span class="o">.</span><span class="n">file</span><span class="o">-</span><span class="nb">max</span> <span class="o">=</span> <span class="mi">6815744</span>
913
+ </pre></div>
914
+ </div>
915
+ <p>This command will update the value for <code class="docutils literal"><span class="pre">/proc/sys/fs/file-max</span></code> and
916
+ allow 6,815,744 concurrent files to be opened, but will only do so until
917
+ the next time the machine is rebooted. To make a permanent change to
918
+ this setting, as a root user, edit the <code class="docutils literal"><span class="pre">/etc/sysctl.conf</span></code> file and
919
+ either edit or append the following setting:</p>
920
+ <div class="code bash highlight-default"><div class="highlight"><pre><span></span><span class="n">fs</span><span class="o">.</span><span class="n">file</span><span class="o">-</span><span class="nb">max</span> <span class="o">=</span> <span class="mi">6815744</span>
921
+ </pre></div>
922
+ </div>
923
+ </div>
924
+ <div class="section" id="proc-sys-vm-min-free-kbytes">
925
+ <h3>/proc/sys/vm/min_free_kbytes<a class="headerlink" href="#proc-sys-vm-min-free-kbytes" title="Permalink to this headline">¶</a></h3>
926
+ <p>This parameter sets the minimum amount of memory to keep free in the system.
927
+ Setting this value properly can help the operating system function more
928
+ effectively in low-memory situations. If this value is set too low, the
929
+ operating system can have difficulty reclaiming memory, which can lead
930
+ to unnecessary out-of-memory events. If this value is set too high, overall
931
+ system efficiency decreases as the operating system can spend more time
932
+ than necessary reclaiming memory.</p>
933
+ <p>60East recommends setting this parameter to 1% of the physical memory
934
+ on the system, rounding up to the nearest GB.</p>
935
+ <p id="index-8">Notice that the units of this parameter are in kilobytes. For example, to set
936
+ this value for a system that has 128GB of memory, you would calculate 1% of
937
+ the physical memory (1.28 GB), round up to the nearest GB (2 GB) and then
938
+ allocate 2000000 KB as the min_free_kbytes.</p>
939
+ <ul class="simple">
940
+ <li><em>Minimum:</em> 1000000 (1GB)</li>
941
+ <li><em>Recommended:</em> 1% of physical memory, rounded up to the nearest GB</li>
942
+ </ul>
943
+ <p>To edit this value, as root you can enter the following command:</p>
944
+ <div class="code bash highlight-default"><div class="highlight"><pre><span></span><span class="n">sysctl</span> <span class="o">-</span><span class="n">w</span> <span class="n">vm</span><span class="o">.</span><span class="n">min_free_kbytes</span><span class="o">=</span><span class="mi">2000000</span>
945
+ </pre></div>
946
+ </div>
947
+ <p>Notice that this tuning recommendation is designed for a server-class machine
948
+ with a reasonable amount of memory. For a small development machine or
949
+ blade (for example, a system with less than 32GB of memory), leaving this
950
+ parameter at the operating system default may be more appropriate.</p>
951
+ </div>
952
+ <div class="section" id="proc-sys-vm-max-map-count">
953
+ <h3>/proc/sys/vm/max_map_count<a class="headerlink" href="#proc-sys-vm-max-map-count" title="Permalink to this headline">¶</a></h3>
954
+ <p>AMPS makes extensive use of memory mapped files, and frequently modifies the
955
+ maps. The <code class="docutils literal"><span class="pre">/proc/sys/vm/max_map_count</span></code> parameter sets the maximum number of
956
+ maps that the Linux kernel will allow for a process. If the number of
957
+ requested maps exceeds the number of maps in this parameter, memory allocation
958
+ operations can fail even when there is sufficient memory available.</p>
959
+ <p id="index-9">This setting is global to the host and applies to all applications, so this
960
+ needs to be set high enough for the most map-intensive application on the host.</p>
961
+ <ul class="simple">
962
+ <li><em>Minimum:</em> 65530</li>
963
+ <li><em>Recommended:</em> 500000</li>
964
+ </ul>
965
+ <p>To edit this value, as root you can enter the following command:</p>
966
+ <div class="code bash highlight-default"><div class="highlight"><pre><span></span><span class="n">sysctl</span> <span class="o">-</span><span class="n">w</span> <span class="n">vm</span><span class="o">.</span><span class="n">max_map_count</span><span class="o">=</span><span class="mi">500000</span>
967
+ </pre></div>
968
+ </div>
969
+ <p>This command will update the value for <code class="docutils literal"><span class="pre">/proc/sys/vm/max_map_count</span></code> and
970
+ allow 500,000 maps to be created, but will only do so until
971
+ the next time the machine is rebooted. To make a permanent change to
972
+ this setting, as a root user, edit the <code class="docutils literal"><span class="pre">/etc/sysctl.conf</span></code> file and
973
+ either edit or append the following setting:</p>
974
+ <div class="code bash highlight-default"><div class="highlight"><pre><span></span><span class="n">vm</span><span class="o">.</span><span class="n">max_map_count</span><span class="o">=</span><span class="mi">500000</span>
975
+ </pre></div>
976
+ </div>
977
+ </div>
978
+ <div class="section" id="proc-sys-vm-swappiness">
979
+ <h3>/proc/sys/vm/swappiness<a class="headerlink" href="#proc-sys-vm-swappiness" title="Permalink to this headline">¶</a></h3>
980
+ <p>AMPS performs best when the data that it needs to retain is in memory. If
981
+ the operating system needs to use swap because the system requires more
982
+ memory than is available, performance degrades substantially.</p>
983
+ <p>60East recommends that, for systems that host performance-critical instances
984
+ of AMPS, the <code class="docutils literal"><span class="pre">vm.swappiness</span></code> setting is set to <code class="docutils literal"><span class="pre">1</span></code>. This will minimize
985
+ swapping on this system, which will improve performance with the tradeoff
986
+ of making it more likely for processes to be killed by the operating system
987
+ in low-memory situations.</p>
988
+ <p id="index-10">This setting is global to the host and applies to all applications.</p>
989
+ <ul class="simple">
990
+ <li><em>Recommended:</em> 1</li>
991
+ </ul>
992
+ <p>To edit this value, as root you can enter the following command:</p>
993
+ <div class="code bash highlight-default"><div class="highlight"><pre><span></span><span class="n">sysctl</span> <span class="o">-</span><span class="n">w</span> <span class="n">vm</span><span class="o">.</span><span class="n">swappiness</span><span class="o">=</span><span class="mi">1</span>
994
+ </pre></div>
995
+ </div>
996
+ <p>This command will update the value for <code class="docutils literal"><span class="pre">/proc/sys/vm/swappiness</span></code> and
997
+ direct the operating system to avoid using swap space until the system
998
+ is under severe memory pressure.</p>
999
+ <p>Using the command above will change the swappiness setting until the
1000
+ operating system is rebooted.To make a permanent change to
1001
+ this setting, as a root user, edit the <code class="docutils literal"><span class="pre">/etc/sysctl.conf</span></code> file and
1002
+ either edit or append the following setting:</p>
1003
+ <div class="code bash highlight-default"><div class="highlight"><pre><span></span><span class="n">vm</span><span class="o">.</span><span class="n">swappiness</span><span class="o">=</span><span class="mi">1</span>
1004
+ </pre></div>
1005
+ </div>
1006
+ </div>
1007
+ <div class="section" id="proc-sys-net-ipv4-tcp-frto">
1008
+ <h3>/proc/sys/net/ipv4/tcp_frto<a class="headerlink" href="#proc-sys-net-ipv4-tcp-frto" title="Permalink to this headline">¶</a></h3>
1009
+ <p>This option controls whether Forward RTO-Recovery (FRTO) is enabled for the
1010
+ TCP network. Enabling FRTO can be beneficial for overall network performance
1011
+ if a system is <em>sending</em> packets over wireless networks with substantial
1012
+ interference (for example, public WiFi in an urban area). However, this
1013
+ recovery algorithm can reduce performance in wired networks. While this option
1014
+ is enabled on most current Linux distributions by default, disabling the
1015
+ option can improve network performance.</p>
1016
+ <p>60East recommends disabling this option unless the server is directly
1017
+ delivering traffic over a congested WiFi network.</p>
1018
+ <p id="index-11">This setting is global to the host and applies to all applications.</p>
1019
+ <ul class="simple">
1020
+ <li><em>Recommended:</em> 0</li>
1021
+ </ul>
1022
+ <p>To edit this value, as root you can enter the following command:</p>
1023
+ <div class="code bash highlight-default"><div class="highlight"><pre><span></span><span class="n">sysctl</span> <span class="o">-</span><span class="n">w</span> <span class="n">net</span><span class="o">.</span><span class="n">ipv4</span><span class="o">.</span><span class="n">tcp_frto</span><span class="o">=</span><span class="mi">0</span>
1024
+ </pre></div>
1025
+ </div>
1026
+ <p>This command will update the value for <code class="docutils literal"><span class="pre">/proc/sys/net/ipv4/tcp_frto</span></code> and
1027
+ direct the operating system to disable FRTO.</p>
1028
+ <p>Using the command above will change the setting until the
1029
+ operating system is rebooted. To make a permanent change to
1030
+ this setting, as a root user, edit the <code class="docutils literal"><span class="pre">/etc/sysctl.conf</span></code> file and
1031
+ either edit or append the following setting:</p>
1032
+ <div class="code bash highlight-default"><div class="highlight"><pre><span></span><span class="n">net</span><span class="o">.</span><span class="n">ipv4</span><span class="o">.</span><span class="n">tcp_frto</span><span class="o">=</span><span class="mi">0</span>
1033
+ </pre></div>
1034
+ </div>
1035
+ </div>
1036
+ </div>
1037
+ <div class="section" id="upgrading-an-amps-installation">
1038
+ <span id="section-operation-upgrading"></span><h2>Upgrading an AMPS Installation<a class="headerlink" href="#upgrading-an-amps-installation" title="Permalink to this headline">¶</a></h2>
1039
+ <p id="index-12">This chapter describes how to upgrade an existing installation of AMPS.
1040
+ The steps presented here focus on upgrading the installation itself, and
1041
+ should be the only steps you need for upgrades that change the HOTFIX
1042
+ version number or the PREVIEW version number (as described in
1043
+ <a class="reference internal" href="intro.html#table-version-number-info"><span class="std std-ref">AMPS Version Number Components</span></a>).</p>
1044
+ <p>For changes that update the MAJOR or MINOR version number, AMPS may add
1045
+ features, change file or network formats, or change behavior. For these
1046
+ upgrades, you may need to make changes to the AMPS configuration file or
1047
+ update applications to adapt to new features or changes in behavior.</p>
1048
+ <p>60East recommends maintaining a test environment that you can use to
1049
+ test upgrades, particularly when an upgrade changes MAJOR or MINOR
1050
+ versions and you are taking advantage of new features or changed
1051
+ behavior.</p>
1052
+ <p>When the AMPS instance participates in replication, you must coordinate
1053
+ the instance upgrades when upgrading across AMPS versions.</p>
1054
+ <p>AMPS supports replication to and from versions 5.2.0.0 and
1055
+ later for the purposes of rolling upgrade. For long-term deployment,
1056
+ 60East recommends that all AMPS instances that replicate to each other have
1057
+ the same MAJOR and MINOR version number, and preferably run the same release
1058
+ of AMPS.</p>
1059
+ <div class="section" id="upgrade-steps">
1060
+ <h3>Upgrade Steps<a class="headerlink" href="#upgrade-steps" title="Permalink to this headline">¶</a></h3>
1061
+ <p>Upgrading an AMPS installation involves the following steps:</p>
1062
+ <ol class="arabic simple">
1063
+ <li>Stop the running instance</li>
1064
+ <li>Install the new AMPS binaries</li>
1065
+ <li>If you are upgrading from an AMPS version prior to 5.0.0.0, upgrade any
1066
+ data files or configuration files that you want to retain</li>
1067
+ <li>If necessary, update the configuration file for the instance</li>
1068
+ <li>If necessary, update any applications that will use new features</li>
1069
+ <li>Restart the service</li>
1070
+ </ol>
1071
+ <p>AMPS supports replication from version 5.2.0.0 and later to this
1072
+ version of AMPS for the purposes of rolling upgrade with no (or minimal)
1073
+ downtime. 60East recommends that production installations of AMPS have the
1074
+ same MAJOR and MINOR version number at a minimum, and preferably run
1075
+ identical versions of AMPS.</p>
1076
+ </div>
1077
+ <div class="section" id="upgrading-amps-data-files">
1078
+ <h3>Upgrading AMPS Data Files<a class="headerlink" href="#upgrading-amps-data-files" title="Permalink to this headline">¶</a></h3>
1079
+ <p>AMPS may change the format and content of data files when upgrading
1080
+ across versions, as specified by the MAJOR and MINOR version number.
1081
+ This most commonly occurs when new features are added to AMPS that
1082
+ require different or additional information in the persisted files. The
1083
+ HISTORY file for the AMPS release lists when changes have been made that
1084
+ require data file changes.</p>
1085
+ <p>When upgrading to AMPS 5.0 or later, from a release prior to 5.0, you must
1086
+ upgrade the data files. For versions of AMPS 5.0 and later, backward
1087
+ compatibility is maintained and therefore there have been no changes to
1088
+ the data file formats.</p>
1089
+ <p>The AMPS distribution includes the <code class="docutils literal"><span class="pre">amps_upgrade</span></code> utility to process
1090
+ and upgrade data files. Unless you are upgrading from a version of
1091
+ AMPS prior to 5.0, there is no need to use this utility when
1092
+ upgrading AMPS.</p>
1093
+ </div>
1094
+ <div class="section" id="downgrading-amps-data-files">
1095
+ <h3>Downgrading AMPS Data Files<a class="headerlink" href="#downgrading-amps-data-files" title="Permalink to this headline">¶</a></h3>
1096
+ <p>The contents of AMPS data files, including SOW topic files, transaction
1097
+ log journals, and the statistics database are not guaranteed to
1098
+ be backward compatible for versions that change the major, minor,
1099
+ or preview version numbers.</p>
1100
+ <p>Even when the file format is compatible, newer versions of AMPS may
1101
+ include new options or use metadata in a way that older versions
1102
+ of AMPS are not aware of. Downgrading an instance of AMPS
1103
+ while preserving data files may produce unexpected or
1104
+ incorrect behavior.</p>
1105
+ </div>
1106
+ </div>
1107
+ <div class="section" id="best-practices">
1108
+ <span id="operations-and-deployment-best-practices"></span><h2>Best Practices<a class="headerlink" href="#best-practices" title="Permalink to this headline">¶</a></h2>
1109
+ <p>This section covers a selection of best practices for deploying AMPS.</p>
1110
+ <div class="section" id="monitoring">
1111
+ <span id="operations-and-deployment-best-practices-monitoring"></span><h3>Monitoring<a class="headerlink" href="#monitoring" title="Permalink to this headline">¶</a></h3>
1112
+ <p>AMPS exposes the statistics available for monitoring via a RESTful
1113
+ interface, known as the <a class="reference internal" href="monitoring.html#ug-monitoring"><span class="std std-ref">Monitoring Interface</span></a>,
1114
+ which is configured as the administration port. This
1115
+ interface allows developers and administrators to easily inspect various
1116
+ aspects of AMPS performance and resource consumption using standard
1117
+ monitoring tools.</p>
1118
+ <p>At times, AMPS will emit log messages notifying that a thread has
1119
+ encountered a deadlock or stressful operation. These messages will
1120
+ repeat with the word “stuck” in them. AMPS will attempt to resolve these
1121
+ issues, however after 60 seconds of a single thread being stuck, AMPS
1122
+ will automatically emit a minidump to the previously configured minidump
1123
+ directory. This minidump can be used by 60East support to assist in
1124
+ troubleshooting the location of the stuck thread or the stressful
1125
+ process.</p>
1126
+ <p>Monitor the contents of <code class="docutils literal"><span class="pre">dmesg</span></code> on the instance for errors that
1127
+ affect the AMPS process. For example, if the operating system runs low on
1128
+ memory and begins shutting down processes, this information will be
1129
+ recorded in <code class="docutils literal"><span class="pre">dmesg</span></code>. Likewise, system events such as hardware
1130
+ failures that can affect AMPS are most likely to be recorded in the
1131
+ <code class="docutils literal"><span class="pre">dmesg</span></code> output.</p>
1132
+ <p>Another area to examine when monitoring AMPS is the <code class="docutils literal"><span class="pre">last_active</span></code>
1133
+ monitor for the processors. This can be found in the
1134
+ <code class="docutils literal"><span class="pre">/amps/instance/processors/all/last_active</span></code> url in the monitoring
1135
+ interface. If the <code class="docutils literal"><span class="pre">last_active</span></code> value continually increases for more
1136
+ than one minute and there is a noticeable decline in the quality of
1137
+ service, then it may be best to fail-over and restart the AMPS instance.</p>
1138
+ </div>
1139
+ <div class="section" id="logging">
1140
+ <h3>Logging<a class="headerlink" href="#logging" title="Permalink to this headline">¶</a></h3>
1141
+ <p>60East recommends that an instance of AMPS used for production
1142
+ log at <code class="docutils literal"><span class="pre">info</span></code> level (at a minimum). This provides a basic record
1143
+ of the operations requested in AMPS, and is the minimum level of
1144
+ logging needed to troubleshoot most issues. Further, a production
1145
+ instance should have the capacity available to log at a more verbose level
1146
+ if necessary, for troubleshooting and diagnostic purposes.</p>
1147
+ <p>An instance used for development or UAT purposes should typically
1148
+ log at <code class="docutils literal"><span class="pre">trace</span></code> level so that the interaction between an application
1149
+ and AMPS is captured.</p>
1150
+ <p>60East also recommends capturing stdout and stderr for the AMPS
1151
+ process. This can provide information about operating system or
1152
+ runtime errors in the event that a problem occurs outside of
1153
+ the control of AMPS (and, therefore, cannot be recorded in the
1154
+ AMPS event log).</p>
1155
+ </div>
1156
+ <div class="section" id="stopping-amps">
1157
+ <h3>Stopping AMPS<a class="headerlink" href="#stopping-amps" title="Permalink to this headline">¶</a></h3>
1158
+ <p>To stop AMPS, ensure that AMPS runs the <code class="docutils literal"><span class="pre">amps-action-do-shutdown</span></code>
1159
+ action. By default, this action is run when AMPS receives <code class="docutils literal"><span class="pre">SIGHUP</span></code>,
1160
+ <code class="docutils literal"><span class="pre">SIGINT</span></code>, or <code class="docutils literal"><span class="pre">SIGTERM</span></code>. However, you can also configure an action to
1161
+ shut down AMPS in response to other conditions. For example, if your
1162
+ company policy is to reboot servers every Saturday night, and AMPS is
1163
+ not running as a system service (or daemon), you could schedule an AMPS
1164
+ shutdown every Saturday before the system reboot.</p>
1165
+ <p>When AMPS is installed to run as a system service (or daemon), AMPS
1166
+ installs shutdown scripts that will cleanly stop AMPS during a system
1167
+ shutdown or reboot.</p>
1168
+ </div>
1169
+ <div class="section" id="sow-parameters">
1170
+ <span id="operations-and-deployment-best-practices-sow-parameters"></span><h3>SOW Parameters<a class="headerlink" href="#sow-parameters" title="Permalink to this headline">¶</a></h3>
1171
+ <p>Choosing the ideal <code class="docutils literal"><span class="pre">SlabSize</span></code> for your SOW topic is a balance between
1172
+ the frequency of SOW expansion and storage space efficiency. A large
1173
+ <code class="docutils literal"><span class="pre">SlabSize</span></code> will preallocate space for records when AMPS begins writing
1174
+ to the SOW.</p>
1175
+ <p>If detailed tuning is not necessary, 60East recommends leaving the
1176
+ <code class="docutils literal"><span class="pre">SlabSize</span></code> at the default size if your messages are smaller than the
1177
+ default <code class="docutils literal"><span class="pre">SlabSize</span></code>. If your messages are larger than the default
1178
+ SlabSize, a good starting point for the <code class="docutils literal"><span class="pre">SlabSize</span></code> is to set it to
1179
+ several times the maximum message size you expect to store in the SOW.</p>
1180
+ <p>There are three considerations when setting the optimum <code class="docutils literal"><span class="pre">SlabSize</span></code>:</p>
1181
+ <ol class="arabic simple">
1182
+ <li>Frequency of allocations</li>
1183
+ <li>Overall size of the SOW</li>
1184
+ <li>Efficient use of space</li>
1185
+ </ol>
1186
+ <p>A <code class="docutils literal"><span class="pre">SlabSize</span></code> that is small results in frequent extensions of your SOW
1187
+ topic to occur. These frequent extensions can reduce throughput in a
1188
+ heavily loaded system, and in extreme cases can exhaust the kernel limit
1189
+ on the number of regions that a process can map. Increasing the
1190
+ <code class="docutils literal"><span class="pre">SlabSize</span></code> will reduce the number of allocations.</p>
1191
+ <p>When the <code class="docutils literal"><span class="pre">SlabSize</span></code> is large, then the risk of the SOW resize
1192
+ affecting performance is reduced. Since each slab is larger, however,
1193
+ there will be more space consumed if you are only storing a small number
1194
+ of messages: this cost will amortize as the number of messages in the
1195
+ SOW exceeds the <em>number of cores in the system</em> * <em>the number of
1196
+ messages that fit into a slab</em>.</p>
1197
+ <p>To most efficiently use space, set a <code class="docutils literal"><span class="pre">SlabSize</span></code> that minimizes the
1198
+ amount of unused space in a slab. For example, if your message sizes are
1199
+ average 512 bytes but can reach a maximum of 1.2 MB, one approach would
1200
+ be to set a <code class="docutils literal"><span class="pre">SlabSize</span></code> of 2.5MB to hold approximately 5 average-sized
1201
+ messages and two of the larger-sized messages. Looking at the actual
1202
+ distribution of message sizes in the SOW (which can be done with the
1203
+ <code class="docutils literal"><span class="pre">amps_sow_dump</span></code> utility) can help you determine how best to size slabs
1204
+ for maximum space efficiency.</p>
1205
+ <p>For optimizing the <code class="docutils literal"><span class="pre">SlabSize</span></code>, determine how important each aspect of
1206
+ SOW tuning is for your application, and adjust the configuration to
1207
+ balance allocation frequency, overall SOW size, and space to meet the
1208
+ needs of your application.</p>
1209
+ <p>Given AMPS is highly-parallelized, AMPS operates more efficiently when
1210
+ it is able to run tasks in parallel. When considering options for SlabSize,
1211
+ be sure that the value you choose will result in a number of slabs that is
1212
+ at least equal to the number of cores in the system. A SlabSize setting
1213
+ that results in only a few slabs could cause reduced query performance.
1214
+ For example, a system with a single publisher and a SlabSize large enough
1215
+ to hold all of the records produced by that publisher, doesn’t allow a query
1216
+ to be parallelized since all of the records will be in a single slab.</p>
1217
+ </div>
1218
+ <div class="section" id="slow-clients">
1219
+ <span id="operations-and-deployment-best-practices-slow-clients"></span><h3>Slow Clients<a class="headerlink" href="#slow-clients" title="Permalink to this headline">¶</a></h3>
1220
+ <p id="index-13">As described in <a class="reference internal" href="ha.html#ug-slow-client-management"><span class="std std-ref">Slow Client Management</span></a>,
1221
+ AMPS provides capacity limits for slow clients to reduce the memory resources
1222
+ consumed by slow clients. This section discusses tuning slow client handling to
1223
+ achieve your availability goals.</p>
1224
+ <div class="section" id="slow-client-offlining-for-large-result-sets">
1225
+ <span id="ug-ops-client-offlining"></span><span id="index-14"></span><h4>Slow Client Offlining for Large Result Sets<a class="headerlink" href="#slow-client-offlining-for-large-result-sets" title="Permalink to this headline">¶</a></h4>
1226
+ <p>The default settings for AMPS work well in a wide variety of
1227
+ applications with minimal tuning.</p>
1228
+ <p>If you have particularly large SOW topics and your application is
1229
+ disconnecting clients due to exceeding the offlining threshold when the
1230
+ clients are retrieving large SOW query result sets, 60East recommends the
1231
+ following settings as a baseline for further tuning:</p>
1232
+ <span id="index-15"></span><table border="1" class="docutils" id="id2">
1233
+ <caption><span class="caption-text"><em>Client Offline Settings for Large Result Sets</em></span><a class="headerlink" href="#id2" title="Permalink to this table">¶</a></caption>
1234
+ <colgroup>
1235
+ <col width="50%" />
1236
+ <col width="50%" />
1237
+ </colgroup>
1238
+ <thead valign="bottom">
1239
+ <tr class="row-odd"><th class="head">Parameter</th>
1240
+ <th class="head">Recommendation</th>
1241
+ </tr>
1242
+ </thead>
1243
+ <tbody valign="top">
1244
+ <tr class="row-even"><td><code class="docutils literal"><span class="pre">MessageMemoryLimit</span></code></td>
1245
+ <td><p class="first">This controls the maximum memory
1246
+ consumed by AMPS for client
1247
+ messages. You can increase this
1248
+ parameter to allow AMPS to use more
1249
+ memory for records. Notice, however,
1250
+ that memory devoted to client
1251
+ messages is unavailable for other
1252
+ purposes.</p>
1253
+ <p class="last"><em>Recommended starting point for
1254
+ tuning large result sets:</em> 10%
1255
+ of the system memory (for example,
1256
+ on a server with 128GB of memory,
1257
+ start with a 13GB limit).
1258
+ 60East recommends tuning the
1259
+ <code class="docutils literal"><span class="pre">MessageDiskLimit</span></code> first. If
1260
+ necessary, increase this parameter
1261
+ by 1-2% at a time. Use caution with
1262
+ settings over 20%: devoting large
1263
+ amounts of memory to client messages
1264
+ may cause swapping and reduce,
1265
+ rather than increase, overall
1266
+ performance.</p>
1267
+ </td>
1268
+ </tr>
1269
+ <tr class="row-odd"><td><code class="docutils literal"><span class="pre">MessageDiskLimit</span></code></td>
1270
+ <td><p class="first">The maximum amount of space to
1271
+ consume for offline messages.</p>
1272
+ <p class="last"><em>Recommended starting point for
1273
+ tuning large result sets:</em> average
1274
+ record size * number of expected
1275
+ records * number of simultaneous
1276
+ clients, or <code class="docutils literal"><span class="pre">MessageMemoryLimit</span></code>,
1277
+ whichever is greater.</p>
1278
+ </td>
1279
+ </tr>
1280
+ <tr class="row-even"><td><code class="docutils literal"><span class="pre">MessageDiskPath</span></code></td>
1281
+ <td><p class="first">The path in which to store offline
1282
+ message files.</p>
1283
+ <p class="last">60East recommends that the message
1284
+ disk path be hosted on fast,
1285
+ high-capacity storage such as a
1286
+ PCIe-attached flash drive. The
1287
+ available storage capacity of the
1288
+ disk must be greater than the
1289
+ configured <code class="docutils literal"><span class="pre">MessageDiskLimit</span></code>. Pay
1290
+ attention to the performance
1291
+ characteristics of the device: for
1292
+ example, some devices suffer reduced
1293
+ performance when they run low on
1294
+ free space, so for those devices you
1295
+ would want to make sure that there
1296
+ is space available on the device
1297
+ even when AMPS is close to the
1298
+ <code class="docutils literal"><span class="pre">MessageDiskLimit</span></code>.</p>
1299
+ </td>
1300
+ </tr>
1301
+ </tbody>
1302
+ </table>
1303
+ <p>60East recommends that you use these settings as a baseline for further
1304
+ tuning, bearing in mind the needs and expected messaging patterns of
1305
+ your application.</p>
1306
+ </div>
1307
+ <div class="section" id="wan-traffic-and-slow-client-settings">
1308
+ <span id="index-16"></span><h4>WAN Traffic and Slow Client Settings<a class="headerlink" href="#wan-traffic-and-slow-client-settings" title="Permalink to this headline">¶</a></h4>
1309
+ <p>In some installations, a single AMPS instance will serve both
1310
+ applications that are local to the instance and applications
1311
+ that retrieve data over a higher-latency network. For example,
1312
+ applications in a small regional office may use a server
1313
+ in another region over a WAN.</p>
1314
+ <p>In these situations, consider either adjusting the slow
1315
+ client settings so that those clients can complete operations
1316
+ such as large SOW queries successfully, or consider creating
1317
+ a separate transport with higher capacity settings that will
1318
+ be used <em>only</em> by the small number of clients that require
1319
+ these settings due to network limitations. In particular,
1320
+ if you set a <code class="docutils literal"><span class="pre">ClientMessageAgeLimit</span></code> for an instance
1321
+ or transport, ensure that this limit is large enough that
1322
+ the network can consume the results of the SOW queries
1323
+ that clients are expected to make within the allotted
1324
+ time.</p>
1325
+ </div>
1326
+ </div>
1327
+ <div class="section" id="minidump">
1328
+ <h3>Minidump<a class="headerlink" href="#minidump" title="Permalink to this headline">¶</a></h3>
1329
+ <p id="index-17">AMPS includes the ability to generate a minidump file, which can be used
1330
+ by 60East support, to help troubleshoot a problematic instance.</p>
1331
+ <p>The minidump captures thread state information: a snapshot of where in the
1332
+ source code each thread is, the call stack for each thread, and the register
1333
+ information for each frame of the call stack. A minidump also contains basic
1334
+ information about the system that AMPS was running on, such as the processor
1335
+ type and number of sockets. Minidumps <em>do not</em> contain other internal state
1336
+ of AMPS or the contents of application memory. Minidumps <em>do not</em> contain
1337
+ detailed information about the host system, and have no information about
1338
+ the state of the host or operating system. Instead, minidumps identify the
1339
+ point of failure to help 60East quickly narrow down the issue without
1340
+ generating large files or potentially compromising sensitive data.</p>
1341
+ <p>Minidumps can be produced much faster than a standard core dump, and use
1342
+ significantly less space since the minidump contains only a small subset of
1343
+ the information a core dump would contain (see
1344
+ <a class="reference internal" href="#section-operation-deployment-linux-ulimit"><span class="std std-ref">ulimit</span></a>
1345
+ for more configuration options). Because minidumps are relatively
1346
+ inexpensive, the AMPS server may produce minidumps for temporary conditions
1347
+ that the server subsequently recovers from. AMPS also allows creation of
1348
+ a minidump on demand.</p>
1349
+ <p>Generation of a minidump file occurs in the following ways:</p>
1350
+ <ol class="arabic simple">
1351
+ <li>When AMPS detects a crash internally, a minidump file will
1352
+ automatically be generated. This includes cases where an AMPS
1353
+ thread or critical internal component has not reported progress for an
1354
+ extended period of time (typically 300 seconds).</li>
1355
+ <li>When a user clicks on the <code class="docutils literal"><span class="pre">minidump</span></code> link in the
1356
+ <code class="docutils literal"><span class="pre">amps/instance/administrator</span></code> link from the administrator console
1357
+ (see the <em>AMPS Monitoring Reference</em> for more information).</li>
1358
+ <li>By sending the running AMPS process the <code class="docutils literal"><span class="pre">SIGQUIT</span></code> signal.</li>
1359
+ <li>In response to a configured action.</li>
1360
+ <li>If a thread fails to report progress with the AMPS thread monitor for
1361
+ approximately 60 seconds, a minidump will automatically be generated.
1362
+ This should be sent to AMPS support for evaluation along with a
1363
+ description of the operations taking place at the time (typically,
1364
+ info level or more verbose logging).</li>
1365
+ </ol>
1366
+ <p>By default the minidump is configured to write to <code class="docutils literal"><span class="pre">/tmp</span></code>, but this can be
1367
+ changed in the AMPS configuration by modifying the <code class="docutils literal"><span class="pre">MiniDumpDirectory</span></code>.
1368
+ 60East recommends monitoring the minidump directory.</p>
1369
+ <p>If minidumps occur, contact 60East support for diagnosis and troubleshooting.
1370
+ Bear in mind that minidumps are often a symptom of a slowdown in the server
1371
+ due to resource constraints rather than an indication that the server has
1372
+ exited.</p>
1373
+ <p>Once a minidump is submitted to 60East (and acknowledged as received), there
1374
+ is no further need to retain that minidump. 60East recommends removing
1375
+ minidumps when they are no longer needed.</p>
1376
+ </div>
1377
+ <div class="section" id="deployment-and-upgrade-plan">
1378
+ <span id="index-18"></span><h3>Deployment and Upgrade Plan<a class="headerlink" href="#deployment-and-upgrade-plan" title="Permalink to this headline">¶</a></h3>
1379
+ <p>60East offers a deployment checklist for use when planning or upgrading
1380
+ an installation of AMPS. The checklist covers recommendations for
1381
+ operations considerations such as:</p>
1382
+ <ul class="simple">
1383
+ <li>Capacity Planning</li>
1384
+ <li>Operating System Configuration</li>
1385
+ <li>AMPS Configuration</li>
1386
+ <li>Developing and Configuring Maintenance Plans</li>
1387
+ <li>Creating a Monitoring Strategy</li>
1388
+ <li>Creating a Patching and Upgrade Plan</li>
1389
+ <li>Creating a Support Plan and Verifying the Support Process</li>
1390
+ </ul>
1391
+ <p>The checklist may not cover all aspects of deployment in a particular
1392
+ environment, but can be used to create a checklist and deployment plan
1393
+ for your environment.</p>
1394
+ </div>
1395
+ </div>
1396
+ <div class="section" id="accessing-amps-through-a-proxy">
1397
+ <span id="section-proxy"></span><h2>Accessing AMPS Through a Proxy<a class="headerlink" href="#accessing-amps-through-a-proxy" title="Permalink to this headline">¶</a></h2>
1398
+ <p id="index-19">For some installations, it is important to be able
1399
+ to configure access to an AMPS instance through a proxy
1400
+ server.</p>
1401
+ <p>AMPS client connections and AMPS replication connections
1402
+ are TCP connections that use a custom protocol to communicate.
1403
+ Any proxy that does not alter the content of packets will
1404
+ work as expected for both client connections and replication
1405
+ connections.</p>
1406
+ <p>Using a proxy with AMPS is most straightforward when there
1407
+ is a one-to-one relationship between a port on the proxy
1408
+ and a port on the AMPS instance. In many cases, though,
1409
+ it is useful to have a single port on the proxy and then
1410
+ to route to a different backend instance of AMPS.</p>
1411
+ <div class="section" id="websocket-connections">
1412
+ <h3>Websocket Connections<a class="headerlink" href="#websocket-connections" title="Permalink to this headline">¶</a></h3>
1413
+ <p>Current versions of the AMPS javascript client support
1414
+ the ability to insert arbitrary paths between the hostname
1415
+ and port and the protocol and message type components of the
1416
+ AMPS connection URI.</p>
1417
+ <p>For example, a URI of <code class="docutils literal"><span class="pre">ws://proxyhost:8080/amps-prod-system/amps/json</span></code>
1418
+ could be used by the proxy to route to the system designated
1419
+ <code class="docutils literal"><span class="pre">amps-prod-system</span></code>.</p>
1420
+ </div>
1421
+ <div class="section" id="galvanometer-connections">
1422
+ <h3>Galvanometer Connections<a class="headerlink" href="#galvanometer-connections" title="Permalink to this headline">¶</a></h3>
1423
+ <p>The Galvanometer relies on the path provided to determine
1424
+ which resource to return. If it&#8217;s necessary to proxy
1425
+ multiple systems behind a single port, it is typically
1426
+ most useful to have the proxy rewrite the URI when
1427
+ forwarding the request. For example, the proxy could
1428
+ rewrite a request for <code class="docutils literal"><span class="pre">http://proxyhost:8085/prod-system/</span></code>
1429
+ to <code class="docutils literal"><span class="pre">http://amps-prod-system:8085/</span></code>.</p>
1430
+ <p>For example, an NGINX proxy configuration could be
1431
+ implemented along the lines of:</p>
1432
+ <div class="highlight-bash"><div class="highlight"><pre><span></span>server <span class="o">{</span>
1433
+ listen <span class="m">8085</span> default<span class="p">;</span>
1434
+ listen <span class="o">[</span>::<span class="o">]</span>:8085<span class="p">;</span>
1435
+
1436
+ server_name AMPS<span class="p">;</span>
1437
+
1438
+ <span class="c1"># server context</span>
1439
+ location /amps-prod-system/ <span class="o">{</span>
1440
+ proxy_set_header X-Forwarded-Host <span class="nv">$host</span><span class="p">;</span>
1441
+ proxy_set_header X-Forwarded-Server <span class="nv">$host</span><span class="p">;</span>
1442
+ proxy_set_header X-Forwarded-For <span class="nv">$proxy_add_x_forwarded_for</span><span class="p">;</span>
1443
+ proxy_pass http://amps-prod-system:8085/<span class="p">;</span> <span class="c1">#hostname and port of AMPS host for first AMPS instance</span>
1444
+ <span class="o">}</span>
1445
+ location /amps-dev-system/ <span class="o">{</span>
1446
+ proxy_set_header X-Forwarded-Host <span class="nv">$host</span><span class="p">;</span>
1447
+ proxy_set_header X-Forwarded-Server <span class="nv">$host</span><span class="p">;</span>
1448
+ proxy_set_header X-Forwarded-For <span class="nv">$proxy_add_x_forwarded_for</span><span class="p">;</span>
1449
+ proxy_pass http://amps-dev-system:8085/<span class="p">;</span> <span class="c1">#hostname and port of AMPS host for second AMPS instance</span>
1450
+ <span class="o">}</span>
1451
+ <span class="o">}</span>
1452
+ </pre></div>
1453
+ </div>
1454
+ <p>Notice that Galvanometer may not be able to provide
1455
+ information on replicated instances when Galvanometer is
1456
+ accessed through a proxy. Galvanometer relies on the hostnames
1457
+ provided by the AMPS configuration to locate replicated instances
1458
+ and retrieve information from their admin interfaces. If Galvanometer
1459
+ does not have access to the replicated instances at the hostname or
1460
+ IP provided in the AMPS configuration file, it will not be able
1461
+ to display information about replicated instances. This does not
1462
+ indicate an issue with replication on those instances, it just
1463
+ means that the Galvanometer view (which is constructed by
1464
+ Galvanometer in the browser) cannot provide the information.</p>
1465
+ </div>
1466
+ <div class="section" id="load-balancing-considerations">
1467
+ <h3>Load-Balancing Considerations<a class="headerlink" href="#load-balancing-considerations" title="Permalink to this headline">¶</a></h3>
1468
+ <p>Some proxy systems are also intended to implement load-balancing.
1469
+ The approach that a given installation uses to determine how
1470
+ to distribute connections depends on the resource that the load-balancing
1471
+ system is managing, and the needs of the application. For example,
1472
+ an application where all subscribers produce roughly the same amount
1473
+ of traffic could use a simple round-robin load balancing system to
1474
+ distribute network load. On the other hand, a proxy for an application
1475
+ where subscribers execute complex aggregated subscriptions might
1476
+ monitor CPU load or memory consumption on a set of servers that host
1477
+ AMPS and attempt to route a new connection to the server with the
1478
+ lowest current load.</p>
1479
+ <p>Regardless of the approach used, it is important to keep in
1480
+ mind that, for a publisher or queue consumer, the same
1481
+ considerations for the proxy apply as would apply for
1482
+ specifying failover equivalents to a client application
1483
+ directly. In particular, a publisher or a subscriber that
1484
+ processes a queue should not fail over across a replication
1485
+ connection that uses asynchronous acknowledgment (or a
1486
+ connection that has been downgraded to be asynchronous). If
1487
+ this happens, there is a possibility of message loss and/or
1488
+ inconsistent transaction log contents.
1489
+ See the discussion of synchronous and asynchronous acknowledgment in
1490
+ <a class="reference internal" href="replication.html#replication-sync-vs-async"><span class="std std-ref">Sync vs Async Acknowledgment Types</span></a>
1491
+ for more details.</p>
1492
+ </div>
1493
+ </div>
1494
+ </div>
1495
+
1496
+
1497
+ </div>
1498
+ </div>
1499
+ </div>
1500
+ <div class="clearer"></div>
1501
+ </div>
1502
+ <div class="footer">
1503
+ &copy;2023 60East Technologies, Inc. (version develop).
1504
+
1505
+ |
1506
+ Powered by <a href="http://sphinx-doc.org/">Sphinx 1.5.3</a>
1507
+ &amp; <a href="https://github.com/bitprophet/alabaster">Alabaster 0.7.10</a>
1508
+
1509
+ </div>
1510
+
1511
+
1512
+
1513
+
1514
+ </body>
1515
+ </html>