我的应用程序尝试使用2MB的Hub网页,但是它退出了ftruncate()mmap() -ED 32-3KB。
然后我意识到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

我检查了一下我安装护身符的地方。我确实看到文件是在那里创建的,但大小为零。
然后我检查了我是否还有免费的2兆拥抱页:
$ 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

我的应用程序只打开我还认为我的用户打开了太多的文件,达到了它的(硬)限制。如果是这样的话,当我试图/mnt/huge2m文件(hugepage)时,我应该得到-1而不是5(这是一个有效的fd描述符,文件不会在open()中创建)。
/mnt/huge2m显示的不多:
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

知道吗?

最佳答案

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

10-05 20:49