- r - 以节省内存的方式增长 data.frame
- ruby-on-rails - ruby/ruby on rails 内存泄漏检测
- android - 无法解析导入android.support.v7.app
- UNIX 域套接字与共享内存(映射文件)
我在Google和此站点中搜索了我的问题,但我仍然不明白该解决方案。
我有一个MPI
程序,它对一些数据进行RECV
。程序在大型阵列上崩溃,并显示虚拟内存不足的错误,因此我开始考虑/proc/self/status
文件。
在MPI_RECV
之前是:
Name: model.exe
VmPeak: 841640 kB
VmSize: 841640 kB
VmHWM: 15100 kB
VmRSS: 15100 kB
VmData: 760692 kB
Name: model.exe
VmPeak: 841640 kB
VmSize: 841640 kB
VmHWM: 719980 kB
VmRSS: 719980 kB
VmData: 760692 kB
VmSize
(和
VmPeak
)参数没有变化。
VmRSS
? (并且
VmSize
仅分配,但仍未使用的内存)
最佳答案
(可能的解决方案是最后一段)
在大多数具有虚拟内存的现代操作系统上,内存分配是一个分为两个阶段的过程。首先,保留了该进程的虚拟地址空间的一部分,并且相应地增加了该进程的虚拟内存大小(VmSize
)。这将在所谓的过程页表中创建条目。页面最初不与物理存储帧相关联,即实际上没有使用物理存储。每当实际读取或写入此分配部分的某些部分时,就会发生页面错误,并且操作系统会从物理内存中安装(映射)空闲页面。这会增加进程的驻留集大小(VmRSS
)。当某些其他进程需要内存时,OS可能会将一些不常用页面的内容(“不常用页面”的定义高度依赖于实现)存储到某些持久性存储中(在大多数情况下为硬盘驱动器,或者通常存储在交换设备中) ),然后取消映射。此过程减少了RSS,但保留了VmSize
不变。如果以后访问此页面,将再次发生页面错误并将其带回。仅当释放虚拟内存分配时,虚拟内存大小才会减小。请注意,VmSize
还计入内存映射文件(即可执行文件及其链接到的所有共享库或其他显式映射文件)和共享内存块。
进程中有两种通用的内存类型-静态分配的内存和堆内存。静态分配的内存保留所有常量和全局/静态变量。它是数据段的一部分,其大小由VmData
指标显示。数据段还托管程序堆的一部分,其中分配了动态内存。数据段是连续的,即它从某个位置开始,然后朝着堆栈向上增长(堆栈从很高的地址开始,然后向下增长)。数据段中的堆的问题在于,它是由特殊的堆分配器管理的,该分配器负责将连续的数据段分割为较小的内存块。另一方面,在Linux中,还可以通过直接映射虚拟内存来分配动态内存。通常只对大型分配执行此操作以节省内存,因为它只允许分配页面大小倍数(通常为4 KiB)的内存。
堆栈也是占用大量内存的重要来源,尤其是在自动(堆栈)存储中分配了大阵列的情况下。堆栈从可用虚拟地址空间的最顶部开始,然后向下扩展。在某些情况下,它可能到达数据段的顶部,也可能到达其他虚拟分配的末尾。不幸的事情发生了。堆栈大小在VmStack
指标以及VmSize
中进行计算。
可以这样总结:
VmSize
负责所有虚拟内存分配(文件映射,共享内存,堆内存,任何内存),并且几乎在每次分配新内存时都会增长。几乎,因为如果在数据段中用新的堆内存分配代替了释放的旧分配,则不会分配新的虚拟内存。每当释放虚拟分配时,它都会减少。 VmPeak
跟踪VmSize
的最大值-它只能随着时间增加。 VmRSS
随着访问内存而增加,而随着内存被调出到交换设备而减少。 VmData
随着使用堆的数据段部分而增长。由于当前的堆分配器会保留释放的内存,以防将来的分配需要它,它几乎永远不会收缩。 VmLck
)。这是不允许分页的内存。它如何增长和缩小取决于MPI实现。有些人从未取消注册已注册的块(有关其原因的技术细节太复杂,无法在此处描述),其他人则这样做是为了更好地与虚拟内存管理器一起玩。
ulimit
机制施加人为限制的手段。在 shell 中运行
ulimit -v
会告诉您KiB中虚拟内存大小的限制是多少。您可以使用
ulimit -v <value in KiB>
设置限制。这仅适用于当前shell产生的进程及其子级,grandchilren等。如果要在远程节点上启动其他进程,则需要指示
mpiexec
(或
mpirun
)将此值传播给所有其他进程。如果在某些工作负载管理器(如LSF,Sun/Oracle Grid Engine,Torque/PBS等)的控制下运行程序,则有一些作业参数可控制虚拟内存大小限制。最后但并非最不重要的一点是,通常将32位进程限制为2 GiB的可用虚拟内存。
关于linux - 增加虚拟内存而不增加VmSize,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13308684/
有没有办法通过选择不同的配置(而不是手动)来定义和更改服务定义文件 *.csdef 中的 VMSIZE? 我们有一个调试测试环境,可以使用多个服务配置文件 (*.cscfg) 进行发布,但是当我们进行
有没有办法通过选择不同的配置(而不是手动)来定义和更改服务定义文件 *.csdef 中的 VMSIZE? 我们有一个调试测试环境,可以使用多个服务配置文件 (*.cscfg) 进行发布,但是当我们进行
我试图跟踪我的应用程序占用了多少内存。所以我正在阅读 /proc/self/statm。 #include #include void print_mem(){ std::ifstream p
我有一个关于 VmSize 的小问题,在文档中它应该是应用程序对内存的使用。 但是在我的系统上: VmSize = 物理内存 + swapVmHWM 看起来更像是应用程序实际使用的内容。 [root@
我们的代码位于 Visual Studio Online 中TFS 存储库,我们构建并部署到 Azure。我们有一个Build Definition使用托管构建 Controller 和 TfvcCo
我想知道代码运行时会占用多少内存。我总结了代码中使用的所有内存,并使用 GCC 转换为可执行 bin 文件。 当我运行 bin 文件并使用 cat/proc/$PID/status 时,VmSize
在我的云服务中,我有一个 Web 角色和辅助角色。我将网络角色虚拟机大小从中更改为A6。 当我尝试部署到 Windows Azure 时,收到以下错误消息:s 似乎提示我错误 The VM size
我想写VmSize。当我输入 get-azvm 时,我获得了有关 VM 的所有信息。 当我输入 get-azvm |select VmSize 时,我有一个空变量。 我怎样才能得到这个信息? 我在网上
我想在部署期间更改正在运行的 Azure Web 角色的 vmsize,最好使用 powershell。 这可能吗? 这里的用例是,并非所有客户(和测试环境)都应该运行相同的虚拟机大小,但他们都使用相
我正在尝试在 Linux 系统上为产品计算适当的大小数据,并希望确定内存使用情况。到目前为止,我接近它的方式是运行: cat /proc//status 查看输出时,我不确定哪些数字是相关的。例如:
我有 Azure 云服务,并尝试将其升级到标准 D2 大小,但升级失败,并且我遇到了与此问题相同的错误:link 之后,我在 Azure 门户中创建了新的云服务,并以标准 D2 大小发布了我的项目,一
我有 Azure 云服务,并尝试将其升级到标准 D2 大小,但升级失败,并且我遇到了与此问题相同的错误:link 之后,我在 Azure 门户中创建了新的云服务,并以标准 D2 大小发布了我的项目,一
我是一名优秀的程序员,十分优秀!