pgcacher 的简单学习


学习地址

https://github.com/rfyiamcool/pgcacher
https://zhuanlan.zhihu.com/p/551833981
https://zhuanlan.zhihu.com/p/620860777

简单使用

下载pgcacher 之后进行一些简单的使用
其实发现 hcache 好像也可以进行查看 但是这些工具都有一些缺点. 仅可以分析存在进程的缓存占用信息
无法分析 已经消失(完成工作)的进程 所以会看到他分析的进程缓存大小比free 查询出来的大小要小很多.

使用过程

https://github.com/rfyiamcool/pgcacher/releases/tag/v0.3.3

可以下载编译好的二进制, 主要有x86 和 arm版本的

解压缩并且将文件放到 /usr/bin 目录下面

tar -zxvf pgcacher_v0.3.3_Linux_x86_64.tar.gz
scp pgcacher /usr/bin/ 查看整个系统的cache占用情况 pgcacher -top -limit 10
查看缓存占用最多的10个进程

结果分析-1

Oracle启动之后的处理
+-------------------------------------------------------------+----------------+-------------+----------------+-------------+---------+
| Name | Size │ Pages │ Cached Size │ Cached Pages│ Percent │
|-------------------------------------------------------------+----------------+-------------+----------------+-------------+---------|
| /u01/app/oracle/product/12.2.0.1/db_1/bin/oracle | 388.938M | 99569 | 252.177M | 64558 | 64.837 |
| /u01/app/oracle/oradata/ora12c/system01.dbf | 940.008M | 240642 | 232.914M | 59626 | 24.778 |
| /u01/app/oracle/oradata/ora12c/sysaux01.dbf | 980.008M | 250882 | 120.086M | 30742 | 12.254 |
| /usr/bin/dockerd | 77.257M | 19778 | 58.675M | 15021 | 75.948 |
| /u01/app/oracle/product/12.2.0.1/db_1/lib/libclntsh.so.12.1 | 68.259M | 17475 | 45.366M | 11614 | 66.461 |
| /usr/lib64/libLLVM-10.so | 80.121M | 20511 | 35.664M | 9130 | 44.513 |
| /u01/app/oracle/oradata/ora12c/redo06.log | 1.000G | 262145 | 30.039M | 7690 | 2.933 |
| /usr/bin/containerd | 28.168M | 7211 | 22.199M | 5683 | 78.810 |
| /u01/app/oracle/product/12.2.0.1/db_1/lib/libhasgen12.so | 30.013M | 7684 | 21.264M | 5444 | 70.849 |
| /usr/lib64/dri/swrast_dri.so | 20.584M | 5270 | 19.447M | 4979 | 94.478 |
|-------------------------------------------------------------+----------------+-------------+----------------+-------------+---------|
│ Sum │ 3.552G │ 931167 │ 837.831M │ 214487 │ 23.034 │
+-------------------------------------------------------------+----------------+-------------+----------------+-------------+---------+ [root@oracle12c ~]# free -m
total used free shared buff/cache available
Mem: 47005 13788 31812 29 1404 32778
Swap: 8079 0 8079 发现前十名的占用 840M , 整个缓存 1400M 比较正常

结果分析-2

复制一个 6G大小的文件
复制完城后再查询发现 与步骤 1 里面的结果分析基本上一样. 但是free 出现了较大的变化
[root@oracle12c oracle]# free -m
total used free shared buff/cache available
Mem: 47005 13820 19552 28 13632 32733
Swap: 8079 0 8079

结果分析-3

复制文件的同时进行 pgcacher 检查:

复制中:
+-------------------------------------------------------------+----------------+-------------+----------------+-------------+---------+
| Name | Size │ Pages │ Cached Size │ Cached Pages│ Percent │
|-------------------------------------------------------------+----------------+-------------+----------------+-------------+---------|
| /home/oracle/filecopy301_9999.dump | 5.907G | 1548592 | 5.907G | 1548592 | 100.000 |
| /root/filecopy301_9999.dump2 | 2.712G | 710935 | 2.712G | 710935 | 100.000 | 接近复制完成
+-------------------------------------------------------------+----------------+-------------+----------------+-------------+---------+
| Name | Size │ Pages │ Cached Size │ Cached Pages│ Percent │
|-------------------------------------------------------------+----------------+-------------+----------------+-------------+---------|
| /home/oracle/filecopy301_9999.dump | 5.907G | 1548592 | 5.907G | 1548592 | 100.000 |
| /root/filecopy301_9999.dump2 | 4.933G | 1293272 | 4.933G | 1293272 | 100.000 | 复制完成后 free 的内存情况
[root@oracle12c oracle]# free -m
total used free shared buff/cache available
Mem: 47005 13821 13487 28 19696 32724
Swap: 8079 0 8079

结果分析-4

多次复制文件之后进行验证, 发现free到了 313M 左右 就停止减少, 应该是开始驱逐了前期灌入到内存里面的page cache.
[root@oracle12c oracle]# free -m
total used free shared buff/cache available
Mem: 47005 13828 313 20 32863 32707
Swap: 8079 8 8071 free 的内存会逐渐的变多, 但是速度非常慢. Linux 操作系统除非是遇到更大的内存需求, 一般不会直接将内存驱逐. 是惰性删除.

drop_cache 验证

[root@oracle12c oracle]# free -m
total used free shared buff/cache available
Mem: 47005 13832 448 20 32724 32703
Swap: 8079 8 8071
[root@oracle12c oracle]# echo 1 >/proc/sys/vm/drop_caches
[root@oracle12c oracle]# free -m
total used free shared buff/cache available
Mem: 47005 13828 32748 20 428 32747
Swap: 8079 8 8071
[root@oracle12c oracle]# echo 2 >/proc/sys/vm/drop_caches
[root@oracle12c oracle]# free -m
total used free shared buff/cache available
Mem: 47005 13806 32789 20 409 32777
Swap: 8079 8 8071
[root@oracle12c oracle]# echo 3 >/proc/sys/vm/drop_caches
[root@oracle12c oracle]# free -m
total used free shared buff/cache available
Mem: 47005 13806 32788 20 410 32778
Swap: 8079 8 8071

drop_cache 的学习与理解

 0:不释放(系统默认值)
1:释放页缓存
2:释放dentries和inodes
3:释放所有缓存 其实
1 释放的page caches 就会释放绝大部分内存
2 的时候释放的是 目录项目以及slab里面可能用不到的信息
3 会释放1和2的全部, 所以理论上可以一次使用 3 释放尽可能多的资源.

结果分析-5

 pgcacher /root/*dump*
+----------------------------+----------------+-------------+----------------+-------------+---------+
| Name | Size │ Pages │ Cached Size │ Cached Pages│ Percent │
|----------------------------+----------------+-------------+----------------+-------------+---------|
| /root/filecopy301_9999.dump | 5.907G | 1548592 | 5.907G | 1548592 | 100.000 |
| /root/filecopy301_9999.dump2 | 5.907G | 1548592 | 5.907G | 1548592 | 100.000 |
| /root/filecopy301_9999.dump3 | 5.907G | 1548592 | 5.907G | 1548592 | 100.000 |
| /root/filecopy301_9999.dump4 | 5.907G | 1548592 | 5.907G | 1548592 | 100.000 |
| /root/filecopy301_9999.dump5 | 5.907G | 1548592 | 0B | 0 | 0.000 |
|----------------------------+----------------+-------------+----------------+-------------+---------|
│ Sum │ 29.537G │ 7742960 │ 23.630G │ 6194368 │ 80.000 │
+----------------------------+----------------+-------------+----------------+-------------+---------+ 可以通过 pgcacher 具体文件的方式来查看文件占用缓存的情况 echo 1 >/proc/sys/vm/drop_caches
然后效果为:
+----------------------------+----------------+-------------+----------------+-------------+---------+
| Name | Size │ Pages │ Cached Size │ Cached Pages│ Percent │
|----------------------------+----------------+-------------+----------------+-------------+---------|
| /root/filecopy301_9999.dump | 5.907G | 1548592 | 0B | 0 | 0.000 |
| /root/filecopy301_9999.dump2 | 5.907G | 1548592 | 0B | 0 | 0.000 |
| /root/filecopy301_9999.dump3 | 5.907G | 1548592 | 0B | 0 | 0.000 |
| /root/filecopy301_9999.dump4 | 5.907G | 1548592 | 0B | 0 | 0.000 |
| /root/filecopy301_9999.dump5 | 5.907G | 1548592 | 0B | 0 | 0.000 |
|----------------------------+----------------+-------------+----------------+-------------+---------|
│ Sum │ 29.537G │ 7742960 │ 0B │ 0 │ 0.000 │
+----------------------------+----------------+-------------+----------------+-------------+---------+

结论

我这边理解 linux 的 page caches 内存其实就与 JVM内部的堆区很类似.
如果进程还存在, 那么可以通过 进程的/proc/$pid/fd 进行汇总查看对应的内存使用.
如果进程已经不存在了, 那么page cache 内的理论上可以清除. 跟JVM里面的对象没有了与root对象的关联
可以使用gc进行进行回收.
因为系统的GC频率较低. 所以内存压力可能一直显得保持的比较高. 相对的 但是因为程序的时间局部性和空间局部性: linux 认为保留最近使用的文件的page caches 是非常有用的.
所以linux 其实除非是遇到了内存大量申请, 不然他是不会驱逐自己辛辛苦苦导入到内存里的缓存信息. [root@oracle12c oracle]# time scp filecopy301_9999.dump /root/filecopy301_9999.dump
real 0m30.726s [root@oracle12c oracle]# time scp filecopy301_9999.dump /root/filecopy301_9999.dump2
real 0m28.721s [root@oracle12c oracle]# time scp filecopy301_9999.dump /root/filecopy301_9999.dump3
real 0m12.372s [root@oracle12c oracle]# time scp filecopy301_9999.dump /root/filecopy301_9999.dump4
real 0m28.558s 发现清除缓存之后 第一次的时间是最久的
当被复制的文件进行缓存之后, 后面几次的复制都会有所性能提升.

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

  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. JPA object references an unsaved transient instance - save the transient instance before flushing

    nested exception is org.springframework.dao.InvalidDataAccessApiUsageException: org.hibernate.Transi ...

  2. Java播放MP3播放音频

    Java播放MP3播放音频 下面我演示用jdk自带包.框架等分别展示播放mp3.等music 一.使用javafx包 AudioClip 注意jdk11以上剥离了javafx public stati ...

  3. 《RAPL: A Relation-Aware Prototype Learning Approach for Few-Shot Document-Level Relation Extraction》阅读笔记

    代码   原文地址   预备知识: 1.什么是元学习(Meta Learning)? 元学习或者叫做"学会学习"(Learning to learn),它是要"学会如何学 ...

  4. POJ 3003 DP 寻路 记录路径

    POJ 3003 DP 寻路 记录路径 我一开始把M看成是每个a_i的上限了,这是致命的,因为这个题dfs暴力搜索+剪枝是过不了的因为M<=40,全部状态有2的四十次幂. 正解是DP,设dp[i ...

  5. 云图说|云数据库MySQL内核小版本升级全攻略

    摘要:华为云数据库MySQL支持自动或手动升级内核小版本,内核小版本的升级涉及性能提升.新功能或问题修复等. 华为云有新的内核小版本发布时,您可以在"实例管理"页面看到内核小版本升 ...

  6. 独家下载!突破开源Redis,华为云十年自研内核修炼之路《企业级Redis技术与应用解读》重磅发布

    摘要:互联网业务神器最新揭秘:GaussDB(for Redis)如何以自研架构,突破开源版本限制,带来企业级稳定可靠?通过入门篇.性能篇.测评篇.应用篇四个章节,聚焦问题解决.场景应用和开发实战,分 ...

  7. JavaScript继承的实现方式:原型语言对象继承对象原理剖析

    面向对象编程:继承.封装.多态. 对象的继承:A 对象通过继承 B 对象,就能直接拥有 B 对象的所有属性和方法.这对于代码的复用是非常有用的. 在经典的面向对象语言中,您可能倾向于定义类对象,然后您 ...

  8. DataLeap的全链路智能监控报警实践(二):概念介绍

    更多技术交流.求职机会,欢迎关注字节跳动数据平台微信公众号,回复[1]进入官方交流群 概念介绍 基线监控 根据监控规则和任务运行情况,DataLeap的基线监控能够决策是否报警.何时报警.如何报警以及 ...

  9. MyBatis batchInsert 批量插入数据

    mybatis 是一个 Java 的持久层框架,它支持定制化 SQL.存储过程以及高级映射.通过 MyBatis,开发者可以直接编写原生态 SQL,避免了 JDBC 代码的繁琐. 如何在 MyBati ...

  10. Java 图片、文件 Base64 互转

    Java 图片.文件 Base64 互转 package com.thoth.his.base.util; import java.io.FileInputStream; import java.io ...