Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/138.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
c++;应用程序无法分配超过某个限制的多个hugepages 概述 我有一个C++应用程序,它读取大量数据(~1T)。我使用hugepages(614400页,2M)运行它,它可以工作,直到达到128G 为测试,我创建了一个C++中的简单应用程序,分配2M块直到它不能。_C++_Memory Management_Heap Memory_Huge Pages - Fatal编程技术网

c++;应用程序无法分配超过某个限制的多个hugepages 概述 我有一个C++应用程序,它读取大量数据(~1T)。我使用hugepages(614400页,2M)运行它,它可以工作,直到达到128G 为测试,我创建了一个C++中的简单应用程序,分配2M块直到它不能。

c++;应用程序无法分配超过某个限制的多个hugepages 概述 我有一个C++应用程序,它读取大量数据(~1T)。我使用hugepages(614400页,2M)运行它,它可以工作,直到达到128G 为测试,我创建了一个C++中的简单应用程序,分配2M块直到它不能。,c++,memory-management,heap-memory,huge-pages,C++,Memory Management,Heap Memory,Huge Pages,应用程序运行时使用: LD_PRELOAD=/usr/lib64/libhugetlbfs.so HUGETLB_MORECORE=yes ./a.out 运行时,我监控免费hugepages的nr(从/proc/meminfo)。 我可以看到它以预期的速度消耗了大量的内存 但是,应用程序在分配128G(或65536页)时发生std::bad_alloc异常而崩溃 如果我同时运行两个或多个实例,它们都会以128G的速度崩溃 如果我将cgroup限制降低到某个较小的值,例如16G,那么应用程序将

应用程序运行时使用:

LD_PRELOAD=/usr/lib64/libhugetlbfs.so HUGETLB_MORECORE=yes ./a.out
运行时,我监控免费hugepages的nr(从/proc/meminfo)。 我可以看到它以预期的速度消耗了大量的内存

但是,应用程序在分配128G(或65536页)时发生std::bad_alloc异常而崩溃

如果我同时运行两个或多个实例,它们都会以128G的速度崩溃

如果我将cgroup限制降低到某个较小的值,例如16G,那么应用程序将在该点正确崩溃,并出现“总线错误”

我错过了一些琐碎的事情吗?请查看下面的详细信息

我的想法快用完了

细节 机器、操作系统和软件:

CPU    :  Intel(R) Xeon(R) CPU E5-2650 v4 @ 2.20GHz
Memory :  1.5T
Kernel :  3.10.0-693.5.2.el7.x86_64 #1 SMP Fri Oct 20 20:32:50 UTC 2017 x86_64 x86_64 x86_64 GNU/Linux
OS     :  CentOS Linux release 7.4.1708 (Core)

hugetlbfs : 2.16-12.el7
gcc       : 7.2.1 20170829
我使用的简单测试代码(分配2M块,直到空闲的hugepages低于限制)

#包括
#包括
#包括
#包括
#包括
#定义MEM512K 512*1024ul
#定义MEM2M 4*MEM512K
//数据块
模板
结构数据块{
字符数据[N];
};
//Hugepage信息
结构HugePageInfo{
大小不限;
总尺寸;
大小不限;
大小;
使用的尺寸;
双倍大小;
};
//转储hugepage信息
无效转储hpi(const HugePageInfo和hpi){
标准::cout
但是,应用程序在分配128G(或65536页)时发生std::bad_alloc异常而崩溃

您分配的小线段太多,每个进程可以获得的贴图线段数量有限

sysctl-n vm.max\u map\u count
您正在尝试使用
1024*512*4==2097152
映射至少一个数组,但
vm.max_MAP_count
的默认值仅为65536

您可以通过以下方式进行更改:

sysctl-w vm.max\u map\u count=3000000

或者您可以在代码中分配一个更大的段。

我不想撒谎-我很好奇为什么您需要一次将所有1TB加载到内存中;而不是只加载几MB;处理这些数据;然后再加载下一个!当使用mmap()分配内存时,确实提到了需要安装HugetLBF一个粗略的猜测是,你不喜欢如何::操作符new被实现。它可能是C++运行时库的一个限制吗?谢谢评论!UKMMIT——它是一个代码处理大量的遗传数据,ALGO需要在整个数据库上随机访问。我通过将cgroup hugepage limit设置为一个较低的值(16G)来测试它然后程序就被总线错误击毁了。我已经尝试过看STD C++库,没有发现任何东西,但是我很可能问错了问题。我知道有一些简单的东西我错过了。这解决了我的问题。我的测试代码现在超出了128G的限制。非常感谢!!
MemTotal:       1584978368 kB
MemFree:        311062332 kB
MemAvailable:   309934096 kB
Buffers:            3220 kB
Cached:           613396 kB
SwapCached:            0 kB
Active:           556884 kB
Inactive:         281648 kB
Active(anon):     224604 kB
Inactive(anon):    15660 kB
Active(file):     332280 kB
Inactive(file):   265988 kB
Unevictable:           0 kB
Mlocked:               0 kB
SwapTotal:       2097148 kB
SwapFree:        2097148 kB
Dirty:                 0 kB
Writeback:             0 kB
AnonPages:        222280 kB
Mapped:            89784 kB
Shmem:             18348 kB
Slab:             482556 kB
SReclaimable:     189720 kB
SUnreclaim:       292836 kB
KernelStack:       11248 kB
PageTables:        14628 kB
NFS_Unstable:          0 kB
Bounce:                0 kB
WritebackTmp:          0 kB
CommitLimit:    165440732 kB
Committed_AS:    1636296 kB
VmallocTotal:   34359738367 kB
VmallocUsed:     7789100 kB
VmallocChunk:   33546287092 kB
HardwareCorrupted:     0 kB
AnonHugePages:         0 kB
HugePages_Total:   614400
HugePages_Free:    614400
HugePages_Rsvd:        0
HugePages_Surp:        0
Hugepagesize:       2048 kB
DirectMap4k:      341900 kB
DirectMap2M:    59328512 kB
DirectMap1G:    1552941056 kB
core file size          (blocks, -c) 0
data seg size           (kbytes, -d) unlimited
scheduling priority             (-e) 0
file size               (blocks, -f) unlimited
pending signals                 (-i) 6191203
max locked memory       (kbytes, -l) 1258291200
max memory size         (kbytes, -m) unlimited
open files                      (-n) 1024
pipe size            (512 bytes, -p) 8
POSIX message queues     (bytes, -q) 819200
real-time priority              (-r) 0
stack size              (kbytes, -s) 8192
cpu time               (seconds, -t) unlimited
max user processes              (-u) 4096
virtual memory          (kbytes, -v) unlimited
file locks                      (-x) unlimited
> cat /sys/fs/cgroup/hugetlb/hugetlb.2MB.limit_in_bytes
9223372036854771712
...
libhugetlbfs [abc:185885]: INFO: Attempting to map 2097152 bytes
libhugetlbfs [abc:185885]: INFO: ... = 0x1ffb200000
libhugetlbfs [abc:185885]: INFO: hugetlbfs_morecore(2097152) = ...
libhugetlbfs [abc:185885]: INFO: heapbase = 0xa00000, heaptop = 0x1ffb400000, mapsize = 1ffaa00000, delta=2097152
libhugetlbfs [abc:185885]: INFO: Attempting to map 2097152 bytes
libhugetlbfs [abc:185885]: WARNING: New heap segment map at 0x1ffb400000 failed: Cannot allocate memory
terminate called after throwing an instance of 'std::bad_alloc'
  what():  std::bad_alloc
Aborted (core dumped)
...
mmap(0x1ffb400000, 2097152, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS|MAP_HUGETLB, -1, 0x1ffa200000) = 0x1ffb400000
mmap(0x1ffb600000, 2097152, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS|MAP_HUGETLB, -1, 0x1ffa400000) = 0x1ffb600000
mmap(0x1ffb800000, 2097152, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS|MAP_HUGETLB, -1, 0x1ffa600000) = 0x1ffb800000
mmap(0x1ffba00000, 2097152, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS|MAP_HUGETLB, -1, 0x1ffa800000) = 0x1ffba00000
mmap(0x1ffbc00000, 2097152, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS|MAP_HUGETLB, -1, 0x1ffaa00000) = -1 ENOMEM (Cannot allocate memory)
write(2, "libhugetlbfs", 12)            = 12
write(2, ": WARNING: New heap segment map "..., 79) = 79
mmap(NULL, 3149824, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = -1 ENOMEM (Cannot allocate memory)
mmap(NULL, 134217728, PROT_NONE, MAP_PRIVATE|MAP_ANONYMOUS|MAP_NORESERVE, -1, 0) = -1 ENOMEM (Cannot allocate memory)
mmap(NULL, 67108864, PROT_NONE, MAP_PRIVATE|MAP_ANONYMOUS|MAP_NORESERVE, -1, 0) = -1 ENOMEM (Cannot allocate memory)
mmap(NULL, 134217728, PROT_NONE, MAP_PRIVATE|MAP_ANONYMOUS|MAP_NORESERVE, -1, 0) = -1 ENOMEM (Cannot allocate memory)
mmap(NULL, 67108864, PROT_NONE, MAP_PRIVATE|MAP_ANONYMOUS|MAP_NORESERVE, -1, 0) = -1 ENOMEM (Cannot allocate memory)
mmap(NULL, 2101248, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = -1 ENOMEM (Cannot allocate memory)
write(2, "terminate called after throwing "..., 48) = 48
write(2, "std::bad_alloc", 14)          = 14
write(2, "'\n", 2)                      = 2
write(2, "  what():  ", 11)             = 11
write(2, "std::bad_alloc", 14)          = 14
write(2, "\n", 1)                       = 1
rt_sigprocmask(SIG_UNBLOCK, [ABRT], NULL, 8) = 0
gettid()                                = 188617
tgkill(188617, 188617, SIGABRT)         = 0
--- SIGABRT {si_signo=SIGABRT, si_code=SI_TKILL, si_pid=188617, si_uid=1001} ---
...
1ffb000000 default file=/anon_hugepage\040(deleted) huge anon=1 dirty=1 N1=1 kernelpagesize_kB=2048
1ffb200000 default file=/anon_hugepage\040(deleted) huge anon=1 dirty=1 N1=1 kernelpagesize_kB=2048
1ffb400000 default file=/anon_hugepage\040(deleted) huge anon=1 dirty=1 N1=1 kernelpagesize_kB=2048
1ffb600000 default file=/anon_hugepage\040(deleted) huge anon=1 dirty=1 N1=1 kernelpagesize_kB=2048
1ffb800000 default file=/anon_hugepage\040(deleted) huge anon=1 dirty=1 N1=1 kernelpagesize_kB=2048
...