内存单位换算器(内存转换计算器)

记忆的概念模型内核为了方便我们操作物理内存,引入了虚拟地址的概念。如果没有虚拟地址,那么我们的程序直接在物理地址上操作,那么每个物理内存一次占用多少呢?取完之后

记忆的概念模型

内存单位换算器(内存转换计算器)

内核为了方便我们操作物理内存,引入了虚拟地址的概念。

如果没有虚拟地址,那么我们的程序直接在物理地址上操作,那么每个物理内存一次占用多少呢?

取完之后放回去内存缺口怎么处理,因为每次取的大小不固定?

所以内核引入了虚拟地址来解决这个问题。

实际物理地址的分配和对物理地址的访问都是由内核完成的,虚拟地址最终会映射成物理地址,从而实际从主存中取数据。

事实上,对数据的访问是由内核完成的。每个用户进程只能看到自己的空地址。cpu处理的时候,cpu会通过mmu把这个地址转换成物理地址。

mmu的工作流程

首先,在得到一个虚拟地址后,中央处理器(cpu)会从一级缓存中寻找这个虚拟地址对应的数据。如果不是,它将从内存管理单元(mmu)中。mmu会有一个页表结构,本来是在主存上的,但是如果mmu每次都从主存拉这个页表的映射信息,肯定会比较慢,所以mmu引入了转发。

当mmu在寻找这个映射关系时,它首先从tlb中寻找这个映射关系。如果找不到,它会从主存上面的页表中拉出这个映射关系。最终得到物理地址后,它会去cpu的一个二级缓存里找。如果它在二级缓存中找不到,就会从三级缓存中寻找数据。如果它找不到,它将从主内存中获取这些数据。

页面交换

当系统内存紧张时,内核会将一部分内存页交换到磁盘,必要时会将内存页从磁盘读到主存。如果内存页面被交换到磁盘,然后从磁盘读回,整个过程将消耗性能。如果整个系统都在频繁地交换页面,很可能页面交换会造成瓶颈,根本原因是内存/[/k0/

如何分析内存性能问题?

第一,从整体上把握整个系统的内存情况。首先看内存的利用率,饱和度,错误数。

就内存而言,它的一个利用率就是它使用的内存空的大小占总大小的比例。

内存饱和是页面交换的次数。如果内存频繁换页,可以认为内存现在处于饱和状态。

通过top命令,我们可以看到整个系统的一个内存情况。top后输入e,切换内存转换单位,默认为字节。

total 总内存大小free 空闲内存大小used 已经使用的内存大小buff/cache 文件系统cache与磁盘buffer。如果在系统内存比较吃紧的时候,空闲内存大小在不断的降低之后,内核很有可能会释放部分的buffer来供应用程序所使用。Swap 交换分区的内存用于页交换

缓冲/缓存

在操作一个文件的时候,我们会通过文件系统来处理磁盘。当我们将一个字符串或一段文字写入文件时,它不会立即被刷到磁盘上。在进入文件系统时,会存储在一个缓存中,这个缓存叫做页面缓存,也就是buffer/cache中的缓存。将会有一个执行磁盘清理操作的进程,该进程实际上会将此缓存中的数据写入磁盘。读取文件也类似。当我们读取一个文件时,我们首先从文件系统的页面缓存中读取它。当我们读不到的时候,它真的会从磁盘上读取真实的文件数据。

在旧的linux系统中,这两个值实际上是分开的,但是如果这两个值是分开的,比如我读一个文件,先去缓冲区,再去缓存,再去应用程序,这个数据就相当于又被复制了一次。在新的linux系统中,当我读取一个文件时,缓存已经指向缓冲区,减少了一次复制数据的过程。

记忆饱和

内存的饱和度是通过换页来衡量的,通过sar -W W这个命令可以看到系统的换页次数。

在这里,页面交换的数量(换入和换出的页面数量)将每秒刷新一次。

那么如果整个系统频繁交换页面,很有可能是内存已经处于比较紧张的状态,需要添加内存条。

系统级的内存使用情况见上图,然后定位具体的进程。

通过top命令输入m,会将内存由大到小排序,从而找出一个消耗内存最多的进程。

定位到具体的进程后,就可以分析是什么原因导致了进程内存消耗过大。

查看进程如何使用内存。

您可以使用pidstat命令查看该进程使用的内存。

pidstat -r -p pid

pidstat -r -p pid

缺页异常的数量

非正常缺页的数量也是我们要时刻注意的一点。Majflt指的是主页面缺失的号码。主缺页数是指当一个内存页要被读取时,它实际上是在磁盘上,当它被读取时,它会被内核交换到内存中。缺页异常将记录在这里,其他缺页异常将由minflt记录。如果主页面缺页太多,也可以从侧面反映出这个进程在进行太多这样的页面交换,而页面交换带来的问题就是系统的性能肯定上不去。

如何看待golang中哪个代码导致的具体内存占用问题?

官方的go工具pprof工具可以分析内存的profile文件。通过分析这个概要文件,我们可以找出是哪个代码导致了这个问题。通过go工具pprof - base的命令,可以比较两个内存的概要文件,这也是排查golang程序内存泄漏的常用手段,查找问题代码也非常方便。在golang中,您可以轻松检查整个内存使用情况,从操作系统到进程,再到具体的代码段。

如何排除内存泄漏故障?

内存泄漏的表现就是内存不断增长,持续增长后整个系统可能会频繁换页。

在golang程序中,我们可以对内存的profile文件进行两次比较,看看是哪个代码导致了内存的不断增长,从而找出内存泄漏的问题代码。

特别是对于开发,找出性能优化的终极原因。其实大部分是你的问题代码造成的。我们必须学会如何找到这个问题代码。

免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。

作者:美站资讯,如若转载,请注明出处:https://www.meizw.com/n/392015.html

发表回复

登录后才能评论