drop_caches 的简单学习
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 的简单学习的更多相关文章
- Log4j简单学习笔记
log4j结构图: 结构图展现出了log4j的主结构.logger:表示记录器,即数据来源:appender:输出源,即输出方式(如:控制台.文件...)layout:输出布局 Logger机滤器:常 ...
- shiro简单学习的简单总结
权限和我有很大渊源. 培训时候的最后一个项目是OA,权限那块却不知如何入手,最后以不是我写的那个模块应付面试. 最开始的是使用session装载用户登录信息,使用简单权限拦截器做到权限控制,利用资源文 ...
- CentOS 简单学习 firewalld的使用
1. centos7 开始 使用firewalld 代替了 iptables 命令工具为 firewall-cmd 帮助信息非常长,简单放到文末 2. 简单使用 首先开启 httpd 一般都自带安装了 ...
- Windows 下 Docker 的简单学习使用过程之一 dockertoolbox
1. Windows 下面运行 Docker 的两个主要工具1): Docker for Windows2): DockerToolbox区别:Docker For Windows 可以理解为是新一代 ...
- 在MVC中实现和网站不同服务器的批量文件下载以及NPOI下载数据到Excel的简单学习
嘿嘿,我来啦,最近忙啦几天,使用MVC把应该实现的一些功能实现了,说起来做项目,实属感觉蛮好的,即可以学习新的东西,又可以增加自己之前知道的知识的巩固,不得不说是双丰收啊,其实这周来就开始面对下载在挣 ...
- Linux——帮助命令简单学习笔记
Linux帮助命令简单学习笔记: 一: 命令名称:man 命令英文原意:manual 命令所在路径:/usr/bin/man 执行权限:所有用户 语法:man [命令或配置文件] 功能描述:获得帮助信 ...
- OI数学 简单学习笔记
基本上只是整理了一下框架,具体的学习给出了个人认为比较好的博客的链接. PART1 数论部分 最大公约数 对于正整数x,y,最大的能同时整除它们的数称为最大公约数 常用的:\(lcm(x,y)=xy\ ...
- mongodb,redis简单学习
2.mongodb安装配置简单学习 配置好数据库路径就可以mongo命令执行交互操作了:先将服务器开起来:在开个cmd执行交互操作 ...
- html css的简单学习(三)
html css的简单学习(三) 前端开发工具:Dreamweaver.Hbuilder.WebStorm.Sublime.PhpStorm...=========================== ...
- html css的简单学习(二)
html css的简单学习(二) <!Doctype html>告诉浏览器,这是一个html文档.lang="en" 默认是en,表示英语:zh-Hans 中文简体:z ...
随机推荐
- ESP32 IDF iic通信( 已验证) C语言
关于iic原理建议B站自己看视频去, 然后本文主要实现了esp32的初始化, 写地址, 写数据, 读数据的功能, 从机的代码因为展示不需要,没写. 园子里面有个兄弟写了iic的代码.但是里面有点毒,多 ...
- 如何用.net制作一个简易爬虫抓取华为应用市场数据
公司最近要做一款手机,手机需要制作一个应用市场.那么问题来了,自己制作应用市场,数据从哪来呢?作为一个创业型公司.搜集数据变成为了难题. 于是突然想到能不能通过程序去抓取别人应用市场的数据-- 那么我 ...
- Element UI的第一个程序(标签使用)
1:Element UI 官方文档:https://element.faas.ele.me/ 2:Element UI是什么? 网站快速成型工具 Element,一套为开发者.设计师和产品经理准备的基 ...
- Odoo16—级联删除
我们在odoo中构建业务系统模块的时候,通常会使用one2many.many2one或many2many将模型进行关联,由此产生的数据也会通过外键发生关联.那么在odoo中删除数据的时候,如何关联删除 ...
- 直接在*.vue文件(SFC)中使用JSX/TSX渲染函数,真香!
前言 在日常开发中vue的模版语法在大多数情况都能够满足我们的需求,但是在一些复杂的业务场景中使用模版语法就有些麻烦了.这个时候灵活的JSX/TSX渲染函数就能派上用场了,大多数同学的做法都是将*.v ...
- 普通用户登录切换到root用户
使用su命令: 在终端中输入以下命令并按Enter键: su - 输入root用户的密码,然后按Enter键. 如果密码正确,你将会切换为root用户,并且可以执行root用户的操作. 使用sudo命 ...
- 10年经验总结,华为fellow教你如何成为一名优秀的架构师?
摘要:华为云首席架构师分享成为架构师必备的一些特质和能力. 本文分享自华为云社区<10年经验总结,华为fellow教你如何成为一名优秀的架构师?>,作者: 技术火炬手 . 在<云享人 ...
- 百度高德地图JS-API学习手记:地图基本设置与省市区数据加载
无论是百度还是高德地图开发,还是高德地图开发.官方的给的案例启示很多,copy再修改下,就完成了 https://lbs.amap.com/api/javascript-api/summary ht ...
- storybook添加全局样式与sass全局变量设置
storybook组件需要全局样式,只需在.storybook/preview.js 增加全局样式即可. import '../src/style/index.scss'; export const ...
- 企业诊断屋:二手车交易平台 APP 如何用 AB 测试赋能业务
更多技术交流.求职机会,欢迎关注字节跳动数据平台微信公众号,回复[1]进入官方交流群 2023年汽车行业新车市场低靡,由新车降价引发的车辆价格波动很快传导到二手车市场,二手车的交易也受到了冲击,收车验 ...