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 ...
随机推荐
- R6900 R7000刷梅林 AImesh组网
本文作者: Colin本文链接: https://www.colinjiang.com/archives/netgear-r6900-flash-merlin-rom.html 然后开始讲正题,刷梅林 ...
- 如何从零开始实现TDOA技术的 UWB 精确定位系统(4)
这是一个系列文章<如何从零开始实现TDOA技术的 UWB 精确定位系统>第4部分. 重要提示(劝退说明): Q:做这个定位系统需要基础么?A:文章不是写给小白看的,需要有电子技术和软件编程 ...
- 简易机器学习笔记(十一)opencv 简易使用-人脸识别、分类任务
前言 前段时间摸了下机器学习,然后我发现其实openCV还是一个很浩瀚的库的,现在也正在写一篇有关yolo的博客,不过感觉理论偏多,所以在学yolo之前先摸一下opencv,简单先写个项目感受感受op ...
- 窗口到底有多滑动?揭秘TCP/IP滑动窗口的工作原理
本文分享自华为云社区<窗口到底有多滑动?揭秘TCP/IP滑动窗口的工作原理>,作者: Lion Long. 当涉及网络性能优化和数据传输可靠性时,TCP/IP滑动窗口是一个关键的技术.本文 ...
- 轻松带你学习java-agent
摘要:java-agent是应用于java的trace工具,核心是对JVMTI(JVM Tool Interface)的调用. 本文分享自华为云社区<Java动态trace技术:java-age ...
- 数字化转型鸿沟如何消除?ROMA Connect融合集成,联接企业应用现在与未来
摘要:ROMA Connect平台正在以"联接和融合"的方式,重塑传统企业上云的路径--"条条大路"通向云端. 本文分享自华为云社区<[大厂内参]第13期 ...
- Solon2 开发之IoC,三、注入或手动获取 Bean
1.如何注入Bean? 先了解一下Bean生命周期的简化版: 运行构建函数 尝试字段注入(有时同步注入,没时订阅注入.不会有相互依赖而卡住的问题) @Init 函数(是在容器初始化完成后才执行) .. ...
- ElasticSearch 实现分词全文检索 - 经纬度定位商家距离查询
目录 ElasticSearch 实现分词全文检索 - 概述 ElasticSearch 实现分词全文检索 - ES.Kibana.IK安装 ElasticSearch 实现分词全文检索 - Rest ...
- Kubernetes(K8S) Service 介绍
定义一组 Pod 的访问规则 存在的意义 防止 Pod 失联(服务发现),Pod 重启后,IP会变 定义一组 Pod 访问策略,负载均衡 Pod 和 Service 关系 根据 label 和 sel ...
- 机器学习周刊 第4期:动手实战人工智能、计算机科学热门论文、免费的基于ChatGPT API的安卓端语音助手、每日数学、检索增强 (RAG) 生成技术综述
LLM开发者必读论文:检索增强(RAG)生成技术综述! 目录: 1.动手实战人工智能 Hands-on Al 2.huggingface的NLP.深度强化学习.语音课 3.Awesome Jupyte ...