调整watermark_scale_factor参数以解决CPU Sys占用率过高的问题

本文介绍了在Alibaba Cloud Linux 2/3系统中,内存压力较大的业务场景下(启动多个Executor进程进行压力测试时),CPU Sys占用率过高的原因及其解决方案。

问题现象

在内存压力较大的业务场景下(例如大数据业务通过Spark Thrift Server启动多个Executor进程进行压力测试时),系统的CPU Sys占用率较高。

问题原因

在Alibaba Cloud Linux 2/3系统中,内核提供了后台回收机制(kswapd)。由于系统默认的min水线和low水线之间的内存空间缓存区较小,在进行业务压测时,程序大量申请内存,导致内存从低水线迅速降至最小水线,这引起了直接内存的回收,从而使得CPU Sys占用率变高。

image

解决方案

通过调高watermark_scale_factor参数的值,可以增大系统中low水线与min水线之间的差值,从而更早地唤醒kswapd进行内存后台回收,以避免引发直接内存的回收。

说明

watermark_scale_factor用于控制min、low和high水线之间的间隔。该数值越大,水线间隔也越大,默认值为10,在实际使用中会将该数值/10000,约等于总内存的 0.1%。

  • low水线 ≈ min水线 + watermark_scale_factor * total / 10000

  • high水线 ≈ low水线 + watermark_scale_factor * total / 10000

  1. 执行以下命令,调整watermark_scale_factor的值。

    watermark_scale_factor的值应根据实际情况进行设置。以设置watermark_scale_factor值为150为例,即调整为系统总内存的1.5%。

    sudo sh -c 'echo 150 > /proc/sys/vm/watermark_scale_factor'
  2. 查看修改是否成功。

    cat /proc/zoneinfo

    执行结果如下图所示。

    image