gpt4 book ai didi

c++ - 如何减少在 linux 中访问新页面时的延迟

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:02:32 25 4
gpt4 key购买 nike

Linux 中的页面大小为 4KB,但我访问一个新页面时,延迟大约是页面内部的两倍。我怎样才能减少这种延迟?

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

#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

最佳答案

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

可能是在 mmap() 的标志中使用带有 MAP_HUGETLB 的大页面 (2MB) 时可以摊销此成本。

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

关于c++ - 如何减少在 linux 中访问新页面时的延迟,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56948395/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com