使用Perf诊断PostgreSQL性能问题

news2024/11/18 7:40:16

1 编译参数

使用perf获取完整的堆栈信息需要下面几个编译参数:

  • -O0:编译器不做优化
  • -ggdb3:增加了为GDB优化的调试信息,级别是3
  • -g3:增加了调试信息,级别是3
  • -fno-omit-frame-pointer:保留完成的栈帧

但偏向于debug的参数会造成性能降低,生产上也不一定这样编,部分堆栈确实也不妨碍整体性能分析。

一个例子:

./configure --prefix=/pathto --enable-tap-tests --with-tcl --enable-depend --enable-cassert --enable-debug --with-perl --with-openssl --with-libxml CFLAGS="-O0 -ggdb3 -g3 -fno-omit-frame-pointer"

2 函数与地址的关系

perf使用符号表将地址对应到函数名,这里简单总结下函数地址的查看方法。

以exec_simple_query函数为例,这是PG中的一个函数,编译在postgres中,可以使用一些工具拿到函数地址:00000000009f1760

# nm /data02/mingjie/pgroot99/pghome/bin/postgres | grep exec_simple_query
00000000009f1760 t exec_simple_query

# readelf -s /data02/mingjie/pgroot99/pghome/bin/postgres | grep exec_simple_query
 15588: 00000000009f1760  1712 FUNC    LOCAL  DEFAULT   13 exec_simple_query
 
# objdump -t /data02/mingjie/pgroot99/pghome/bin/postgres | grep exec_simple_query
00000000009f1760 l     F .text	00000000000006b0              exec_simple_query

实际运行时,加载到内存中时,因为每个进程有自己的私有内存地址空间,所以函数地址就会用0x9f1760

gdb -p 2591493
(gdb) info address exec_simple_query
Symbol "exec_simple_query" is a function at address 0x9f1760.

(gdb) p exec_simple_query
$1 = {void (const char *)} 0x9f1760 <exec_simple_query>

(gdb) x/32 0x9f1750
0x9f1750 <pg_plan_queries+331>:	-1065091072	-18971377	-1958150145	-1010173883
0x9f1760 <exec_simple_query>:	-443987883	-521371320	1207959552	-14107255
0x9f1770 <exec_simple_query+16>:	93061119	8198448	266093961	127206838
0x9f1780 <exec_simple_query+32>:	1166540927	-280639781	-2054469632	-216
0x9f1790 <exec_simple_query+48>:	1761970504	1207992691	-14121589	-1991704577
0x9f17a0 <exec_simple_query+64>:	180166	-2048393216	-2147483066	1946213245
0x9f17b0 <exec_simple_query+80>:	1345382405	-1243086848	-402653145	10635
0x9f17c0 <exec_simple_query+96>:	-519730360	1207992077	-521615479	1224736753

在这里插入图片描述

使用pmap查看PG进程后,发现

  1. PG的函数加载到400000 - 11bc000地址范围内
  2. PG的静态库加载到11bc000 - 11bd000地址范围内
  3. PG的全局变量加载到11bd000 - 11d800011d8000 - 2041000地址范围内
  4. 后面是一些malloc、共享内存映射等拿到的地址空间。
  5. 整体用户态空间在0 - ffffffffff600000范围内,高地址放栈、低地址放代码和堆。
# pmap 2591493
2591493:   postgres: mingjie postgres [local] idle
0000000000400000  12020K r-x-- postgres    -- 函数

    -- 00000000009f1760  1712 FUNC    LOCAL  DEFAULT   13 exec_simple_query

00000000011bc000      4K r---- postgres     -- 静态库

    -- 00000000011bcce0    24 OBJECT  GLOBAL DEFAULT   20 xmlIsDigitGroup@LIBXML2_2.6.0 (6)
    -- 00000000011bccc0    24 OBJECT  GLOBAL DEFAULT   20 xmlIsExtenderGroup@LIBXML2_2.6.0 (6)
    -- 00000000011bcd30    24 OBJECT  GLOBAL DEFAULT   20 xmlIsBaseCharGroup@LIBXML2_2.6.0 (6)
    -- 00000000011bcd20    16 OBJECT  WEAK   DEFAULT   20 in6addr_any@GLIBC_2.2.5 (3)

00000000011bd000    108K rw--- postgres     -- 全局变量 extern PGDLLIMPORT ...

    -- 00000000011c2d4e     1 OBJECT  GLOBAL DEFAULT   24 enable_async_append
    -- 00000000011c2d5c     4 OBJECT  GLOBAL DEFAULT   24 constraint_exclusion
    -- 00000000011c2a27     1 OBJECT  GLOBAL DEFAULT   24 log_checkpoints
    
    -- 00000000011bcce0    24 OBJECT  GLOBAL DEFAULT   20 xmlIsDigitGroup@LIBXML2_2.6.0 (6)
    -- 00000000011be9a0     1 OBJECT  GLOBAL DEFAULT   24 synchronize_seqscans
    -- 00000000011be9d0     4 OBJECT  GLOBAL DEFAULT   24 ParallelWorkerNumber
    
       
00000000011d8000    216K rw---   [ anon ]   -- 全局变量 extern PGDLLIMPORT ...

    -- 0000000001207368     1 OBJECT  GLOBAL DEFAULT   25 pg_krb_caseins_users
    -- 00000000011d8150     4 OBJECT  GLOBAL DEFAULT   25 binary_upgrade_next_array
    -- 00000000011dd5b8     1 OBJECT  GLOBAL DEFAULT   25 pgstat_track_activities
    -- 00000000011e2588     8 OBJECT  GLOBAL DEFAULT   25 TopMemoryContext

0000000002041000    412K rw---   [ anon ]
    -- 无
00000000020a8000    916K rw---   [ anon ]
    -- 无
00007fdb78d2b000    260K rw---   [ anon ]
00007fdb78d6c000   1024K rw-s- PostgreSQL.1707624748
00007fdb78e6c000   2312K rw---   [ anon ]
00007fdb790ae000 326000K rw-s- zero (deleted)
00007fdb8cf0a000   2528K r---- LC_COLLATE
00007fdb8d182000     92K r-x-- libgcc_s-8-20210514.so.1
00007fdb8d199000   2044K ----- libgcc_s-8-20210514.so.1
00007fdb8d398000      4K r---- libgcc_s-8-20210514.so.1
00007fdb8d399000      4K rw--- libgcc_s-8-20210514.so.1
00007fdb8d39a000   1560K r-x-- libstdc++.so.6.0.25
00007fdb8d520000   2044K ----- libstdc++.so.6.0.25
00007fdb8d71f000     48K r---- libstdc++.so.6.0.25
00007fdb8d72b000      4K rw--- libstdc++.so.6.0.25
...
00007ffcd99dc000      8K r-x--   [ anon ]
ffffffffff600000      4K r-x--   [ anon ]
 total           420376K

3 PERF TOP

准备压测

drop table t1;
create table t1(c1 serial8 primary key, c2 text, c3 timestamp);
insert into t1 select i, md5(random()::text), now() from generate_series(1, 1000000) t(i);

test.sql

\set aid random(1, 1000000)
select * from t1 where c1 = :aid;

压测开始

pgbench -M prepared -nr -P 1 -f test.sql -c 32 -j 32 -T 600

perf top 观测1

注意这里的Overhead全部是Self的,也就是函数自己在采样中出现的百分比。
在这里插入图片描述

perf top -g 观测2

这里会看到Children和Self两列,怎么理解呢?

  • Self:当前函数本身的代码上消耗CPU时间的百分比,不包括它调用的其他函数的时间。
  • Children:当前函数以及它调用的所有函数上消耗的CPU时间的总和的百分比。

如果一个函数的Self时间很高意味着函数本身的代码效率低下。如果一个函数的Children时间很高,但Self时间相对较低,可能意味着它调用的一个或多个子函数是性能瓶颈。

例如下面可以看到AllocSetCheck的Self时间20.09%(注意这里是按Children来排序的)而第一个PostgresMain的Children占用86.47%,但Self只有0.27%,说明PostgresMain本身的占比很低,但他调用的函数占比很高,加起来有86.47%了,其中之一就是AllocSetCheck。
在这里插入图片描述

注意:children的百分比都是相对于parent的百分比,例如:

-   60.00%  A
     - 30.00%  B
     - 20.00%  C

函数 A 总执行时间的 60%。这包括它自己的代码执行时间以及它调用的所有函数的执行时间。
函数 B 是 A 的一个子函数,它单独占用了 A 执行时间的 30%。
函数 C 也是 A 的一个子函数,它占用了 A 执行时间的 20%。

4 PERF RECORD / PERF REPORT

一般PG独占物理机时,偏IO的业务不会占用很高的CPU,perf看整机不太好看到瓶颈。一般可以指定观测某个PG进程来确认进程瓶颈点,有没有提升空间。

采样某个进程的情况,采样60秒。

perf record -p 86684 -ag -- sleep 60

大部分信息直接看就好了,没必要火焰图。

  1. 按SELF排序:perf report --no-children
    在这里插入图片描述

  2. 按CHILDREN排序:perf report
    在这里插入图片描述

  3. 按SELF排序展开:perf report --no-children --stdio
    在这里插入图片描述

5 PERF STAT

注意vm上使用会有限制,在物理机上测试。

5.1 场景一:关注CPU使用情况perf stat -d

准备数据:

drop table t1;
create table t1(c1 serial8 primary key, c2 text, c3 timestamp);

开始测试:

perf stat -d -- /usr/bin/psql -h127.0.0.1 -U postgres -p 9999 postgres -c "insert into t1 select i, md5(random()::text), now() from generate_series(1, 1000000) t(i)";
INSERT 0 1000000

 Performance counter stats for '/usr/bin/psql -h127.0.0.1 -U postgres -p 9999 postgres -c insert into t1 select i, md5(random()::text), now() from generate_series(1, 1000000) t(i)':

              6.49 msec task-clock                       #    0.002 CPUs utilized             
                 3      context-switches                 #  462.220 /sec                      
                 0      cpu-migrations                   #    0.000 /sec                      
               474      page-faults                      #   73.031 K/sec                     
        16,389,325      cycles                           #    2.525 GHz                         (38.37%)
        14,418,870      instructions                     #    0.88  insn per cycle              (53.78%)
         3,040,699      branches                         #  468.490 M/sec                       (53.77%)
            99,270      branch-misses                    #    3.26% of all branches             (53.69%)
             8,688      L1-dcache-loads                  #  697.749 M/sec                       (30.82%)
           272,823      L1-dcache-load-misses            #    6.02% of all L1-dcache accesses   (30.82%)
            95,365      LLC-loads                        #   14.693 M/sec                       (30.89%)
            28,676      LLC-load-misses                  #   30.07% of all L1-icache accesses   (30.89%)

       4.111546535 seconds time elapsed

       0.003017000 seconds user
       0.003656000 seconds sys

在这里插入图片描述

5.2 场景二:关注L1使用情况perf stat -e

#  perf list | grep L1-dcache
  L1-dcache-loads OR cpu/L1-dcache-loads/
  L1-dcache-load-misses OR cpu/L1-dcache-load-misses/
  L1-dcache-stores OR cpu/L1-dcache-stores/

perf stat -e L1-dcache-loads,L1-dcache-load-misses,L1-dcache-stores -- /usr/bin/psql -h127.0.0.1 -U postgres -p 9999 postgres -c "insert into t1 select i, md5(random()::text), now() from generate_series(1, 1000000) t(i)";

结果

 Performance counter stats for '/usr/bin/psql -h127.0.0.1 -U postgres -p 9999 postgres -c insert into t1 select i, md5(random()::text), now() from generate_series(1, 1000000) t(i)':

         4,977,428      L1-dcache-loads                                                         (60.90%)
           231,942      L1-dcache-load-misses            #    4.66% of all L1-dcache accesses   (66.04%)
         1,978,389      L1-dcache-stores                                                        (73.06%)

       3.889877294 seconds time elapsed

       0.003390000 seconds user
       0.003122000 seconds sys

在这里插入图片描述

5.3 场景三:关注内核调用perf stat -e

注意怎么过滤等于0的事件,否则打印太多。

perf stat -e 'syscalls:*,block:*' -- /usr/bin/psql -h127.0.0.1 -U postgres -p 9999 postgres -c "insert into t1 select i, md5(random()::text), now() from generate_series(1, 1000000) t(i)" 2>&1 | awk '$1 != 0'

在这里插入图片描述

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

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

相关文章

《生成式AI导论》学习笔记

1.课程定位 2.什么是生成式人工智慧&#xff1f; 3. 今日的生成式人工智慧厉害在哪里&#xff1f; 4.训练不了人工智慧&#xff1f;那我训练自己 5.训练不了人工智慧&#xff1f;你可以训练你自己&#xff08;中&#xff09;——拆解问题使用工具 6.大语言模型修炼史——第一阶…

【电控仿真分析笔记】

命令滤波器分析 前馈系数0.9 转速反馈延迟为一阶低通滤波器500 ki/kp的PI控制器 速度环命令滤波 增加前馈延迟的命令滤波 加入命令滤波器 iq&#xff1a;

后台图书管理系统:SSM整合开发案例

代码已经完善,文章内容会在后续补充 代码地址(https://javazhang.lanzn.com/ig8tf1wd2aba 密码:1234) 1.1 .SpringConfig 代码 Configuration ComponentScan({"com.itheima.service" }) PropertySource("classpath:jdbc.properties") Import({JdbcConfig…

在mac上安装node.js及使用npm,yarn相关命令教程

1、安装node.js 官网&#xff1a;Node.js — Download Node.js 选择需要的版本&#xff0c;点击DownLoad 2、点击继续&#xff0c;直到安装成功。 2.1打开终端输入命令node -v 显示版本号则说明已安装成功 3、全局安装yarn命令 1、sudo npm install --global yarn &#xf…

C++笔记:类和对象(一)->封装

类和对象 认识类和对象 先来回忆一下C语言中的类型和变量&#xff0c;类型就像是定义了数据的规则&#xff0c;而变量则是根据这些规则来实际存储数据的容器。类是我们自己定义的一种数据类型&#xff0c;而对象则是这种数据类型的一个具体实例。类就可以理解为类型&#xff0c…

精度论文Generative Prompt Model for Weakly Supervised Object Localization

Generative Prompt Model for Weakly Supervised Object Localization 中国科学院大学&&浙江大学CVPR20231.Abstract 当从图像类别标签中学习对象定位模型时,弱监督对象定位(WSOL)仍然具有挑战性, 传统的鉴别训练激活模型的方法忽略了具有代表性但鉴别性较差的对象…

【深度学习】DDoS-Detection-Challenge aitrans2024 入侵检测,基于机器学习(深度学习)判断网络入侵

当了次教练&#xff0c;做了个比赛的Stage1&#xff0c;https://github.com/AItransCompetition/DDoS-Detection-Challenge&#xff0c;得了100分。 一些记录&#xff1a; 1、提交的flowid不能重复&#xff0c;提交的是非入侵的数量和数据flowid,看check.cpp可知。 2、Stage…

字符串型漏洞注入

SQL注入是一种严重的安全漏洞&#xff0c;它允许攻击者在不受控制的情况下执行任意的SQL代码。这种攻击通常发生在Web应用程序没有正确验证或转义用户输入的情况下。字符串型注入是SQL注入的一种形式&#xff0c;它涉及到在应用程序的输入框中插入恶意的字符串&#xff0c;以干…

Linux套接字编程详解

Linux套接字编程 预备知识IP地址和MAC地址套接字结构网络字节序 UDP套接字编程服务端代码客服端代码 TCP 套接字守护进程 计算器模块1 日志头文件序列化和反序列化 预备知识 IP地址和MAC地址 MAC地址用来在局域网中标识唯一主机 Ip地址用于在广域网中标识唯一主机 &#xff0…

c++的学习之路:26、AVL树

摘要 本章主要是说一下AVL树的实现&#xff0c;这里说的是插入的底层原理 目录 摘要 一、原理 二、四种旋转 1、左单旋 2、右单旋 3、左右双旋 4、右左双旋 三、代码实现 1、节点创建 2、插入 3、旋转 4、判断是否平衡 5、测试 四、代码 一、原理 前面说了搜索…

磁性呼吸传感技术与机器学习结合在COVID-19审断中的应用

介绍 呼吸不仅是人类生存的基础&#xff0c;而且其模式也是评估个体健康状态的关键指标。异常的呼吸模式往往是呼吸系统疾病的一个警示信号&#xff0c;包括但不限于慢性阻塞性肺病&#xff08;COPD&#xff09;、阻塞性睡眠呼吸暂停&#xff08;OSA&#xff09;、肺炎、囊性纤…

vcontact2:病毒聚类(失败)

Bitbucket 安装 mamba create --name vContact2 biopython1.78 mamba install -c bioconda vcontact20.11.3vim ~/envs/vContact2/lib/python3.9/site-packages/vcontact2/exports/summaries.py 把 np.warnings.filterwarnings(ignore) 改成 import warnings warnings.filte…

编译原理 LR(0)

讲解视频&#xff1a;编译原理LR&#xff08;0&#xff09;分析表&#xff08;上&#xff09;_哔哩哔哩_bilibili 【编译原理】LR(0)分析表分析输入串_哔哩哔哩_bilibili 拓广文法 已知G&#xff1a;S->(S)S | ε 拓广文法&#xff1a; S -> S S -> (S)S S -> ε…

Linux gcc day7

动态链接和静态链接 形成的可执行的程序小&#xff1a;节省资源--内存&#xff0c;磁盘 无法c静态库链接的方法 原因是我们没有安装静态c库&#xff08;.a&#xff09; 所以要安装 sudo yum install -y glibc-static gcc static静态编译选项提示错误&#xff1a;/usr/lib/ld:ca…

Property ‘auth‘ does not exist on type ‘AGCApi‘.

Property ‘auth’ does not exist on type ‘AGCApi’. 解决 清理项目重新运行模拟器就可以了

Linux进程详解三:进程状态

文章目录 进程状态Linux下的进程状态运行态-R阻塞态浅度休眠-S深度睡眠-D暂停状态-T暂停状态-t 终止态僵尸-Z死亡-X 孤儿进程 进程状态 进程的状态&#xff0c;本质上就是一个整型变量&#xff0c;在task_struct中的一个整型变量。 状态的存在决定了你的后续行为动作。 Linu…

【力扣 Hot100 | 第六天】4.21(字母异位词分组)

9.字母异位词分组 9.1题目 给你一个字符串数组&#xff0c;请你将 字母异位词 组合在一起。可以按任意顺序返回结果列表。 字母异位词 是由重新排列源单词的所有字母得到的一个新单词。 示例一&#xff1a; 输入: strs ["eat", "tea", "tan&quo…

基于高斯混合模型的视频背景提取和人员跟踪算法matlab仿真

目录 1.算法运行效果图预览 2.算法运行软件版本 3.部分核心程序 4.算法理论概述 5.算法完整程序工程 1.算法运行效果图预览 2.算法运行软件版本 MATLAB2013B 3.部分核心程序 .............................................................................. %我们这里…

数据库系统原理实验报告4 | 数据完整性

整理自博主本科《数据库系统原理》专业课自己完成的实验报告&#xff0c;以便各位学习数据库系统概论的小伙伴们参考、学习。 专业课本&#xff1a; ———— 本次实验使用到的图形化工具&#xff1a;Heidisql 目录 一、实验目的 二、实验内容 1、建表 2、对1题中创建的Stud…

世媒讯提供海内外媒体宣发服务,引领企业新媒体发展之路

在这个信息化的时代&#xff0c;软文发稿已经成为企业发展不可或缺的重要工具。随着社会的快速发展&#xff0c;消费者需要更多定制化、个性化的信息。利用软性推广&#xff0c;凭借其细致入微的信息传递&#xff0c;可以迅速抓住消费者的注意力&#xff0c;从而进一步推动企业…