Merge pull request #3272 from govind-menon/STORM-3615

STORM-3615: Adds documentation for NUMA support
diff --git a/docs/NUMA.md b/docs/NUMA.md
new file mode 100644
index 0000000..4d4836f
--- /dev/null
+++ b/docs/NUMA.md
@@ -0,0 +1,97 @@
+---
+title: NUMA Support
+layout: documentation
+documentation: true
+---
+
+# Table of Contents
+1. [Introduction](#Introduction)
+2. [Architecture](#Architecture)
+3. [Resource Isolation Interface interaction](#RII-interaction)
+    1. [CgroupManager](#Setting-Memory-Requirement)
+    2. [DockerManager](#Setting-Shared-Memory)
+    3. [RuncLibManager](#Setting-CPU-Requirement)
+4. [Configuring NUMA](#Configuring-NUMA)
+    
+<div id='Introduction'/>
+
+## Introduction
+
+Non Uniform Memory Access ([NUMA](https://www.cc.gatech.edu/~echow/ipcc/hpc-course/HPC-numa.pdf)) is a new system architecture
+where the hosts resources are grouped by cores and memory in NUMA zones. Storm supports isolating/pinning worker prcesses to specific
+NUMA zones via the supervisor to take advantage of this resource isolation and avoid the penalty of using cross zone bus transfers
+<div id='Architecture'/>
+
+## Architecture
+
+Once Storm supervisors are configured for NUMA (see section below) they now heartbeat multiple heartbeats - one for each NUMA zone.
+Each of these NUMA supervisors have a supervisor id with the same prefixed supervisor id with the NUMA id differentiating them.
+Nimbus, and by extension the scheduler, see these heartbeats and views the supervisor as multiple supervisors - one per configured NUMA zone. 
+Nimbus schedules topologies and assignments accordingly. The supervisor reads all assignments with the prefixed assignments and then
+pins each worker to the NUMA zone according to the numa id in the assignment. The pinning depends on the Resource Isolation Interface used
+and is elaborated on in the following section.
+
+<div id='RII-Interaction'/>
+
+### Resource Isolation Interface interaction
+
+Each implementation of the Resource Isolation Interface (RII) should now implement NUMA pinning. The following are the current/soon to be available
+implementations                                                                                                                                                  
+
+#### CgroupManager
+
+The CgroupManager prefixes the worker launch command with the numactl command for Linux hosts-
+
+```
+numactl --cpunodebind=<numaId>> --membind=<numaId> <worker launch command>
+```
+
+The worker is then bound to the NUMA zone's CPU cores and memory zone.
+#### DockerManager
+
+Will be updated upon adding Docker support
+
+#### RuncLibManager
+
+Will be updated upon adding Runc support
+
+<div id='Configuring NUMA'/>
+
+### Configuring NUMA
+
+In the Supervisor Config the following settings need to be set
+
+```
+supervisor.numa.meta:
+    "0": # Numa zone id
+        numa.cores: # Cores in NUMA zone (can be determined by using the numastat command)
+            - 0
+            - 1
+            - 2
+            - 3
+            - 4
+            - 5
+            - 12
+            - 13
+            - 14
+            - 15
+            - 16
+
+        numa.generic.resources.map: # Generic Resources in the zone to be used for generic resource scheduling (optional)
+            network.resource.units: 50.0
+
+        numa.memory.mb: 42461 # Size of memory zone
+        numa.ports: # Ports to be assigned to workers pinned to the NUMA zone (this may include ports not specified in SUPERVISOR_SLOTS_PORTS
+            - 6700
+            - 6701
+            - 6702
+            - 6703
+            - 6704
+            - 6705
+            - 6706
+            - 6707
+            - 6708
+            - 6709
+            - 6710
+            - 6711
+```
\ No newline at end of file