【拔苗计划】linux学习笔记——free命令学习

时间:2021-11-13 04:03:17

学到free命令的时候我发现,top命令应该放在稍微靠后的位置——至少是uptime和free后面。因为top命令的结果集合了这两个命令的结果。但是,whatever,虽然先学了top,但free命令仍要好好学,毕竟在top命令里,对free命令展示的这些信息并不是非常非常关注。

今天的学习主题是:linux的free命令

【拔苗计划】linux学习笔记——free命令学习

从图中我们看出,free命令的结果有四行,定睛一看,Mem和Swap,这不就是top命令里第四行和第五行显示的内容吗?第一行其实是表头啦,英文单词大家都认识,但这里还是一一解释一下:
* total:总量
* used:使用量
* free:可用量(空闲量)——知道为什么这个命令叫”free”了吗
* shared:共享量
* buffers:缓冲量
* cached:缓存量
常识告诉我们total=used+free,不相信的话可以拿起计算器算一下。
shared表示被几个进程共享的内存大小,据说现在已经deprecated了,我们看到图片上显示是0(是不是0主要取决于free命令在当前系统是如何实现的)。
buffers表示被系统缓冲住的内存,cached表示被系统缓存的内容。至于缓冲和缓存的区别嘛,高端洋气的解释如下:
1. A buffer is something that has yet to be “written” to disk.
2. A cache is something that has been “read” from the disk and stored for later use.
翻译一下就是,buffer是等着一起被写到硬盘上去的,cache是预先读取出来等着之后使用的。这两者的共同点是——都是为了提高IO性能的,由系统管理。

第三行,-/+ buffers/cache指的是后面的两列,第一列是-buffers/cache,第二列是+buffers/cache。
* -buffers/cache,一个应用程序认为系统已经被用掉了多少内存
* +buffers/cache,一个应用程序认为系统还有多少内存可以使用
把free命令的结果看做一个表格FO(Free Output)的话,这里有公式如下:
* FO[3][2]=FO[2][2]-FO[2][5]-FO[2][6]
* FO[3][3]=FO[2][3]+FO[2][5]+FO[2][6](心好累,为什么我还要学这么多公式(⊙﹏⊙)b)
* FO[3][2]+F[3][3]=FO[2][2]+FO[2][3]=FO[2][1],用人话翻译一下就是,第三行的这两个数字加起来就是系统总共的内存大小

今天到这里吧,明天继续。
——————–11月7日更新———————–
首先补充下free命令的各个参数
语  法: free [-bkmotV][-s <间隔秒数>]

补充说明:free指令会显示内存的使用情况,包括实体内存,虚拟的交换文件内存,共享内存区段,以及系统核心使用的缓冲区等。

参  数:
-b  以Byte为单位显示内存使用情况。
-k  以KB为单位显示内存使用情况。
-m  以MB为单位显示内存使用情况。
-o  不显示缓冲区调节列。
-s<间隔秒数>  持续观察内存使用状况。
-t  显示内存总和列。
-V  显示版本信息。
在服务器上输free -m -s 1,服务器的内存、交换区、buffers和cache信息就会以MB为单位显示,并且1秒钟刷新一次。如下图所示:
【拔苗计划】linux学习笔记——free命令学习

好像一直都没说到Swap是干嘛的。在网上搜free命令的时候,好多篇文章对Swap的态度都是——“这里我们不用关注太多”——但是我必须要搞清楚Swap的含义和对系统的影响啊,因为拔苗计划里明确写了这个问题。Swap的常规含义是,当服务器的物理内存不足时,系统会将内存中的一些东西转移到Swap空间里,这样就会有足够的内存使用,当事情办完后再把之前放在Swap空间里的那些内容转回到内存里。可是令人奇怪的是,明明公司的服务器内存是很充足的,可是交换区空间仍然有被使用,这里的缘由我暂时还不太清楚。

Swap配置对性能的影响

分配太多的Swap空间会浪费磁盘空间,而Swap空间太少,则系统会发生错误。

如果系统的物理内存用光了,系统就会跑得很慢,但仍能运行;如果Swap空间用光了,那么系统就会发生错误。例如,Web服务器能根据不同的请求数量衍生出多个服务进程(或线程),如果Swap空间用完,则服务进程无法启动,通常会出现“application is out of memory”的错误,严重时会造成服务进程的死锁。因此Swap空间的分配是很重要的。

通常情况下,Swap空间应大于或等于物理内存的大小,最小不应小于64M,通常Swap空间的大小应是物理内存的2-2.5倍。但根据不同的应用,应有不同的配置:如果是小的桌面系统,则只需要较小的Swap空间,而大的服务器系统则视情况不同需要不同大小的Swap空间。特别是数据库服务器和Web服务器,随着访问量的增加,对Swap空间的要求也会增加,具体配置参见各服务器产品的说明。

另外,Swap分区的数量对性能也有很大的影响。因为Swap交换的操作是磁盘IO 的操作,如果有多个Swap交换区,Swap空间的分配会以轮流的方式操作于所有的Swap,这样会大大均衡IO的负载,加快Swap交换的速度。如果只有一个交换区,所有的交换操作会使交换区变得很忙,使系统大多数时间处于等待状态,效率很低。用性能监视工具就会发现,此时的CPU并不很忙,而系统却慢。这说明,瓶颈在IO上,依靠提高CPU的速度是解决不了问题的。

——以下是我直接从别的文章中拷贝的,因为太高端了————-
哪些因素可能影响SWAP

内存不足无疑会SWAP,但有些时候,即便看上去内存很充裕,还可能会SWAP,这种现象被称为SWAP Insanity,罪魁祸首主要有以下几点:

Swappiness的迷失

实际上,当可用内存不足时,系统有两个选择:一个是通过SWAP来释放内存,另一个是删除Cache中的Page来释放内存。一个很常见的例子是:当拷贝大文件的时候,时常会发生SWAP现象。这是因为拷贝文件的时候,系统会把文件内容在Cache中按Page来缓存,此时一旦可用内存不足,系统便会倾向于通过SWAP来释放内存。

内核中的swappiness参数可以用来控制这种行为,缺省情况下,swappiness的值是60:

shell> sysctl -a | grep swappiness
vm.swappiness = 60
它的含义是:如果系统需要内存,有百分之六十的概率执行SWAP。知道了这一点,我们很自然的会想到用下面的方法来降低执行SWAP的概率:

shell> echo “vm.swappiness = 1” >> /etc/sysctl.conf
shell> sysctl -p
这样做的确可以降低执行SWAP的概率,但并不意味着永远不会执行SWAP。据网友报道某些情况下,直接改为0有可能出现灵异问题,所以建议改为1。
——以上是我直接从别的文章中拷贝的,因为太高端了————-

看了上面这段话,大概解了我心中的一些疑团,至少我可以肯定,并不是说内存是足够的时候就不会用到Swap空间了。有些艺高人胆大的公司如youtube当年为了不被Swap的某些问题困扰直接干掉了Swap,但我们都是老实孩子,还是继续老老实实用Swap吧,把握好度就可以了!