Мое приложение пыталось набрать 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
Есть идеи?