pgcacher 的简单学习
  HL7exJhKg9j2 2023年11月30日 16 0

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

发现清除缓存之后 第一次的时间是最久的
当被复制的文件进行缓存之后, 后面几次的复制都会有所性能提升.



【版权声明】本文内容来自摩杜云社区用户原创、第三方投稿、转载,内容版权归原作者所有。本网站的目的在于传递更多信息,不拥有版权,亦不承担相应法律责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@moduyun.com

  1. 分享:
最后一次编辑于 2023年11月30日 0

暂无评论

推荐阅读
  tqf4faUYHHCA   2023年12月23日   98   0   0 sedpythonPythonsed
HL7exJhKg9j2