drop_caches 的简单学习


背景

最近一段时间一直在学习内存相关的知识
Linux系统里面的内存管理还是非常复杂的. 我这边理解 Linux从宏观层次的 段页式内存管理
到细节的buddy和slab 以及大页内存分配
以及page cache 和buffers的缓存等设置. 最近因为遇到了CentOS6和CentOS7 free 显示内存不一致的问题
耗费了自己很大的精力.
自己这边有CentOS7的环境, 所以想使用CentOS7进行一下验证

TLDR版本的结论

1. drop_caches 是有时间成本的. 清理缓存并不能够达到DDR宣称的带宽与速度.
DDR号称的带宽可以有 2.4G*8*2 至少 51.2GB/S的带宽 (双通道,DDR 2400频率)
但是实际验证最多也就15GB/S左右的卸载速度. 说明还是有很多其他损耗的. 2. linux内核里面有很多dirty相关的参数, 但是他仅是负责buffer 脏页的回写等处理.
并不会影响只读的page caches
只有内存遇到瓶颈. Linux才会使用LRU的策略清理page cache.
没有压力的情况下系统几乎不会做任何处理. 3. 系统内核有一个 min free 相关的参数, 可能会影响 page caches的回收时机
但是非常不建议修改过大的数值,可能会导致系统崩溃.
vm.min_free_kbytes 仅好看, 实际效益非常低.

验证

cat onefile > filenew
缓存数据量为: 11.815G
time echo 3 >/proc/sys/vm/drop_caches real 0m0.780s
user 0m0.000s
sys 0m0.767s 消耗时间为 0.78秒 [root@oracle12c ~]# free -m
total used free shared buff/cache available
Mem: 47005 13798 382 20 32825 32733
Swap: 8079 14 8065 这次的驱逐时间为: 缓存数据量为: 31.532G
time echo 3 >/proc/sys/vm/drop_caches real 0m2.163s
user 0m0.000s
sys 0m2.124s 说明cache 太大的情况下进行内存驱逐的时间也是比较久的
并不是没有成本的. 虚拟化的情况下 1秒钟大约可以卸载从pagecache中 15G的内存.
进行了多次验证, 时间基本上符合2S左右的区间.

缓存的使用的驱逐

+----------------------------+----------------+-------------+----------------+-------------+---------+
| Name | Size │ Pages │ Cached Size │ Cached Pages│ Percent │
|----------------------------+----------------+-------------+----------------+-------------+---------|
| /root/all.dump | 5.156G | 1351552 | 5.156G | 1351552 | 100.000 |
| /root/xxxxxx301_9999.dump | 5.907G | 1548592 | 5.144G | 1348480 | 87.078 |
| /root/xxxxxx301_9999.dump2 | 5.907G | 1548592 | 0B | 0 | 0.000 |
| /root/xxxxxx301_9999.dump3 | 5.907G | 1548592 | 0B | 0 | 0.000 |
| /root/xxxxxx301_9999.dump4 | 5.907G | 1548592 | 0B | 0 | 0.000 |
| /root/xxxxxx301_9999.dump5 | 5.907G | 1548592 | 0B | 0 | 0.000 |
|----------------------------+----------------+-------------+----------------+-------------+---------|
│ Sum │ 34.693G │ 9094512 │ 10.300G │ 2700032 │ 29.689 │
+----------------------------+----------------+-------------+----------------+-------------+---------+ 最开始使用第一个文件读入缓存 内存范围内可以使用时都是100% +----------------------------+----------------+-------------+----------------+-------------+---------+
| Name | Size │ Pages │ Cached Size │ Cached Pages│ Percent │
|----------------------------+----------------+-------------+----------------+-------------+---------|
| /root/all.dump | 12.334G | 3233248 | 12.334G | 3233248 | 100.000 |
| /root/xxxxxx301_9999.dump2 | 5.907G | 1548592 | 5.907G | 1548592 | 100.000 |
| /root/xxxxxx301_9999.dump | 5.907G | 1548592 | 5.907G | 1548592 | 100.000 |
| /root/xxxxxx301_9999.dump3 | 5.907G | 1548592 | 515.500M | 131968 | 8.522 |
| /root/xxxxxx301_9999.dump4 | 5.907G | 1548592 | 0B | 0 | 0.000 |
| /root/xxxxxx301_9999.dump5 | 5.907G | 1548592 | 0B | 0 | 0.000 |
|----------------------------+----------------+-------------+----------------+-------------+---------|
│ Sum │ 41.871G │ 10976208 │ 24.652G │ 6462400 │ 58.876 │
+----------------------------+----------------+-------------+----------------+-------------+---------+ 内存有压力的情况下, 第一个读入缓存的内容开始减少 符合LRU的特点 +----------------------------+----------------+-------------+----------------+-------------+---------+
| Name | Size │ Pages │ Cached Size │ Cached Pages│ Percent │
|----------------------------+----------------+-------------+----------------+-------------+---------|
| /root/all.dump | 15.948G | 4180779 | 15.773G | 4134853 | 98.901 |
| /root/xxxxxx301_9999.dump2 | 5.907G | 1548592 | 5.907G | 1548592 | 100.000 |
| /root/xxxxxx301_9999.dump | 5.907G | 1548592 | 5.752G | 1507760 | 97.363 |
| /root/xxxxxx301_9999.dump3 | 5.907G | 1548592 | 4.138G | 1084800 | 70.051 |
| /root/xxxxxx301_9999.dump4 | 5.907G | 1548592 | 0B | 0 | 0.000 |
| /root/xxxxxx301_9999.dump5 | 5.907G | 1548592 | 0B | 0 | 0.000 |
|----------------------------+----------------+-------------+----------------+-------------+---------|
│ Sum │ 45.485G │ 11923739 │ 31.570G │ 8276005 │ 69.408 │
+----------------------------+----------------+-------------+----------------+-------------+---------+ 第一个文件读入的文件 卸载了缓存之后 开始卸载第二个读入的文件 +----------------------------+----------------+-------------+----------------+-------------+---------+
| Name | Size │ Pages │ Cached Size │ Cached Pages│ Percent │
|----------------------------+----------------+-------------+----------------+-------------+---------|
| /root/all.dump | 22.097G | 5792528 | 15.729G | 4123232 | 71.182 |
| /root/xxxxxx301_9999.dump3 | 5.907G | 1548592 | 5.907G | 1548592 | 100.000 |
| /root/xxxxxx301_9999.dump2 | 5.907G | 1548592 | 5.463G | 1432089 | 92.477 |
| /root/xxxxxx301_9999.dump4 | 5.907G | 1548592 | 4.382G | 1148800 | 74.184 |
| /root/xxxxxx301_9999.dump | 5.907G | 1548592 | 0B | 0 | 0.000 |
| /root/xxxxxx301_9999.dump5 | 5.907G | 1548592 | 0B | 0 | 0.000 |
|----------------------------+----------------+-------------+----------------+-------------+---------|
│ Sum │ 51.634G │ 13535488 │ 31.482G │ 8252713 │ 60.971 │
+----------------------------+----------------+-------------+----------------+-------------+---------+ 最终情况 第一个 第二个读入的完全卸载了内存 第三个卸载了一部分 合并形成的那文件也只有一部分在内存里面. +----------------------------+----------------+-------------+----------------+-------------+---------+
| Name | Size │ Pages │ Cached Size │ Cached Pages│ Percent │
|----------------------------+----------------+-------------+----------------+-------------+---------|
| /root/all.dump | 29.537G | 7742960 | 15.770G | 4133969 | 53.390 |
| /root/xxxxxx301_9999.dump4 | 5.907G | 1548592 | 5.907G | 1548592 | 100.000 |
| /root/xxxxxx301_9999.dump5 | 5.907G | 1548592 | 5.907G | 1548592 | 100.000 |
| /root/xxxxxx301_9999.dump3 | 5.907G | 1548592 | 3.947G | 1034672 | 66.814 |
| /root/xxxxxx301_9999.dump | 5.907G | 1548592 | 0B | 0 | 0.000 |
| /root/xxxxxx301_9999.dump2 | 5.907G | 1548592 | 0B | 0 | 0.000 |
|----------------------------+----------------+-------------+----------------+-------------+---------|
│ Sum │ 59.074G │ 15485920 │ 31.532G │ 8265825 │ 53.376 │
+----------------------------+----------------+-------------+----------------+-------------+---------+

内核参数的验证

sysctl -a |grep min |grep free
vm.min_free_kbytes = 27729
修改默认值之前的 free -m 结果 free 最小值为 359MB
total used free shared buff/cache available
Mem: 47005 13795 359 20 32850 32736
Swap: 8079 13 8066 echo 4096000 >/proc/sys/vm/min_free_kbytes
将最小的可用内存修改为4GB 再次观察 [root@oracle12c ~]# free -m
total used free shared buff/cache available
Mem: 47005 13783 5397 20 27824 21958
Swap: 8079 18 8061 内存在靠近4GB free的时候就开始 回收page caches 了
但是感觉这个参数意义不大, 只是监控效果好看. 并且会造成内存资源的浪费. 修改之前和之后 文件缓存的最大比率为:
修改之前 53.376% 修改之后 43.016% 之后的结果为:
+----------------------------+----------------+-------------+----------------+-------------+---------+
| Name | Size │ Pages │ Cached Size │ Cached Pages│ Percent │
|----------------------------+----------------+-------------+----------------+-------------+---------|
| /root/all.dump | 29.537G | 7742960 | 12.712G | 3332341 | 43.037 |
| /root/xxxxxx301_9999.dump5 | 5.907G | 1548592 | 5.907G | 1548592 | 100.000 |
| /root/xxxxxx301_9999.dump4 | 5.907G | 1548592 | 5.907G | 1548592 | 100.000 |
| /root/xxxxxx301_9999.dump3 | 5.907G | 1548592 | 905.688M | 231856 | 14.972 |
| /root/xxxxxx301_9999.dump | 5.907G | 1548592 | 0B | 0 | 0.000 |
| /root/xxxxxx301_9999.dump2 | 5.907G | 1548592 | 0B | 0 | 0.000 |
|----------------------------+----------------+-------------+----------------+-------------+---------|
│ Sum │ 59.074G │ 15485920 │ 25.411G │ 6661381 │ 43.016 │
+----------------------------+----------------+-------------+----------------+-------------+---------+

drop_caches 的简单学习的更多相关文章

  1. Log4j简单学习笔记

    log4j结构图: 结构图展现出了log4j的主结构.logger:表示记录器,即数据来源:appender:输出源,即输出方式(如:控制台.文件...)layout:输出布局 Logger机滤器:常 ...

  2. shiro简单学习的简单总结

    权限和我有很大渊源. 培训时候的最后一个项目是OA,权限那块却不知如何入手,最后以不是我写的那个模块应付面试. 最开始的是使用session装载用户登录信息,使用简单权限拦截器做到权限控制,利用资源文 ...

  3. CentOS 简单学习 firewalld的使用

    1. centos7 开始 使用firewalld 代替了 iptables 命令工具为 firewall-cmd 帮助信息非常长,简单放到文末 2. 简单使用 首先开启 httpd 一般都自带安装了 ...

  4. Windows 下 Docker 的简单学习使用过程之一 dockertoolbox

    1. Windows 下面运行 Docker 的两个主要工具1): Docker for Windows2): DockerToolbox区别:Docker For Windows 可以理解为是新一代 ...

  5. 在MVC中实现和网站不同服务器的批量文件下载以及NPOI下载数据到Excel的简单学习

    嘿嘿,我来啦,最近忙啦几天,使用MVC把应该实现的一些功能实现了,说起来做项目,实属感觉蛮好的,即可以学习新的东西,又可以增加自己之前知道的知识的巩固,不得不说是双丰收啊,其实这周来就开始面对下载在挣 ...

  6. Linux——帮助命令简单学习笔记

    Linux帮助命令简单学习笔记: 一: 命令名称:man 命令英文原意:manual 命令所在路径:/usr/bin/man 执行权限:所有用户 语法:man [命令或配置文件] 功能描述:获得帮助信 ...

  7. OI数学 简单学习笔记

    基本上只是整理了一下框架,具体的学习给出了个人认为比较好的博客的链接. PART1 数论部分 最大公约数 对于正整数x,y,最大的能同时整除它们的数称为最大公约数 常用的:\(lcm(x,y)=xy\ ...

  8. mongodb,redis简单学习

     2.mongodb安装配置简单学习                   配置好数据库路径就可以mongo命令执行交互操作了:先将服务器开起来:在开个cmd执行交互操作                 ...

  9. html css的简单学习(三)

    html css的简单学习(三) 前端开发工具:Dreamweaver.Hbuilder.WebStorm.Sublime.PhpStorm...=========================== ...

  10. html css的简单学习(二)

    html css的简单学习(二) <!Doctype html>告诉浏览器,这是一个html文档.lang="en" 默认是en,表示英语:zh-Hans 中文简体:z ...

随机推荐

  1. rime中州韵 输入效果一览 100+增强功能效果

    rime是一个定制化程度很高的输入法框架, 我们可以在该框架上搭建适合自己的输入法程序.我们将在专栏 小狼毫 Rime 保姆教程 中完成以下近百种定制化效果的配置与演示.欢迎订阅. 以下为个性化定制的 ...

  2. UDP与KCP详解

    UDP 以及TCP是什么.我们知道传输层中有TCP和UDP两种网络协议,这节就讲UDP是什么. Internet协议集支持一个无连接的传输协议,该协议称为用户数据报协议(UDP,User Datagr ...

  3. 斯坦福 UE4 C++ ActionRoguelike游戏实例教程 04.角色感知组件PawnSensingComponent和更平滑的转身

    斯坦福课程 UE4 C++ ActionRoguelike游戏实例教程 0.绪论 概述 本文章对应课程第十一章 43.44节.本文讲述PawnSensingComponent中的视觉感知的使用,以及对 ...

  4. Provider MVVM架构

    MVVM架构分为M(Model).V(View).VM(ViewModel)三个部分,他们分别处理自己的分工,在View和Model之间使用ViewModel作为中介者,使View和Model不受业务 ...

  5. 23、Flutter AppBar TabBar TabBarView

    AppBar自定义顶部按钮图标.颜色 class MyHomePage extends StatelessWidget { const MyHomePage({super.key}); @overri ...

  6. tee 实现双通道输出

    ls -l|tee >(wc -l) >(wc -c) > /dev/null

  7. 实战案例丨ModelArts在数据标注、数据过滤上的应用技巧:自动分组

    大量复杂.乱序的图片依次标注效率极低,如果一次可以标注一大片的图片将极大地提升标注效率. 自动分组识别并提取图像特征,通过ModelArts先进的聚类算法可以将所有图片分组:将特征相似的图片归为一类, ...

  8. 手把手带你玩转HetuEngine:资源规划与数据源对接

    本文分享自华为云社区<[手把手带你玩转HetuEngine](三)HetuEngine资源规划>,作者: HetuEngine九级代言 . HetuEngine支持在服务层角色实例和计算实 ...

  9. 手把手带你写Node.JS版本小游戏

    摘要:今天就利用Node.JS为大家带来简单有趣的的剪刀石头布的小游戏. JavaScript的出现催动了前端开发的萌芽,前后端分离促进了Vue.React等开发框架的发展,Weex.React-Na ...

  10. 这是你没见过的MindSpore 2.0.0 for Windows GPU版

    摘要:一文带你看看MindSpore 2.0.0 for Windows GPU版. 本文分享自华为云社区<MindSpore 2.0.0 for Windows GPU泄漏版尝鲜>,作者 ...