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
...