gpt4 book ai didi

c - ftruncate() 对大页面失败

转载 作者:太空宇宙 更新时间:2023-11-04 10:00:39 26 4
gpt4 key购买 nike

我的应用程序尝试用 ftruncate()mmap() 编辑 32-33KB 和 2MB 大页面,但它退出了。

然后我意识到 ftruncate() 失败了:

int fd = open("/mnt/huge2m/test", O_RDWR|O_CREAT, 0666);
int rc0 = ftruncate(fd, size);
if (0 != rc0) {
fprintf(stderr,
"Can't ftruncate shared memory segment: %d, %lu, errno = %d, err = %s\n",
fd, size, errno, strerror(errno));
exit(1);
}

然后它退出了:

Can't ftruncate shared memory segment: 5, 32896, errno = 22, err = Invalid argument
terminate called without an active exception

我检查了 /mnt/huge2m 我挂载大页面文件系统的地方。我确实看到文件是在那里创建的,但大小为零。

然后我检查了我是否还有免费的 2MB 大页面:

$ numastat -vm

Per-node system memory usage (in MBs):
Node 0 Node 1 Total
--------------- --------------- ---------------
MemTotal 96936.38 98304.00 195240.38
MemFree 94171.20 95491.38 189662.58
MemUsed 2765.17 2812.62 5577.80
Active 79.84 416.48 496.32
Inactive 136.42 57.93 194.35
Active(anon) 22.71 4.80 27.52
Inactive(anon) 9.20 0.01 9.21
Active(file) 57.13 411.68 468.80
Inactive(file) 127.21 57.92 185.14
Unevictable 0.00 0.00 0.00
Mlocked 0.00 0.00 0.00
Dirty 0.00 0.00 0.00
Writeback 0.00 0.00 0.00
FilePages 193.86 470.31 664.17
Mapped 16.09 1.28 17.37
AnonPages 22.45 4.84 27.29
Shmem 9.52 0.05 9.56
KernelStack 7.42 4.59 12.02
PageTables 2.75 0.32 3.07
NFS_Unstable 0.00 0.00 0.00
Bounce 0.00 0.00 0.00
WritebackTmp 0.00 0.00 0.00
Slab 94.56 47.73 142.30
SReclaimable 34.54 19.01 53.55
SUnreclaim 60.02 28.73 88.75
AnonHugePages 0.00 0.00 0.00
HugePages_Total 80.00 80.00 160.00
HugePages_Free 80.00 12.00 92.00
HugePages_Surp 0.00 0.00 0.00

我还有很多 (92MB)。

然后,我按照 post 的建议检查了限制:

$ cat /proc/22749/limits 
Limit Soft Limit Hard Limit Units
Max cpu time unlimited unlimited seconds
Max file size unlimited unlimited bytes
Max data size unlimited unlimited bytes
Max stack size 8388608 unlimited bytes
Max core file size 0 unlimited bytes
Max resident set unlimited unlimited bytes
Max processes 4096 767758 processes
Max open files 1024 4096 files
Max locked memory 65536 65536 bytes
Max address space unlimited unlimited bytes
Max file locks unlimited unlimited locks
Max pending signals 767758 767758 signals
Max msgqueue size 819200 819200 bytes
Max nice priority 0 0
Max realtime priority 0 0
Max realtime timeout unlimited unlimited us

我的应用程序只能打开 < 10 个文件。

我还认为我的用户打开了太多文件,达到了(硬)限制。不过,如果是这样的话,当我尝试 open() 文件(大页面)时,我应该得到 -1 而不是 5(这是一个有效的 fd 描述符,文件不会'不会在 /mnt/huge2m 中创建)。

strace 显示不多:

open("/mnt/huge2m/test", O_RDWR|O_CREAT, 0666) = 5
ftruncate(5, 32896) = -1 EINVAL (Invalid argument)
write(2, "Can't ftruncate shared mem segme"..., 82Can't ftruncate shared mem segment: 5, 262272, errno = 22, err = Invalid argument
) = 82

有什么想法吗?

最佳答案

大页面归档系统中的文件可能只有整数大页面的长度,在您的情况下是 2MB 的倍数。你不应该为这么小的内存使用大页面。

关于c - ftruncate() 对大页面失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56556994/

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