首页 > 编程知识 正文

国徽每一组成部分的含义,linux命令输出到文件

时间:2023-05-04 23:28:26 阅读:275894 作者:2328

free

linux中,free命令用来查看内存状态。在一台linux主机上,使用free命令后,得到如下结果:

 

#free total used free shared buffers cachedMem: 16467424 15696636 770788 0 158636 7059612-/+ buffers/cache: 8478388 7989036Swap: 0 0 0

(注:该主机为6u机器,7u机器情况不同。怎么查看版本:uname -r | grep -oP '..x86_64$' | sed 's/.x86_64//g')

此时所有的数据默认都是 KB,如果想要得到MB, 则输入free -m

#free -m total used free shared buffers cachedMem: 16081 15285 796 0 154 6901-/+ buffers/cache: 8229 7852Swap: 0 0 0

对于输出的第一行,我们先纵向看,可以发现除去第一列,后面一共有六列,分别为total、used、free、shared、buffers、cached

total:物理内存大小,就是机器实际的内存used:已使用的内存大小,这个值包括了 cached 和 应用程序实际使用的内存free:未被使用的内存大小shared:共享内存大小,是进程间通信的一种方式buffers:被缓冲区占用的内存大小cached:被缓存占用的内存大小

对于Mem对应的行:total = used + free

下面一行,代表应用程序实际使用的内存:

前一个值表示 - buffers/cached,即 used - buffers/cached,表示应用程序实际使用的内存。后一个值表示 + buffers/cached,即 free + buffers/cached,表示理论上都可以被使用的内存。这两个值相加=total

所以说我们在说机器的内存使用率的时候,简单的使用used/total,并不准确,应为total不代表应用程序实际使用过的内存,只有减去buffers/cached才准确,所以计算公式应该为:(used -buffers-cached)/total,结果则为应用程序实际使用内存的内存使用率。用shell命令可以这么写:

free |grep Mem|awk -F ' ' '{printf("%.2f",($3-$7-$6)/$2)}'

第三行表示 swap 的使用情况:总量、使用的和未使用的。swap硬盘上交换分区的使用大小。设计的目的就是当上面提到的+buffers/cache表示的可用内存都已使用完,新的读写请求过来后,会把内存中的部分数据写入磁盘,从而把磁盘的部分空间当做虚拟内存来使用。

那么具体上面提到的cached、buffers、sharded以及swap分别是什么东西呢?下面具体分析一下。

首先,linux中是如何使用内存和磁盘数据的?
答:当有应用需要读写磁盘数据时,由系统把相关数据从磁盘读取到内存,如果物理内存不够,则把内存中的部分数据导入到磁盘,从而把磁盘的部分空间当做虚拟内存来使用,也称为Swap。如果给所有应用分配足够的内存后,物理内存还有剩余,linux会尽量再利用这些空闲内存,以提高整体I/O效率,其方法是把这部分剩余内存再划分为cached和buffers两部分加以利用。

分析下Cached的场景

Cached

在系统在进行读的时候,从磁盘读取到内存的数据在被相关应用程序读取后,如果有剩余内存,则这部分会存入cached,以备再次读取,避免重复磁盘。所以,有程序进行大量的读文件的操作时,会发现内存使用率上去了。这时候,如果有其他程序要使用内存的时候,linux会把没有人使用的cache释放掉,给其他运行的程序使用。

注:此处cached,是代表内存中的cache,而非cpu的高速缓存。

验证下这个场景:

首先,1、用free -m命令看下开始时内存的使用情况:

#free -m total used free shared buffers cachedMem: 16081 15057 1023 0 155 6655-/+ buffers/cache: 8246 7834Swap: 0 0 0

2、用 dd 命令创建一个 50M 的文件:

dd if=/dev/zero of=test.log bs=1M count=50

3、再来看一下内存信息:、

#free -m total used free shared buffers cachedMem: 16081 15211 869 0 155 6706-/+ buffers/cache: 8349 7732Swap: 0 0 0

我们可以发现cached由6655增加到了6706,增加了51M,差不多是我刚创建的test.log的文件大小,有1M的误差,应该是主机上其他程序的影响。

我们可以推断test.log的内容,都在cached中,此时我们读取它的话就会很快:

#time cat test.log >/dev/nullreal 0m0.019suser 0m0.000ssys 0m0.019s

我们手动清除一下cached:

#echo 1 > /proc/sys/vm/drop_caches#free -m total used free shared buffers cachedMem: 16081 8169 7912 0 4 95-/+ buffers/cache: 8069 8011Swap: 0 0 0

重新读取下test.log

#time cat test.log >/dev/nullreal 0m0.331suser 0m0.000ssys 0m0.033s

读取时间已经从0.019s变成了0.331s。

Buffers

当一个应用程序在内存中修改过数据后,因为写入磁盘速度相对较低,在有空闲内存的情况下,这些数据会先存入buffers,这以后某个时间再写入磁盘,从而应用程序可以继续后面的操作,而不必等待这些数据写入磁盘的操作。这样设计是为了把分散的写操作集中进行,减少磁盘碎片和磁盘的反复寻道,从而提高系统性能。liunux有一个守护进程定期清空缓存内容(写入磁盘),也可以通过sync命令手动执行。

有个例子:我们从电脑向u盘拷贝东西时,明明看到文件已经拷贝完了,但系统还是会提示 U 盘正在使用中。过了一会(或者手动sync),才显示才结束。这就是 buffer 的原因,拷贝程序把东西放到 buffer 之后,但是 U 盘还没有写完。卸载设备时会清空缓存,所以有时候卸载设备要等上一段时间。

cached和buffers,两者都是RAM中的数据,简单来说,buffers是即将要被写入磁盘的,而Cached是被从磁盘中读出来的。

Swaps

swap 是实现虚拟内存的重要概念。如果系统的负载太大,内存被用完,可能会出现严重的问题。swap 就是把硬盘上一部分空间当做内存使用,正在运行程序会使用物理内存,把没有正在使用的内存放到硬盘,这叫做 swap out;而把硬盘 swap 部分的内存重新放到物理内存中,叫做 swap in。swap 可以再逻辑上扩大内存空间,但是会造成系统变慢,因为硬盘读写速度很慢。

参考:https://www.cnblogs.com/tudachui/p/11970595.html

参考:https://cizixs.com/2015/10/01/linux-memory-management-through-free/

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。