본문 바로가기

Networking

Dataplaned process cannot start due to lack of malloc_heap

 

Edge의 경우 x86 OS 기반에서 Packet Processing을 수행합니다.

Packet Processing을 위해 pNIC의 Ring Buffer를 사용하게 되는데 짧은 시간 동안 과도하게 Traffic이 들어오고 나가는 경우 Ring Buffer Overflow가 발생할 수 있습니다.

이런 경우에는 Ring Buffer의 Default Size인 512byte부터 시작하여 1024, 2048, 최대 4096byte 까지 조금씩 증설해볼 수 있습니다.

 

문제는 이렇게 Ring Buffer Size를 늘린 경우, Edge의 DPDK가 사용하는 Hugepage Memory가 부족해지는 문제가 발생할 수 있습니다.

이로 인하여, dataplaned process도 정상적으로 시작되지 못할 수 있는데, 이와 관련된 케이스 하나를 살펴보겠습니다.

 

[Symptom]

Edge Service Status Changed 알람 발생

문제가 있는 Edge Node를 재부팅하고 나서는 동일 메시지가 발생하지 않음

아래는 고객이 기술한 문제 증상

1) 이슈 증상 : Edge Service Staus Changed 알람 발생
2) 이슈 발생 시각 : 2024 년 2월 5일 10시 분 인지
3) 반복 주기적인 이슈 발생 여부 : 2월 3일 12시 17분분터 지속 발생한것으로 추정
4) 이슈 발생 전 최근 수행작업 : NIC buffer 변경작업 수행. rx/tx NIC buffer 512 -> 4098 변경
5) 이슈 발생 후 정상 회복까지의 조치작업 : 리부팅(23.2.5 11:55) 후 현재는 정상으로 보임

 

[Troubleshooting Notes]

1. 우선 실제로 NSX Manager에서 고객이 기술한 Alarm이 발생했는지 확인

실제로 "edge_service_status_changed"이 Manager의 syslog에 기록

./var/log/syslog
 
2024-02-05T01:48:36.177Z xxx NSX 69548 MONITORING [nsx@6876 alarmId="dfae41eb-d692-4d96-a7cb-0d6d6166c3e1" alarmState="OPEN" comp="nsx-manager" entId="5df5a1d5-41e0-5c58-b3fe-a75c9651bff4" eventFeatureName="infrastructure_service" eventSev="MEDIUM" eventState="On" eventType="edge_service_status_
changed" level="WARNING" nodeId="6b437030-9865-11ed-bbfc-6cfe5447b1b1" subcomp="monitoring"] The service nsd changed from STARTED to STOPPED.
 
2024-02-05T01:50:46.012Z xxx NSX 69548 MONITORING [nsx@6876 alarmId="dfae41eb-d692-4d96-a7cb-0d6d6166c3e1" alarmState="RESOLVED" comp="nsx-manager" entId="5df5a1d5-41e0-5c58-b3fe-a75c9651bff4" eventFeatureName="infrastructure_service" eventSev="MEDIUM" eventState="Off" eventType="edge_service_st
atus_changed" level="WARNING" nodeId="6b437030-9865-11ed-bbfc-6cfe5447b1b1" subcomp="monitoring"] The service nsd changed from STOPPED to STARTED.
 
$ grep -i "2024-02-05.*MONITORING.*Change" syslog*
syslog.1:2024-02-05T02:13:40.049Z xxx NSX 70396 - [nsx@6876 audit="true" comp="nsx-manager" level="INFO" reqId="90601277-ed1e-483a-bb31-60f8b198500d" subcomp="manager" update="true" username="admin"] UserName="admin", ModuleName="Search", Operation="GetAggregateData", Operation status="success", New value=[{"primary":{"resource_type":"MonitoringEvent","filters":[{"field_names":"event_type","value":"(\"edge_service_status_changed\")","case_sensitive":true},{"field_names":"severity","value":"(CRITICAL  OR  MEDIUM  OR  HIGH)","case_sensitive":true}]},"data_source":"ALL"}]

 

2. Edge Node에서 Alarm 관련 로그가 실제로 있는지 확인
로그 확인 결과, 여러 서비스가 반복적으로 STOPPED, STARTED 상태를 반복하고 있는 것을 확인
특히 dataplane 서비스도 문제가 발생

./edge/nsx-agent-state
 
$ cat ./edge/nsx-agent-state |grep version
        "config_version": {
            "dp_config_version": 696,
            "dp_config_version_acked": 695
        "version": "3.2.3.0.1.21787261"
    "config_version": "11",
 
$ grep "The service.*changed from" syslog.2
...
2024-02-05T01:48:30.011Z xxx NSX 5083 - [nsx@6876 comp="nsx-edge" subcomp="node-mgmt" username="root" level="WARNING" eventFeatureName="infrastructure_service" eventType="edge_service_status_changed" eventSev="warning" eventState="On"] The service dataplane changed from STARTED to STOPPED.
...
 
.
2024-02-05T01:49:33.506Z xxx NSX 5083 - [nsx@6876 comp="nsx-edge" subcomp="node-mgmt" username="root" level="WARNING" eventFeatureName="infrastructure_service" eventType="edge_service_status_changed" eventSev="warning" eventState="Off"] The service dataplane changed from STOPPED to STARTED.
...

 

3. malloc_heap 관련 오류가 있어 이 부분이 문제가 되는지 확인했으나, 재부팅 이후에도 기록되고 있음

재부팅 전
$ grep "malloc_heap memory exhausted" syslog
2024-02-05T02:35:12.903Z be06-eg611-krw2 NSX 2114837 FABRIC [nsx@6876 comp="nsx-edge" subcomp="datapathd" s2comp="stats" level="INFO"] malloc_heap memory exhausted, usage: 100, threshold: 85
...
 
재부팅 후
$ grep "malloc_heap memory exhausted" syslog
...
2024-02-16T02:13:13.709Z be06-eg611-krw2 NSX 8975 FABRIC [nsx@6876 comp="nsx-edge" subcomp="datapathd" s2comp="stats" level="INFO"] malloc_heap memory exhausted, usage: 100, threshold: 85

 

4. malloc_heap 현황 확인

Socket0에 할당된 malloc_heap은 32GB인데, Free Size가 약 1MB 정도 밖에 안되는 상황

./edge/memory-malloc-heap
[
    {
        "Alloc_count": 37373,
        "Alloc_size": 34357822400,
        "Free_count": 1439,
        "Free_size": 1915968, >>> 
        "Greatest_free_size": 15232,
        "Heap id": 0,
        "Heap name": "socket_0",
        "Heap_size": 34359738368 >>>
    },
    {
        "Alloc_count": 2312,
        "Alloc_size": 2241425664,
        "Free_count": 606,
        "Free_size": 32118312704,
        "Greatest_free_size": 32112962304,
        "Heap id": 1,
        "Heap name": "socket_1",
        "Heap_size": 34359738368
    },


./edge/mempool-show
                "len": "270860864", 
        "name": "jumbo_mbuf_pool",
                "len": "4885990016",  >>> 4~5G
        "name": "mbuf_pool_socket_0",
                "len": "17665472",
        "name": "sess_mp_0",
                "len": "17665472",
        "name": "sess_priv_mp_0",
                "len": "2363493760",  >>> ~2G
        "name": "sp_pktmbuf_pool",
                "len": "2097152",
        "name": "fw_mon_msg",
                "len": "10200552576",  >>> ~10G
        "name": "pfstatepl3",
                "len": "134217984",
        "name": "pffqdnippl",
                "len": "134217984",
        "name": "pffqdnsyncpl",
                "len": "134217984",
        "name": "pffqdndnpl",
                "len": "134217984",
        "name": "pfdnsdnpl",
                "len": "33554560",
        "name": "pffrentpl3",
                "len": "91627200",
        "name": "pfpktpl3",
                "len": "91627200",
        "name": "pfsyncmbufpl3",
                "len": "25165952",
        "name": "pf_fp_rule_node",
                "len": "1036416",
        "name": "pf_fp_root_rule_node",
                "len": "1036416",
        "name": "pf_tb_root_rule_node",
                "len": "1342177664",    >>> ~1G
        "name": "pf_url_node",
                "len": "536871040",
        "name": "pf_dpi_conn_node",
                "len": "2147483776",   >>> ~2G
        "name": "pfa_intattr_pl3",
                "len": "1342177664",  >>> ~1G
        "name": "pfa_attrconn_pl3",
                "len": "536871040",
        "name": "pf_snat_pl3",
                "len": "536871040",
        "name": "pfa_ctx_pl3",
                "len": "536871040",
        "name": "pfa_key_ace_pl3",
                "len": "2147483776",  >>> ~2G
        "name": "pfa_value_ace_pl3",
                "len": "1048704",
        "name": "pf_hsid_pl3",
                "len": "88583616",
        "name": "lb_pkt_pl3",

 

5. malloc_heap 관련 내용

  • Hugepage는 현재 NSX 버전에서 최대 64GB까지 지원(Physical Memory의 50%)하며, NUMA Node Architecture에 따라 Node별로 균등하게 배분
  • 본 환경에서는 NUMA Node가 2개이기 때문에 Node0에 32GB, Node1에 32GB가 할당
  • NSX는 NUMA Node간의 Inter-link(QPI) 통신으로 인한 성능 저하를 회피하기 위해서 NUMA Node0에 있는 Hugepage Memory만 사용하기 때문에 현실적으로는 32GB가 최대 용량
  • Rx/Tx Ring Buffer Size를 512byte -> 4096byte로 증가시키게 되면서 기존보다 Hugepage Memory의 사용량이 상승

 

6. 확인 결과, Hugepage Memory가 부족하더라도 대부분의 Operation은 문제가 없을 것이나, 설정 변경이나 동기화 등의 작업이 Hugepage Memory를 사용하기 때문에 Firewall 이나 LB 서비스에 문제가 발생할 수 있음

 

[Conclusion]

1. Rx/Tx Ring Buffer Size를 현재 4096에서 2048 or 1024로 변경한 후에 동일한 로그가 기록되지 않는지 모니터링이 필요2. NSX 4.1.1 또는 3.2.3.2에서 Hugepage Memory가 128GB까지 지원 가능한 것으로 확인

 

[References]

NSX Bare Metal Edge Tuning

https://docs.vmware.com/en/VMware-Telco-Cloud-Platform/3.0/telco-cloud-platform-5g-edition-data-plane-performance-tuning-guide/GUID-64EEE4A0-23C1-49DB-AE4D-F235F8AB8EAB.html

 

4. Malloc Library

https://dpdk.readthedocs.io/en/v2.0.0/prog_guide/malloc_lib.html