【问题标题】:How to reduce latency when access new page in linux如何在linux中访问新页面时减少延迟
【发布时间】:2019-11-18 18:20:22
【问题描述】:

linux中的页面大小是4KB,但是我访问一个新页面,延迟大约是页面内部的两倍。如何减少这种延迟?

这是我的测试代码。我使用clock_gettime来衡量main函数中的时间成本。

#define MEM_SIZE 4096 * 12

long long GetRT() {
    struct timespec tp;
    clock_gettime(CLOCK_REALTIME, &tp);
    return (long long) tp.tv_sec * 1000000000 + tp.tv_nsec;
}

void *InitSharedMemory() {
    int fd = shm_open("/test-steve", O_CREAT | O_RDWR, ACCESSPERMS);
    if (fd < 0) {
        perror("shm_open");
    }
    if (ftruncate(fd, MEM_SIZE) < 0) {
        perror("ftruncate");
    }
    void *mmap_ptr = mmap(NULL, MEM_SIZE, PROT_READ | PROT_WRITE,
                          MAP_SHARED | MAP_POPULATE, fd, 0);

    if (mmap_ptr == (caddr_t)-1) {
        perror("mmap");
    }
    return mmap_ptr;
}

int main()
{
    constexpr auto STEP = 512;
    char arr[STEP];
    for (int i = 0; i < STEP; ++i) {
        arr[i] = i;
    }

    int ret = 0;
    void *buffer = InitSharedMemory();
    for (int i = 0; i < 40; ++i) {
        if ((i % 0x8) == 0) {
            // *(char *) buffer = 'a';
        }
        auto t1 = GetRT();
        *(char *) buffer = 'a';
        auto t2 = GetRT();
        ret += t2 - t1;
        printf("cost: %lld ns\n", t2 - t1);
        buffer  = (char *) buffer + STEP;
    }
    return ret;
}

结果如下,是否缺少额外的延迟TLB?如何避免呢?

cost: 272 ns
cost: 73 ns
cost: 76 ns
cost: 74 ns
cost: 74 ns
cost: 75 ns
cost: 73 ns
cost: 76 ns
cost: 281 ns
cost: 74 ns
cost: 73 ns
cost: 76 ns
cost: 76 ns
cost: 74 ns
cost: 73 ns
cost: 76 ns
cost: 334 ns
cost: 76 ns
cost: 76 ns
cost: 76 ns
cost: 76 ns
cost: 73 ns
cost: 76 ns
cost: 76 ns
cost: 267 ns
cost: 74 ns
cost: 74 ns
cost: 75 ns
cost: 73 ns
cost: 76 ns
cost: 73 ns
cost: 76 ns
cost: 260 ns

【问题讨论】:

    标签: c++ linux caching low-latency tlb


    【解决方案1】:

    恐怕您无法避免第一次点击页面的成本(如您的示例所示)。

    mmap() 的标志中使用带有 MAP_HUGETLB 的大页面 (2MB) 时,可能会分摊此成本。

    根据应用上下文,在分配后立即触摸每个页面的第一个字节(或任何字节)将强制提交(可能对 numa 硬件有用)。
    这将产生很大的初始成本,但可能会导致后续访问的时间更可预测。

    【讨论】:

    • 使用hughpage可以解决。但我想知道为什么第一次命中要花这么多时间?是次要页面错误或 TLB 丢失还是其他原因?
    • 我不是专家,但我看不到任何其他内容(页面错误 + TLB 未命中)。
    • +1 为一个非常可爱的个人资料动机:“我有兴趣了解编程语言、操作系统和硬件的工作原理。避免繁重的代码结构,有许多间接和被误解的 API 层层叠叠,在我看来,这是为了不让计算机程序浪费太多能量而应该采取的最低限度的谨慎措施。”最近几天越来越少有敬业精神。 ~RESPECT~(怀念 InMOS 的智能网络时代,Transputers 硬件支持并行 Occam-pi)
    猜你喜欢
    • 1970-01-01
    • 2012-08-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-10
    • 1970-01-01
    • 1970-01-01
    • 2018-03-01
    相关资源
    最近更新 更多