自定义函数查看OS的file cache

简介

在OS中使用cache机制,主要为了提高磁盘的读取效率,避免高频的IO交换。将频繁访问的数据存放在file cache中,下一次在获取的时候就可以直接读取,缓存高命中率对于数据高速检索十分有利。

smem

smem 是一个可以显示 Linux 系统中进程内存使用情况的工具,它可以显示包括进程共享的内存部分,如文件缓存。你可以使用它来查看每个进程的内存使用情况(包括共享内存)。

smem -k 
会有以下字段
PID:监控的进程号
User:监控的进程owner
Command:监控的允许指令
Swap:监控的进程在交换分区(swap)中使用的内存量
USS:监控的进程独占集大小,即该进程唯一占用的内存量,不包括与其他进程共享的内存。这个值表示进程专有的物理内存部分PSS:监控的进程比例集大小,即按比例分摊的共享内存部分。如果两个或多个进程共享同一块内存区域,那么每个进程的 PSS 会分摊这块共享内存的大小。PSS 值为 共享内存的大小 / 共享进程的数量,并加上独占内存。RSS:监控的进程驻留集大小,即进程实际占用的物理内存总量,包括了进程独占的内存和与其他进程共享的内存,但不考虑共享内存的实际使用情况。

smem工具主要是通过解析/proc/{pid}/smaps 文件内容,以进行相应的展示
image.png

查看postgresql 相关进程占用情况

smem -k | grep -E 'User|postgres'

image.png

/proc/{pid}/smaps

系统中每个进程的详细内存映射文件。拥有比smaps 更为详细的信息内容。
以下是postgresql 主进程的

00400000-00c10000 r-xp 00000000 fd:00 1715955                            /home/postgres/pg/bin/postgres
Size:               8256 kB
Rss:                1540 kB
Pss:                 995 kB
Shared_Clean:        756 kB
Shared_Dirty:          0 kB
Private_Clean:       784 kB
Private_Dirty:         0 kB
Referenced:         1540 kB
Anonymous:             0 kB
AnonHugePages:         0 kB
Swap:                  0 kB
KernelPageSize:        4 kB
MMUPageSize:           4 kB
Locked:                0 kB
ProtectionKey:         0
VmFlags: rd ex mr mp me dw sd
00400000-00c10000 r-xp 00000000 fd:00 1715955 /home/postgres/pg/bin/postgres

00400000-00c10000: 虚拟内存的地址范围,表示此内存段的起始地址(00400000)到结束地址(00c10000)。

r-xp: 这个内存段的权限标识。
r: 可读(Read)。
x: 可执行(Execute)。
p: 私有(Private),表示写入的更改不会共享给其他进程。

00000000: 文件偏移量,表示如果该段映射到文件,文件从哪个偏移开始映射。此处为 00000000,表示从文件开头映射。

fd:00: 设备 ID,指示该文件所在的设备号。

1715955: 该文件的 inode 编号,用于唯一标识文件。

/home/postgres/pg/bin/postgres: 映射的文件路径,表示这个内存段映射的是 Postgres 可执行文件的部分。

Size:

表示这个段在虚拟内存中的总大小。

Rss:

表示已经实际驻留在物理内存中的部分大小,也就是这个段的 1540 KB 已经加载到了 RAM 中。

Pss:

表示按比例分摊的物理内存使用量。如果多个进程共享该内存段,PSS 会根据共享进程数分摊计算。

Shared_Clean:

表示该段有 756 KB 的干净(未修改)内存页被多个进程共享。

Shared_Dirty:

该段的 Shared_Dirty 是 0 KB,表示该段没有被共享的修改页(即未被其他进程修改)。

Private_Clean:

该段的 Private_Clean 是 784 KB,表示该段有 784 KB 的干净(未修改)内存页,仅供当前进程使用,不会与其他进程共享。

Private_Dirty:

该段的 Private_Dirty 是 0 KB,表示该段没有任何私有的修改页。

Referenced:

Referenced 是 1540 KB,表示该段内存自从加载后,已经有 1540 KB 被访问过。

Anonymous:

该段的 Anonymous 是 0 KB,表示该段没有任何匿名内存。匿名内存通常是没有文件映射的内存,通常用于堆和栈空间。

AnonHugePages:

AnonHugePages 是 0 KB,表示该段没有使用巨大页(HugePages),巨大页通常用于提升内存管理效率。

Swap:

Swap 是 0 KB,表示该段内存没有被交换到硬盘(即没有被放入 swap 空间)。

KernelPageSize:

KernelPageSize 是 4 KB,表示内核的页面大小为 4 KB,这是常见的内存页大小。

MMUPageSize:

MMUPageSize 是 4 KB,表示内存管理单元(MMU)的页面大小为 4 KB。通常,KernelPageSize 和 MMUPageSize 是相同的。

Locked:

Locked 是 0 KB,表示这个段内存没有被锁定在物理内存中。被锁定的内存无法被交换到磁盘上。

ProtectionKey:

ProtectionKey 是 0,表示该段没有使用内存保护键。这是与现代 CPU 的内存保护机制相关的字段。

VmFlags: rd ex

VmFlags 表示该段内存的各种标志:
rd: 可读(Readable)。
ex: 可执行(Executable)。
mr: 可被内存管理单元(MMU)读取。
mp: 使用了巨页(HugePage)的页中介表(Page Middle Directory)。
me: 支持内存扩展(Memory Expansion)。
dw: 延迟写入(Delayed Write),通常用于文件系统缓存。
sd: 支持软脏页追踪(Soft Dirty),用于记录内存写入状态。

自定义函数

那就数据库端,写个脚本定时查看其file cache情况

CREATE OR REPLACE FUNCTION compare_data(pid integer)
RETURNS SETOF record AS $$
import redef parse_smaps(pid):smaps_file = f"/proc/{pid}/smaps"rows = []try:with open(smaps_file, 'r') as file:current_entry = {}for line in file:if re.match(r'^[0-9a-f]+-[0-9a-f]+', line):if current_entry:rows.append(generate_row(pid, current_entry))current_entry = {}# Extract start_addr, end_addr, offset, device, inode, and pathparts = line.split()current_entry['start_addr'], current_entry['end_addr'] = parts[0].split('-')current_entry['offset'] = parts[2]current_entry['device'] = parts[3]current_entry['inode'] = parts[4]if len(parts) > 5:current_entry['path'] = parts[5]else:current_entry['path'] = Noneelif line.startswith('Size:'):current_entry['Size'] = line.split()[1]elif line.startswith('Rss:'):current_entry['Rss'] = line.split()[1]elif line.startswith('Pss:'):current_entry['Pss'] = line.split()[1]elif line.startswith('Shared_Clean:'):current_entry['Shared_Clean'] = line.split()[1]elif line.startswith('Shared_Dirty:'):current_entry['Shared_Dirty'] = line.split()[1]elif line.startswith('Private_Clean:'):current_entry['Private_Clean'] = line.split()[1]elif line.startswith('Private_Dirty:'):current_entry['Private_Dirty'] = line.split()[1]elif line.startswith('Referenced:'):current_entry['Referenced'] = line.split()[1]elif line.startswith('Anonymous:'):current_entry['Anonymous'] = line.split()[1]elif line.startswith('AnonHugePages:'):current_entry['AnonHugePages'] = line.split()[1]elif line.startswith('Swap:'):current_entry['Swap'] = line.split()[1]elif line.startswith('KernelPageSize:'):current_entry['KernelPageSize'] = line.split()[1]elif line.startswith('MMUPageSize:'):current_entry['MMUPageSize'] = line.split()[1]elif line.startswith('Locked:'):current_entry['Locked'] = line.split()[1]elif line.startswith('ProtectionKey:'):current_entry['ProtectionKey'] = line.split()[1]elif line.startswith('VmFlags:'):current_entry['VmFlags'] = line.split()[1:]if current_entry:rows.append(generate_row(pid, current_entry))except FileNotFoundError:return []return rowsdef generate_row(pid, entry):# Prepare the row as a tuple to returnreturn (pid, entry.get('start_addr'), entry.get('end_addr'), entry.get('offset'), entry.get('device'),entry.get('inode'), entry.get('path'), entry.get('Size'), entry.get('Rss'), entry.get('Pss'),entry.get('Shared_Clean'), entry.get('Shared_Dirty'), entry.get('Private_Clean'), entry.get('Private_Dirty'),entry.get('Referenced'), entry.get('Anonymous'), entry.get('AnonHugePages'), entry.get('Swap'),entry.get('KernelPageSize'), entry.get('MMUPageSize'), entry.get('Locked'), entry.get('ProtectionKey'),' '.join(entry.get('VmFlags', [])))rows = parse_smaps(pid)
# PL/Python expects a return statement with a list of rows to return them as records
return rows
$$ LANGUAGE plpython3u;

执行函数

SELECT * FROM compare_data(39469) AS t(pid integer, start_addr text, end_addr text, "offset" text, device text, inode text, path text, size text, rss text, pss text, shared_clean text, shared_dirty text, private_clean text, private_dirty text, referenced text, anonymous text, anonhugepages text, swap text, kernelpagesize text, mmupagesize text, "locked" text, protectionkey text, vmflags text);

image.png

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/56617.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【即见未来,为何不拜】聊聊分布式系统中的故障监测机制——Phi Accrual failure detector

前言 昨天在看tcp拥塞控制中的BBR(Bottleneck Bandwidth and Round-trip propagation time)算法时,发现了这一特点: 在BBR以前的拥塞控制算法中(如Reno、Cubic、Vegas),都依赖于丢包事件的发生,在高并发时则会看到网络波动的现象…

uni-app使用v-show编译成微信小程序的问题

问题 在uni-app使用v-show语法编译成微信小程序会有一个问题 当我们设置成v-show"false" 在Hbuilder X里面确实没有显示 然后运行到 微信开发程序里面 发现显示了出来,说明设置的 v-show"false"没有起作用 解决办法 首先去uniapp官网查看v…

uniapp打包安卓apk步骤

然后安装在手机上就可以啦

火狐浏览器 Firefox v131.0.2 第三方tete009编译便携版

火狐浏览器是一款非常优秀的浏览器,它的兼容性和稳定性非常出色,备受全球用户的青睐。Firefox便携版是Firefox浏览器的一个特别版本,它可以在没有安装的情况下使用,非常方便。tete009 Firefox 编译版的启动和加载图片时间是所有火…

Ubuntu内存扩容

目录 vmware设置Ubuntu设置查看 读研后发现,Ubuntu的使用量直线上升,之前给配置了20g内存,安装了个ros后,没啥内存了。本文实现给Ubuntu扩容。 vmware设置 这里 我使用别人的截图来演示。 我在这里改成了60 Ubuntu设置 sudo a…

JS 分支语句

目录 1. 表达式与语句 1.1 表达式 1.2 语句 1.3 区别 2. 程序三大流控制语句 3. 分支语句 3.1 if 分支语句 3.2 双分支 if 语句 3.3 双分支语句案例 3.3.1 案例一 3.3.2 案例二 3.4 多分支语句 1. 表达式与语句 1.1 表达式 1.2 语句 1.3 区别 2. 程序三大流控制语…

每天花2分钟学数字化转型,第三讲:数智化

​对于智能化(intelligence),我的理解是:你中有我,我中有你「人机一体」的世界。 阅读本文,你将快速知晓“智能化”的定义与价值,通过生活实例让你对智能化有一个全新的理解。 最后还会介绍“…

Keil中代码补全功能和自动缩进功能设置

一、自动缩进功能的设置,在按回车键换行或者按Tab键的时候是有缩进的,还可以进行缩进设置。可以通过以下步骤进行设置:①Edit(编辑)->②Configuration(配置)->③Tab size(Tab缩进长度)在T…

单机redis和mysql服务器的承载压力

单机环境下,Redis 和 MySQL 的承载压力主要取决于多种因素,如硬件配置、数据规模、查询模式、读写比例、以及优化程度等。以下是一些关键点: Redis 的承载压力 Redis 是基于内存的键值数据库,通常用于高速缓存和高频率读取场景…

在Linux中搭建WordPress并实现Windows主机远程访问

WordPreWordPress是一个基于PHP开发的开源平台,适用于在支持PHP与MySQL数据库的服务器上搭建个性化博客或网站。同时,它也能够作为功能强大的内容管理系统(CMS)被广泛应用。 虚拟机:VirtualBox 虚拟机安装&#x1f449…

ES-入门-http-多条件查询范围查询

must 表示多个条件需要同时满足 在postman 对应的参数配置如下 {"query": {"bool": {"must" : [{"match" :{"category":"小米"}},{"match":{"price":3999.00}}]}} } 如下图查询的结果是需…

Golang 代码质量检查工具 | golangci-lint

背景 开发团队代码,保持一个统一的风格和规范,有利于团队协作和交流。 对代码进行质量检查,能达到以下作用: 提高代码质量:代码质量检查可以帮助团队发现潜在的错误和问题,从而提高代码的稳定性和可靠性。…

Power BI:链接数据库与动态数据展示案例

一、案例背景 在数据驱动的时代,如何高效、直观地展示和分析数据成为了企业决策和个人洞察的关键。Power BI作为一款强大的商业智能工具,凭借其强大的数据连接能力、丰富的可视化选项以及交互性和动态性,成为了众多企业和个人的首选。本文将…

Anthropic分享RAG最佳实践:Contextual Retrieval

先说结论,Anthropic提出了一种显著改进RAG中检索步骤的方法。这种方法被称为“上下文检索(Contextual Retrieval)”: 它使用两种子技术:上下文嵌入(Contextual Embeddings)和上下文BM25这种方法…

pdf删除几个页面怎么操作?PDF页面删除的快捷方法

pdf删除几个页面怎么操作?在日常办公与学习中,PDF文件因其跨平台兼容性和良好的格式保持性而广受欢迎。然而,随着文件内容的累积,PDF文档往往会变得庞大而臃肿,不仅占用存储空间,还可能在传输时造成不便。因…

mysql 慢查询日志slowlog

慢查询参数 slow log 输出示例 # Time: 2024-08-08T22:39:12.80425308:00 #查询结束时间戳 # UserHost: root[root] localhost [] Id: 83 # Query_time: 2.331306 Lock_time: 0.000003 Rows_sent: 9762500 Rows_examined: 6250 SET timestamp1723127950; select *…

FAST-LIVO复现

文章目录 FAST-LIVO准备工作编译运行复现效果 FAST-LIVO FAST-LIVO(Fast LiDAR-Inertial-Visual Odometry)是一种融合LiDAR(激光雷达)、惯性测量单元(IMU)和视觉信息的里程计算法。它旨在提供高精度和实时…

MySQL 执行流程是怎样的?

可以看到, MySQL 的架构共分为两层:Server 层和存储引擎层, Server 层负责建立连接、分析和执行 SQL。MySQL 大多数的核心功能模块都在这实现。存储引擎层负责数据的存储和读取。 InnoDB、MyISAM、Memory。不同的存储引擎共用一个 Server 层…

7-基于国产化FT-M6678+JFM7K325T的6U CPCI信号处理卡

一、板卡概述 本板卡系我公司自主研发,基于6U CPCI的通用高性能信号处理平台。板卡采用一片国产8核DSP FT-C6678和一片国产FPGA JFM7K325T-2FFG900作为主处理器。为您提供了丰富的运算资源。如下图所示: 二、设计参考标准 ● PCIMG 2.0 R3.0 CompactP…

推荐一个可以免费上传PDF产品图册的网站

​在数字化时代,企业将产品图册以PDF格式上传至网络,不仅便于客户浏览和下载,还能提升企业的专业形象。今天,就为您推荐一个可以免费上传PDF产品图册的网站——FLBOOK,轻松实现产品图册的在线展示。 1.注册登录&#x…