Halo

A magic place for coding

0%

浅谈系统中的内存

Introduction

 在买电脑的时候我们一般都会关注硬盘、内存这些指标,而在系统运维过程中,我们同样也关注系统的内存情况。在这篇博客我将对这些基础的概念简单介绍,以及谈一下一些相关的实践经历。

买电脑的时候看什么

  存储方面我们主要看硬盘和内存,硬盘就是电脑能永久保存下来的数据,永久保存的意思就是关了电脑后再开机,还能看到数据。就笔记本而言,现在主流的容量是256G、512G甚至1T,类型有机械硬盘(HDD)和固态硬盘(SSD),前者比较便宜,速度慢,后者比较贵但是速度快。所以说硬盘的大小直接决定了电脑能存放资料的数量。

  然后我们来看内存。内存是相对于外存来说的,外存就是包括上面说的硬盘和各种外部设备,而内存则是CPU能够直接寻址的部件。CPU在计算过程中,需要记录许多命令以及数据,这个时候就用到内存来加速读操作。还有,当发生I/O操作时,通常也会需要内存来加速写操作。目前笔记本主流的内存有8G、16G,有特殊需求的还可以自己添加内存条。因此内存的大小是影响计算机运行速度的一大因素。

系统中的内存

  外部存储设备没有太多内容,只要有需要都可以增加。而我们在做系统开发的过程中,我们更加关注的系统的运行速度和稳定性,所以我们会focus在内存。在下面的部分,我将会回答这几个问题:

  1. 操作系统中的内存是有哪些组成部分呢?
  2. 它们又各自有什么作用?
  3. 有什么工具能够管理或查看这些指标?
  4. 这些指标和服务运行的状态有什么关系?

内存的组成部分及其作用

  linux中,我们常用free命令去检查系统的内存情况。这里我放一个例子:

free command

  输入命令free -m后的显示如上图,后面-m单数是指以MB为单位显示内存使用情况。我简单介绍这些数据及其含义:

  1. total:内存总容量。这里是15787MB,大概就是16G的内存了。
  2. used:已被应用程序使用的内存容量。
  3. free:还有多少内存可以被使用
  4. shared:这个是多个进程共享的内存大小
  5. buff/cache:被缓存的使用的内存大小
  6. available:还有多少内存可以被应用程序使用

  这里要重点区分开freeavailable,两者最大的不同的统计的角度不同。free是对于操作系统来说,所以它的内存已经分配出去作为buffer/cache,所以对操作系统来说它的free总是比较少的。对于应用程序来说,因为我当时并没有什么程序在跑,所以available是比较大的。

  这里对buffer和cache我再重点提一下。这两个概念经常会被混用,在很多context中它们是可以相互替换的,但是在操作系统的场景中,最好还是区分开来。buffer叫缓冲,cache叫缓存,前者是用在内存和硬盘之间,是对I/O操作进行缓冲;后者是用在CPU和内存之间,是对CPU计算指令或数据进行缓存。

与服务性能的关系

  掌握了一些系统的内存使用基本情况后,我们可以试着从内存的角度去寻找系统中的问题。

  内存告警是系统中一个很常见的告警,遇到系统问题(比如响应速度变慢等)时,我们可以首先用free命令去检查一下系统的内存状况,看看是否内存不足引起的问题。如果是由于内存的问题引起,则可以更进一步定位。如果是网络连接占用了过多内存,则可以用netstat去检查网络链接。如果是逻辑问题,则可以根据不同程序语言的特性去用更加细致的工具去定位,比如golang的话就会使用pprof。

小结

  操作系统中的内存问题是一个很庞大的领域,这篇博客只是介绍一些很basic的概念和基本的工具。当大家深入其中亲身实践,则会有更多的体会,也会根据实际的应用场景用到很多不同的工具。


Reference

  1. linux free 命令下free/available区别
  2. Linux free命令使用
  3. 内存,cache,buffer
  4. Linux内存、Swap、Cache、Buffer详细解析

Welcome to my other publishing channels