这是使用G ++ 4.1.2在CentOS 64bit上的C++中.
我们正在编写一个测试应用程序来加载系统上的内存使用量为n千兆字节.这个想法是整个系统负载通过SNMP等进行监控.所以这只是一种执行监控的方法.
然而,我们所看到的只是做:
char* p = new char[1000000000];
Run Code Online (Sandbox Code Playgroud)
不会影响使用top或free -m中显示的内存
一旦内存写入:内存分配似乎变得"真实":
memcpy(p, 'a', 1000000000); //shows an increase in mem usage of 1GB
Run Code Online (Sandbox Code Playgroud)
但是我们必须写入所有内存,只需写入第一个元素就不会显示已用内存的增加:
p[0] = 'a'; //does not show an increase of 1GB.
Run Code Online (Sandbox Code Playgroud)
这是正常的,实际上已经完全分配了内存吗?我不确定它是否是我们正在使用的工具(top和free -m)显示不正确的值,或者在编译器或运行时和/或内核中是否有一些聪明的事情.
即使在关闭优化的调试版本中也可以看到此行为.
我的理解是新的[]立即分配了内存.C++运行时是否会延迟此实际分配,直到稍后访问它为止.在这种情况下,是否可以延迟内存不足,直到实际分配内存直到访问内存为止?
因为它对我们来说不是问题,但是知道它为什么会这样发生会很好!
干杯!
编辑:
我不想知道我们应该如何使用Vectors,这不是OO/C++ /当前的做事方式等等.我只是想知道为什么会发生这种情况,而不是有建议寻找替代方法.
c++ linux memory-management new-operator memory-overcommitment
父进程在尝试分叉子进程时失败,并且errno = 12(内存不足).父进程在Linux 3.0内核上运行 - SLES 11.在分叉子进程时,父进程已经占用了大约70%的RAM(180GB/256GB).这个问题有解决方法吗?
该应用程序是用C++编写的,用g ++ 4.6.3编译.
我希望在我的进程中为以前使用但目前不需要的内存保留虚拟地址空间.我对主机内核是Linux的情况感兴趣,并且它被配置为防止过度使用(通过详细计算所有已提交的内存来实现).
如果我只是想阻止我的应用程序不再使用的数据占用物理内存或交换到磁盘(无论哪种方式浪费资源),我可以madvise在内核中不需要它,或者mmap新的零页面.但是这些方法都不一定会减少计数为已提交的内存量,然后阻止其他进程使用.
如果我将页面替换为标记为只读的新零页怎么办?我的意图是它们不计入已提交的内存,并且我可以在以后使用它mprotect来使它们可写,并且如果使它们可写将失败将超过提交的内存限制.我的理解是否正确?这会有用吗?
我如何在Linux上分配内存而不过度使用,以便NULL在没有可用内存且进程不会在访问时随机崩溃的情况下,malloc实际上返回?
我对malloc如何工作的理解:
因此,如果有一种方法可以从立即由物理内存支持的内核中获取内存,则分配器可以使用该内存而不是获取过量使用的页面,NULL如果内核拒绝提供更多的内存,则分配器可以返回。
有办法吗?
更新:
我知道这不能完全保护该过程免受OOM杀手的侵害,因为如果它的得分很差,它仍然会在内存不足的情况下被杀死,但这不是我担心的。
更新2:
名义动物的评论给了我以下使用的想法mlock:
void *malloc_without_overcommit(size_t size) {
void *pointer = malloc(size);
if (pointer == NULL) {
return NULL;
}
if (mlock(pointer, size) != 0) {
free(pointer);
return NULL;
}
return pointer;
}
Run Code Online (Sandbox Code Playgroud)
但这可能由于所有系统调用而非常慢,因此这可能应该在分配器实现的级别上完成。而且它还会阻止使用交换。
更新3:
根据约翰·博林格斯(John Bollingers)的评论提出了新想法:
/proc/meminfo在MemFree和SwapFree值中进行检查。getpagesize并在每个页面大小中向内存写入一个字节,以便它得到物理内存(RAM或交换)的支持。我还仔细查看了mmap(2),发现了以下内容:
MAP_NORESERVE
不要为该映射保留交换空间。当保留交换空间时,可以保证可以修改映射。如果没有保留交换空间,则在没有物理内存可用的情况下,可能会在写入时获得SIGSEGV。另请参阅proc(5)中有关文件/ proc / sys / vm / overcommit_memory的讨论。在2.6之前的内核中,此标志仅对私有可写有效
这是否意味着进行映射~MAP_NORESERVE将完全保护该过程免受OOM杀手的侵害?如果是这样,这是一个完美的解决方案,只要有malloc实现,它就可以直接在之上工作mmap。(也许是jemalloc?)
更新4: …
您可以通过sysctls在整个系统范围内调整内存过量使用策略,但是是否可以在流程本身内部针对每个流程调整此策略?我想使一个特定的实时过程从不使用过量使用,尽管系统的其余部分可能过量使用。
我正在尝试测量 cpu 过度使用对 KVM 设置(主机和来宾)的影响。当 vCPU 数量增加时,我可以检测到性能下降,但理想情况下我想查看一些更客观的指标(例如 esxtop 中的 CPU Ready)。是否有相当于 KVM 的 esxtop 提供类似指标的工具。