
# 配置内存透明大页
#### 应用场景
透明大页 Transparent Huge Pages（THP）是Linux内核中的一种内存管理技术，旨在自动将多个小页面（通常是4KB）合并为一个大页面（通常是2MB）。其核心原理是通过动态调整页面大小来优化内存管理，减少页表查找次数和TLB未命中次数，从而提高内存访问效率。然而，在内存碎片化严重或内存整理开销较大的情况下，它可能会导致内存占用增加。
#### 透明大页优势
- 减少TLB未命中次数 透明大页通过将多个小页面（通常是4KB）合并为一个大页面（通常是2MB），显著减少了TLB（Translation Lookaside Buffer）未命中次数。TLB未命中会导致处理器需要访问页表进行地址转换，从而增加内存访问延迟。对于内存密集型应用程序，透明大页的这种优化可以有效降低内存访问延迟，显著提升应用性能。
  
- 降低内核管理内存的资源消耗 当内存页的大小增加时，相同物理内存下需要维护的页数量会大幅减少。这不仅降低了内核管理内存的资源消耗，还减少了页表查询的时间。页表查询时间与页表的层次结构和页数成正比，页数的减少直接提高了查询效率，从而提升系统整体性能。
  
 
#### 透明大页缺点
- 内存占用上升 在内存分配和释放频繁的环境中，透明大页可能导致内存碎片化问题，进而引发内存占用上升。当系统中存在大量无法合并为大页面的小页面时，透明大页的动态管理机制可能无法有效工作，导致内存分配失败或性能下降。碎片化问题尤其在内存密集型工作负载中更为显著。
  
- 可能引发OOM（Out Of Memory） 透明大页的分配机制可能导致实际内存使用量与应用程序需求不匹配。例如，一个应用程序仅需8 KB内存（2个小页面），但内核可能分配一个完整的透明大页（2MB），当系统内存紧张时，这种额外的内存占用可能触发OOM（Out Of Memory）错误，影响系统稳定性。
  
 
#### 透明大页配置策略建议
- 当应用程序频繁申请和释放小块内存（如4KB页面），透明大页（THP）的自动管理机制可能会频繁尝试合并和拆分页面。这种动态管理过程需要额外的计算资源，可能导致内存管理开销显著增加。此外，频繁的合并和拆分操作可能引发内存碎片化问题，进一步降低内存利用率。因此，在这种场景下，不建议开启透明大页功能，以避免性能下降。
- 如果应用程序对性能没有过高要求，但系统内存较为紧张，关闭透明大页可以有效降低内存占用。透明大页的分配机制可能导致实际内存使用量与应用程序需求不匹配，从而增加RSS（Resident Set Size）。关闭透明大页后，系统会使用传统的4KB小页面管理方式，虽然可能增加TLB未命中次数，但可以显著减少内存碎片化问题，降低内存占用，从而避免因内存不足引发的OOM（Out Of Memory）错误。
 
#### 约束与限制
- CCI 2.0支持在创建负载时通过annotations配置透明大页策略，通过Deployment的YAML修改透明大页策略时，会造成POD的重建。
- 透明大页enabled策略为开启时：
  - transparent_hugepage/defrag策略默认为madvise，仅针对madvise(MADV_HUGEPAGE)区域进行直接回收。
  
  - transparent_hugepage/khugepaged/defrag策略默认为1，表示默认启用khugepaged内存碎片整理。
   
 
#### 操作步骤
1. 登录[云容器实例 CCI2.0](https://console.huaweicloud.com/cci2.0/?#/cci/cluster/list)控制台。
2. 左侧导航栏中选择"负载管理 \> 无状态负载"，单击"YAML创建"。

3. 配置deployment代码，示例如下所示：
   ```
   kind: Deployment
   apiVersion: cci/v2
   metadata:
     name: deploy-example
     namespace: test-namespace
   spec:
     replicas: 1
     selector:
       matchLabels:
         app: deploy-example
     template:
       metadata:
         labels:
           app: deploy-example
         annotations:
           system.cci.io/transparent_hugepage.enabled: never
       spec:
         containers:
           - name: deploy-example
             image: nginx
             resources:
               limits:
                 cpu: 500m
                 memory: 1Gi
               requests:
                 cpu: 500m
                 memory: 1Gi
         dnsPolicy: Default
         imagePullSecrets:
           - name: imagepull-secret
     strategy:
       type: RollingUpdate
       rollingUpdate:
         maxUnavailable: 0
         maxSurge: 100%
   ```
   表1重要字段说明 
   | **字段名称**                                   | **类型** | **说明**                                                                                                                                                                                                                                                                                                                  |
   |:---|:---|:---|
   | system.cci.io/transparent_hugepage.enabled | String | - always（默认值）：系统全局开启THP功能。  - madvise：仅在通过madvise(MADV_HUGEPAGE)区域开启THP功能进行系统调用。  - never：系统全局关闭THP功能。   |
      
   
4. 单击"确定"。
 
