【问题标题】:ftruncate() failed for hugepages大页面的 ftruncate() 失败
【发布时间】:2019-06-12 07:42:17
【问题描述】:

我的应用程序尝试ftruncate()mmap()-ed 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,我安装了我的hugepage fs。我确实看到文件是在那里创建的,但大小为零。

然后我检查了我是否还有可用的 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        

我的应用程序只打开

我还认为我的用户打开了太多文件,达到了(硬)限制。但是,如果是这样的话,当我尝试 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

有什么想法吗?

【问题讨论】:

  • Linux 在“文件未打开写入”时也会产生 EINVAL
  • @IngoLeonhardt 是的,我的错。让我解决它。
  • @AnttiHaapala 我包括了如何以读写访问权限打开文件。它没有返回 -1。

标签: c linux centos7 mmap huge-pages


【解决方案1】:

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

【讨论】:

  • 有趣的是,常规的共享内存页面(通常是 4K)被允许ftruncate()-ed 到任何大小,但不允许使用大页面。谢谢!如果您不介意,只是一个附带问题——您知道如何正确清理 mmap-ed hugeages(映射到已安装的 hugepage fs)吗?即使我 close()mumap() 有时我仍然可以看到那里的文件。谢谢。
猜你喜欢
  • 2013-12-17
  • 1970-01-01
  • 2015-05-03
  • 2017-03-03
  • 1970-01-01
  • 2021-08-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多