颈内动脉瘤破裂专科治疗医院

注册

 

发新话题 回复该主题

为什么Go占用那么多的虚拟内存 [复制链接]

1#
北京最有效白癜风的治疗方法 http://pf.39.net/bdfyy/tslf

前段时间,某同学说某服务的容器因为超出内存限制,不断地重启,问我们是不是有内存泄露,赶紧排查,然后解决掉,省的出问题。

我们大为震惊,赶紧查看监控+报警系统和性能分析,发现应用指标压根就不高,不像有泄露的样子。

问题到底是出在哪里了呢,我们进入某个容器里查看了top的系统指标:

PIDVSZRSS...COMMANDmm..../eddycjy-server

看上去也没什么大开销的东西,就一个Go进程?就这?

再定眼一看,某同学就说VSZ那么高,而某云上的容器内存指标居然恰好和VSZ的值相接近,因此就怀疑是不是VSZ所导致的,觉得存在一定的关联关系。

这个猜测的结果到底是否正确呢?

基础知识

本篇文章将主要围绕Go进程的VSZ来进行剖析,看看到底它为什么那么"高"。

第一节为前置的补充知识,大家可按顺序阅读。

什么是VSZ

VSZ是该进程所能使用的虚拟内存总大小,它包括进程可以访问的所有内存,其中包括了被换出的内存(Swap)、已分配但未使用的内存以及来自共享库的内存。

为什么要虚拟内存

在前面我们有了解到VSZ其实就是该进程的虚拟内存总大小,那如果我们想了解VSZ的话,那我们得先了解“为什么要虚拟内存?”。

本质上来讲,在一个系统中的进程是与其他进程共享CPU和主存资源的。

因此在现代的操作系统中,多进程的使用非常的常见,如果太多的进程需要太多的内存,在没有虚拟内存的情况下,物理内存很可能会不够用,就会导致其中有些任务无法运行,更甚至会出现一些很奇怪的现象。

例如“某一个进程不小心写了另一个进程使用的内存”,就会造成内存破坏,因此虚拟内存是非常重要的一个媒介。

虚拟内存包含了什么

虚拟内存,又分为:

内核虚拟内存。

进程虚拟内存。

每一个进程的虚拟内存都是独立的,内部结构如下图所示。

在内核虚拟内存中,包含了内核中的代码和数据结构。

内核虚拟内存中的某些区域会被映射到所有进程共享的物理页面中去,因此你会看到”内核虚拟内存“中实际上是包含了”物理内存“的,它们两者存在映射关系。

而从应用场景上来讲,每个进程也会去共享内核的代码和全局数据结构,因此就会被映射到所有进程的物理页面中去。

虚拟内存的重要能力

为了更有效地管理内存并且减少出错,现代系统提供了一种对主存的抽象概念,也就是今天的主角,叫做虚拟内存(VM)。

虚拟内存是硬件异常、硬件地址翻译、主存、磁盘文件和内核软件交互的地方,它为每个进程提供了一个大的、一致的和私有的地址空间,虚拟内存提供了三个重要的能力:

它将主存看成是一个存储在磁盘上的地址空间的高速缓存,在主存中只保存活动区域,并根据需要在磁盘和主存之间来回传送数据,通过这种方式,它高效地使用了主存。它为每个进程提供了一致的地址空间,从而简化了内存管理。它保护了每个进程的地址空间不被其他进程破坏。小结

上面发散的可能比较多,简单来讲,对于本文我们重点

分享 转发
TOP
发新话题 回复该主题