You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过C程序正确禁用Linux深度C-States?

Linux下/dev/cpu_dma_latency的正确写入方式

Linux系统中,CPU有不同的节能状态(称为C-States),范围从C0到Cn。C0是性能最高的状态,但功耗也最大。如果要最大化性能,可以禁止CPU进入更深层的节能状态,这可以通过向**/dev/cpu_dma_latency**文件写入0来实现。

现在的疑问是,向该文件写入数据有两种常见方式,哪种才是正确的?

方式1:写入字符'0'

FILE *fp;  

void start_low_latency()
{  
    char target = '0';  

    fp= fopen("/dev/cpu_dma_latency", "r+");  
    if (fp == NULL)
    {  
       fprintf(stderr, "Failed to open PM QOS file: %s", strerror(errno));  
       exit(errno);  
    }  

    fputc(target, fp);  
}  

void stop_low_latency()
{ 
    if (fp != NULL)
      fclose(fp);
}

方式2:以二进制方式写入32位数值0

static int laptop = 0;
static int latency_target_fd = -1;
static int32_t latency_target_value = 0;  

static void start_low_latency()
{
    struct stat s;
    int err;  

    if (laptop) {
        warn("not setting cpu_dma_latency to save battery power");
        return;
    }  

    errno = 0;
    err = stat("/dev/cpu_dma_latency", &s);  

    if (err == -1) {
        err_msg_n(errno, "WARN: stat /dev/cpu_dma_latency failed");
        return;
    }

    errno = 0;
    latency_target_fd = open("/dev/cpu_dma_latency", O_RDWR);  

    if (latency_target_fd == -1) {
        err_msg_n(errno, "WARN: open /dev/cpu_dma_latency");
        return;
    }  

    errno = 0;
    err = write(latency_target_fd, &latency_target_value, 4);  

    if (err < 1) {
        err_msg_n(errno, "# error setting cpu_dma_latency to %d!", latency_target_value);
        close(latency_target_fd);
        return;
    }
    printf("# /dev/cpu_dma_latency set to %dus", latency_target_value);
}

static void stop_low_latency()
{
    if (latency_target_fd >= 0)
        close(latency_target_fd);
}

正确方式说明

两种方式实际都能达到禁止深层C-State的效果,但从规范和可靠性角度,方式2是更正确的选择:

  • /dev/cpu_dma_latency是内核提供的特殊设备文件,设计预期是接收32位有符号整数(单位微秒),用来设定CPU唤醒的最大延迟阈值。写入0就要求系统把唤醒延迟控制在0微秒,等同于禁用所有会产生唤醒延迟的深层节能状态。
  • 方式1写入的是ASCII字符'0'(十六进制0x30),内核驱动会尝试将输入的文本内容解析为十进制整数,最终也能得到数值0,但这种方式依赖驱动的文本解析逻辑,属于间接实现,存在潜在兼容性风险(比如部分内核版本可能不支持文本解析)。
  • 方式2直接写入二进制格式的32位0,完全匹配设备的设计输入格式,是实时系统工具(如cyclictest)采用的标准做法,不会有解析层面的问题,更稳定可靠。

另外要注意:不管用哪种方式,必须保持文件处于打开状态才能维持低延迟设置——一旦关闭文件,系统就会恢复默认的C-State管理策略。

内容的提问来源于stack exchange,提问作者TheChamp

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.16 05:24:51