ftruncate () не удалось для огромных страниц - PullRequest
0 голосов
/ 12 июня 2019

Мое приложение пыталось набрать ftruncate() и mmap() -ed 32-33KB с огромной страницей 2 МБ, но оно завершилось.

Тогда я понял, что 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, где я установил свою огромную страницу fs. Я вижу, что файл был создан там, но с нулевым размером.

Затем я проверил, есть ли у меня бесплатные огромные страницы размером 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

У меня осталось совсем немного (92 МБ).

Затем я проверил лимит, предложенный этим сообщением :

$ 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 файлов. </p>

Я также подумал, что мой пользователь открыл слишком много файлов, достигнув своего (жесткого) предела. То есть, если бы я попытался 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

Есть идеи?

1 Ответ

1 голос
/ 13 июня 2019

Файлы в системе хранения огромных страниц могут содержать целое число огромных страниц, в вашем случае кратное 2 МБ. Вы не должны использовать огромные страницы для такого небольшого объема памяти.

...