追踪linux 命令Free

简介:

追踪linux命令Free

---宫博(杨祥合)   2014-04-25

1.free命令

alt

Mem:这一行,按OS角度理解内存使用情况.

有等式:1954 = 1120 + 834         其中,OS层的buffers和cached分别为85M和614M

 

-/+ buffers/cache:这一行,从应用程序角度看待内存使用情况

有等式:

420 = 1120 - (85 + 614)                                      

1534 = 834  + (85 + 614)

 

Note:值有时差1,是由于四舍五入的近似值

 

总结公式:

对Mem这一行来看:

OS层来看: Mem: total = used + free,

其中used内存中,包含了buffers和cached的内存,所以, buffers + cached < used

 

从-/+ buffers/cache:这一行(应用程序的角度)看:

buffer/cached_used = mem_used - (mem_buffers + mem_cached)

buffer/cached_free =  mem_free  +  (mem_buffers + mem_cached)

容易理解吧?

诠释一下,

应用程序已经使用的内存= OS层使用的内存- ( OS层buffer + OS层的cache )

应用程序感知到的空闲内存= OS层使用的内存+ ( OS层buffer + OS层的cache )

 

问题来临:

OS层的cache什么时候用到?

buffer和cache有什么分别?

cache的效果如何?

 

2.buffer && cache

(1)buffer && cache:

看老外怎么说

(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.

 

Note:

Linux内核对cache和buffer,对OB来说,若有内存需要,是可以快速释放的。所以,在运维管理中,OS层面看到的cache的值是可以减少的,只要面临压力,内核会主动回收。

(2)清空cache

(办法1:命令行方法)

alt

Emptying the buffers cache

If you ever want to empty it you can use this chain of commands.

$ free && sync && echo 3 > /proc/sys/vm/drop_caches && free

 

             total       used       free     shared    buffers     cached

Mem:       1018916     980832      38084          0      46924     355764

-/+ buffers/cache:     578144     440772

Swap:      2064376        128    2064248

             total       used       free     shared    buffers     cached

Mem:       1018916     685008     333908          0        224     108252

-/+ buffers/cache:     576532     442384

Swap:      2064376        128    2064248

 

You can signal the Linux Kernel to drop various aspects of cached items by changing the numeric argument to the above command.

NOTE: clean up memory of unnecessary things (Kernerl 2.6.16 or newer). Always make sure to run sync first to flush useful things out to disk!!!

To free pagecache:

$ echo 1 > /proc/sys/vm/drop_caches

To free dentries and inodes:

$ echo 2 > /proc/sys/vm/drop_caches

To free pagecache, dentries and inodes:

$ echo 3 > /proc/sys/vm/drop_caches

The above are meant to be run as root. If you're trying to do them using sudo then you'll need to change the syntax slightly to something like these:

$ sudo sh -c 'echo 1 >/proc/sys/vm/drop_caches'

$ sudo sh -c 'echo 2 >/proc/sys/vm/drop_caches'

$ sudo sh -c 'echo 3 >/proc/sys/vm/drop_caches'

 

Note:上述在操作时,我直接drop掉cache,推荐使用sync将数据刷到盘上。

(办法2,库函数)

​```c

int dcache(int fd, int sync_data)

{

    off_t off,len;

    struct stat buf;

    int save_errno;

    save_errno = errno;

 

    if (sync_data) {

        if (fsync(fd) < 0) {

            printf("%s\n",strerror(errno));

            errno = save_errno;

            return -1;

        }  

    }  

 

    if (fstat(fd,&buf) < 0) {

        printf("%s\n",strerror(errno));

        errno = save_errno;

        return -1;

    }  

 

    off = 0;

    len = buf.st_size;

    if (posix_fadvise(fd,off,len,POSIX_FADV_DONTNEED) < 0) {                                                                                                                                                  

        printf("%s\n",strerror(errno));

        errno = save_errno;

        return -1;

    }  

 

    return 0;

}

'''

Note:

使用linux系统调用 posix_fadvise

 

#include <fcntl.h>      

int posix_fadvise(int fd, off_t offset, off_t len, int advice);

其中advice,使用选项POSIX_FADV_DONTNEED处理.

 

 

 

3.OS层Cache效果

为了验证cache效果,进行准备工作:

(1)准备一个1G的文件

dd if=/dev/zero of=1G bs=1M count=1024 

注意,这里文件名叫做1G,请选用的文件大小,小于物理内存大小.

 

(2)清空cache:

alt

清除后,cached从1367M降低到243M

 

(3)结果分析:

读取文件两次,首次读取是通过磁盘IO,读取后,文件基本被缓存在cache中了,

可以看到cache大小刚好增加了1024M.

观察读取时间:第二次读,比第一次少很多.

alt

 

(4)看看准备好的文件读取程序:(使用这个代码,为了积累经验,与cat这个黑盒子形成一点对比)

```c

#define BUFFSIZE  4096

 

int

main(void)

{

  int   n; 

  char  buf[BUFFSIZE];

 

  while ((n = read(STDIN_FILENO, buf, BUFFSIZE)) > 0)

    if (write(STDOUT_FILENO, buf, n) != n)

      err_sys("write error");

 

  if (n < 0)

    err_sys("read error");

 

  exit(0);

}

'''

(5)用cat来验证,也是可以的,请留意cached的变化

alt

OS层buffer cache的实质: 由双向链表的LRU算法.

4.OB中应用

OB运维管理中,调整比较多的是block_index_cache和block_cache两个内存区域。

在分布式运维中,往往看OS层面的free认为,认为空闲内存,其实不然。

alt

这里看剩余内存,应该采用buffers cache的值,然后参考Mem这一行的free和cached值.

原因,见buffer&&cache中的,第一个Note,这是linux内核的行为.

目录
相关文章
|
3月前
|
Linux 应用服务中间件 Shell
二、Linux文本处理与文件操作核心命令
熟悉了Linux的基本“行走”后,就该拿起真正的“工具”干活了。用grep这个“放大镜”在文件里搜索内容,用find这个“探测器”在系统中寻找文件,再用tar把东西打包带走。最关键的是要学会使用管道符|,它像一条流水线,能把这些命令串联起来,让简单工具组合出强大的功能,比如 ps -ef | grep 'nginx' 就能快速找出nginx进程。
469 1
二、Linux文本处理与文件操作核心命令
|
3月前
|
Linux
linux命令—stat
`stat` 是 Linux 系统中用于查看文件或文件系统详细状态信息的命令。相比 `ls -l`,它提供更全面的信息,包括文件大小、权限、所有者、时间戳(最后访问、修改、状态变更时间)、inode 号、设备信息等。其常用选项包括 `-f` 查看文件系统状态、`-t` 以简洁格式输出、`-L` 跟踪符号链接,以及 `-c` 或 `--format` 自定义输出格式。通过这些选项,用户可以灵活获取所需信息,适用于系统调试、权限检查、磁盘管理等场景。
324 137
|
3月前
|
安全 Ubuntu Unix
一、初识 Linux 与基本命令
玩转Linux命令行,就像探索一座新城市。首先要熟悉它的“地图”,也就是/根目录下/etc(放配置)、/home(住家)这些核心区域。然后掌握几个“生存口令”:用ls看周围,cd去别处,mkdir建新房,cp/mv搬东西,再用cat或tail看文件内容。最后,别忘了随时按Tab键,它能帮你自动补全命令和路径,是提高效率的第一神器。
750 57
|
6月前
|
JSON 自然语言处理 Linux
linux命令—tree
tree是一款强大的Linux命令行工具,用于以树状结构递归展示目录和文件,直观呈现层级关系。支持多种功能,如过滤、排序、权限显示及格式化输出等。安装方法因系统而异常用场景包括:基础用法(显示当前或指定目录结构)、核心参数应用(如层级控制-L、隐藏文件显示-a、完整路径输出-f)以及进阶操作(如磁盘空间分析--du、结合grep过滤内容、生成JSON格式列表-J等)。此外,还可生成网站目录结构图并导出为HTML文件。注意事项:使用Tab键补全路径避免错误;超大目录建议限制遍历层数;脚本中推荐禁用统计信息以优化性能。更多详情可查阅手册mantree。
576 143
linux命令—tree
|
2月前
|
存储 安全 Linux
Linux卡在emergency mode怎么办?xfs_repair 命令轻松解决
Linux虚拟机遇紧急模式?别慌!多因磁盘挂载失败。本文教你通过日志定位问题,用`xfs_repair`等工具修复文件系统,三步快速恢复。掌握查日志、修磁盘、验重启,轻松应对紧急模式,保障系统稳定运行。
527 2
|
3月前
|
缓存 监控 Linux
Linux内存问题排查命令详解
Linux服务器卡顿?可能是内存问题。掌握free、vmstat、sar三大命令,快速排查内存使用情况。free查看实时内存,vmstat诊断系统整体性能瓶颈,sar实现长期监控,三者结合,高效定位并解决内存问题。
338 0
Linux内存问题排查命令详解
|
3月前
|
Unix Linux 程序员
Linux文本搜索工具grep命令使用指南
以上就是对Linux环境下强大工具 `grep` 的基础到进阶功能介绍。它不仅能够执行简单文字查询任务还能够处理复杂文字处理任务,并且支持强大而灵活地正则表达规范来增加查询精度与效率。无论您是程序员、数据分析师还是系统管理员,在日常工作中熟练运用该命令都将极大提升您处理和分析数据效率。
318 16
|
5月前
|
监控 Linux 网络安全
Linux命令大全:从入门到精通
日常使用的linux命令整理
906 13
|
6月前
|
Linux 网络安全 数据安全/隐私保护
使用Linux系统的mount命令挂载远程服务器的文件夹。
如此一来,你就完成了一次从你的Linux发车站到远程服务器文件夹的有趣旅行。在这个技术之旅中,你既探索了新地方,也学到了如何桥接不同系统之间的距离。
1111 21
|
6月前
|
监控 Linux
Linux系统中使用df命令详解磁盘使用情况。
`df`命令是Linux系统管理员和用户监控和管理磁盘空间使用的重要工具。掌握它的基本使用方法和选项可以帮助在必要时分析和解决空间相关问题。简洁但功能丰富,`df`命令确保了用户可以快速有效地识别和管理文件系统的空间使用情况。
474 13