[![logo](https://www.hongsnet.net/images/logo.gif)](https://www.hongsnet.net)

# NUMA Configuration STEP 1 (`Issued`)

현재 다음과 같이 특정 Node로의 **hit** 및 반대 노드의 **miss 상승**이 같이 관찰되고 있는 상태 이다.

```bash
# numastat
                           node0           node1
numa_hit              1415818052      4129837140
numa_miss              300383808          433699
numa_foreign              433699       300383808
interleave_hit             33473           32804
local_node            1415817519      4129800022
other_node             300384341          470817
```

또한 Application(InfluxDB)의 메모리 점유 상태도 위의 numastat 결과와 동일하다.

```bash
# numastat -p influxdb

Per-node process memory usage (in MBs) for PID 4009 (influxd)
                           Node 0          Node 1           Total
                  --------------- --------------- ---------------
Huge                         0.00            0.00            0.00
Heap                         0.00            0.00            0.00
Stack                        0.00            0.01            0.02
Private                  19536.82        37865.47        57402.29
----------------  --------------- --------------- ---------------
Total                    19536.82        37865.48        57402.30
```
>  Node 1에서 더 많은 메모리가 할당된 것을 확인할 수 있다. 다만, `Total 사용량이 1 개의 Node의 전체 용량(64GB)를 사용하지 않고 있다`.


# 튜닝 수행 방향

*  특정 Node에 더 많은 Hit가 관찰되고 있으므로, 이를 **해당 Node가 모두 충분히 사용할 수 있도록 진행** 한다.
*  **preferred=1 옵션**을 numactl 명령을 통해 해당 프로세스를 실행한다.
*  preferred 옵션을 사용할 경우 **해당 노드에서 모든 메모리를 할당하게되면, 다른 노드에서 메모리를 할당하게 된다**.

즉, 다음과 같이 확인할 수 있다.

```bash
# numastat -m

Per-node system memory usage (in MBs):
                          Node 0          Node 1           Total
                 --------------- --------------- ---------------
MemTotal                63916.73        64484.96       128401.69
MemFree                 33904.61         5847.62        39752.23 <= Free
MemUsed                 30012.12        58637.34        88649.46 <= Used
Active                   5848.20         5308.77        11156.98
Inactive                21740.37        50359.28        72099.65
Active(anon)             5152.93         2261.04         7413.96
Inactive(anon)           7448.73         9321.95        16770.68
Active(file)              695.27         3047.74         3743.01
Inactive(file)          14291.64        41037.33        55328.96
Unevictable                 0.00            0.00            0.00
Mlocked                     0.00            0.00            0.00
Dirty                      77.37          264.01          341.38
Writeback                   0.00            0.00            0.00
FilePages               14993.80        44102.23        59096.03
Mapped                   7917.09        27702.21        35619.30
AnonPages               12594.88        11565.86        24160.74
Shmem                       6.74           17.01           23.75
KernelStack                 5.72            4.41           10.12
PageTables                 76.91           77.98          154.89
NFS_Unstable                0.00            0.00            0.00
Bounce                      0.00            0.00            0.00
WritebackTmp                0.00            0.00            0.00
Slab                      523.57          952.99         1476.57
SReclaimable              468.23          894.43         1362.66
SUnreclaim                 55.34           58.56          113.91
AnonHugePages            4788.00          916.00         5704.00
HugePages_Total             0.00            0.00            0.00
HugePages_Free              0.00            0.00            0.00
HugePages_Surp              0.00            0.00            0.00
```

# 튜닝 설정

* [ **STEP 1** ] numactl 명령을 통한 Application을 실행하기 위해, 다음과 같이 간단한 스크립트를 작성 한다.

```bash
# cat influxdb_control.sh
#!/bin/bash

if [[ $1 == "start" ]]; then
  numactl --preferred=1 /usr/bin/influxd -config /etc/influxdb/influxdb.conf &
  PID=$!
  echo $PID > /var/lib/influxdb/influxdb.pid

elif [[ $1 == "stop" ]]; then
  PID=`cat /var/lib/influxdb/influxdb.pid`
  for var in {1..3}
  do
    kill -9 $PID
  done
  rm -rf /var/lib/influxdb/influxdb.pid

else
  echo
  echo "Requirement Args start | stop "
  echo

fi
```
>  핵심 : numactl --preferred=1 /usr/bin/influxd -config /etc/influxdb/influxdb.conf &

* [ **STEP 2** ] 위 스크립트를 influxdb 사용자로 전환한 후 실행 한다.

```bash
# su - influxdb
$ ./influxdb_control.sh start
```

추가적으로 현재 NUMA 관련 시스템 환경은 다음과 같다.

* numad 데몬의 경우 다음과 같이 실행 중인 상태이다.

```bash
# ps -aef |grep numad |grep -v grep
root      13741      1  0 May31 ?        00:11:28 /usr/bin/numad -i 15
```
* Automatic NUMA Balancing의 경우 해제된 상태 이다.

```bash
# sysctl -a |grep kernel.numa_balancing
kernel.numa_balancing = 0
kernel.numa_balancing_scan_delay_ms = 1000
kernel.numa_balancing_scan_period_max_ms = 60000
kernel.numa_balancing_scan_period_min_ms = 1000
kernel.numa_balancing_scan_size_mb = 256
kernel.numa_balancing_settle_count = 4
sysctl: reading key "net.ipv6.conf.all.stable_secret"
sysctl: reading key "net.ipv6.conf.default.stable_secret"
sysctl: reading key "net.ipv6.conf.enp216s0f0.stable_secret"
sysctl: reading key "net.ipv6.conf.enp216s0f1.stable_secret"
sysctl: reading key "net.ipv6.conf.lo.stable_secret"
```

# 튜닝 수행 결과

>  적용 후 numa_miss가 더 많이 발생되었으며, CPU 사용률도 적용 전보다 더 높아진 상태가 되었기 때문에 서비스에 영향이 발생된 상태 이다.

```bash
# numastat
                           node0           node1
numa_hit             42020017845     70745395521
numa_miss            20317875178        37019342
numa_foreign            37019342     20317875178
interleave_hit             32940           33335
local_node           43138729467     70741680969
other_node           19199163556        40733894
```

