当前位置: 首页 > 编程日记 > 正文

eBCC性能分析最佳实践(1) - 线上lstat, vfs_fstatat 开销高情景分析...

Guide:

  • eBCC性能分析最佳实践(0) - 开启性能分析新篇章
  • eBCC性能分析最佳实践(1) - 线上lstat, vfs_fstatat 开销高情景分析
  • eBCC性能分析最佳实践(2) - 一个简单的eBCC分析网络函数的latency
  • 敬请期待...

0. Intro

BCC是基于4.x kernel版本上的ebpf发展出来的一套性能分析工具集;

eBCC,顾名思义则是extended BCC的缩写,是阿里巴巴内核团队在Aliyun Linux 2 上对BCC项目的拓展,包含BCC本身已有的工具集,和我们新开发的一些小的工具; eBCC则是基于在最新的BCC版本0.9之上做了一些拓展。

Aliyun Linux则使用了相对比较前沿,较新的kernel版本,支持ebpf特性,所以,如果想尝试ebpf,eBCC带来的系统上对“性能优化调试” 和 “问题诊断”上的新体验,那就请赶快升级到 Aliyun Linux 2 上吧。

1. eBCC 分析 "A业务线" 线上机器cpu sys - lstat开销大

对于kernel团队的同学来说,排查问题,和性能数据分析的时候,通常情况下会先从宏观的脚本去分析整机各个子系统:SCHED,MEM,IO,NET的性能是否存在bottleneck。然后再通过各种专业的工具来剖析对应的子系统。

当我们遇到cpu sys很高的情况的时候,根据我们的经验,比较常见的可能原因为:

  1. 可能是某个kernel thread在疯狂
  2. 可能是某个syscall被用户层频繁调用,或者是某个syscall的链路上出现很大的latency

第一种情况可能比较好发现问题,针对第二种情况,比较麻烦,难以发现。

于是我们开发了eBCC工具集,来帮助用户定位问题。

下面让我们开始寻找一个线上机器, 看是否存在性能瓶颈吧....

  • 业务方: A业务
  • 诊断物理机: xxxxx
  • 内核版本: 4.19
  • 诊断工具: eBCC

1.1 SYS级别诊断 - 发现问题

如下图所示,是目标机器top10开销较大的syscall。其中TIME, MIN, MAX的时间单位都是ns

注意,这里我们的工具实际上采集了4个数据,次数,时间,最小时间,最大时间。

实际上,只有这四个数据都存在的时候,我们才能很快的分析出这里是否存在问题,是否正常。 如果我们仅仅知道COUNT,不知道时间,这是不能说明问题的。

因为次数多,不一定代表开销大。开销大,不一定代表次数多。

实际上select,poll这些操作所占用的时间开销是属于正常的的,但是,看到lstat系统调用时间开销多达338769324ns(338ms), 就是不正常的现象了! 因此,这可能就是一个可以优化的地方...

进一步分析lstat的MIN TIME, MAX TIME看上去都不大,因此可以确定这个syscall链路上并没有出现latency很大的问题,但是COUNT多达124724次,这也许才是开销很大的关键。。。

换几台线上机器,发现都存在lstat开销比较大的问题...

image

因此我们需要进一步排查哪个pid导致?

1.2 PID级别诊断 - 定位问题

  • eBCC的syscall性能分析模块,支持SYS级别和PID级别的数据采集, 我们一般应该先从SYS级别入手,发现问题的方向之后,再通过PID级别找到触发问题的元凶。
  • 第1列: pid, 第2列: syscall NR , 第3列: syscall name, 第4列 是调用次数, 第5列 是调用时间开销,单位ns, 第6列: min time (ns), 第7列: max time(ns)

image

1.3 找到元凶: PID:91885

image

1.4 Code分析

tools/perf/builtin-trace.c:     { .name     = "lstat",      .errmsg = true, .alias = "newlstat", },SYSCALL_DEFINE2(newlstat, const char __user *, filename,struct stat __user *, statbuf)
{struct kstat stat;int error;error = vfs_lstat(filename, &stat);if (error)return error;return cp_new_stat(&stat, statbuf);
}int vfs_lstat(const char __user *name, struct kstat *stat)
{return vfs_fstatat(AT_FDCWD, name, stat, AT_SYMLINK_NOFOLLOW);
}
EXPORT_SYMBOL(vfs_lstat);

1.5 perf辅助证明

通过perf来帮助证明eBCC的数据采集是否精确。

[root@xxx /root]
#perf stat -e syscalls:sys_enter_newlstat  -a sleep 4Performance counter stats for 'system wide':449931      syscalls:sys_enter_newlstat4.000941076 seconds time elapsed

基本可以说明,lstat的触发次数确实很大。

1.6 syscall次数统计

[root@xxx /root]
#ebcc syscount
Tracing syscalls, printing top 10... Ctrl+C to quit.^C[14:58:52]
SYSCALL                   COUNT
close                   1173795
lstat                   1052795
futex                    667981
read                     325349
getdents64               257280
epoll_wait               255386
epoll_ctl                250355
write                    144328
openat                   115240
open                     111810

eBCC另外一个工具syscount 同样可以采集出次数。

1.7 vfs层证明

lstat 系统调用同样会反应到vfs的触发次数: vfs_fstatat

[root@xxx /root]
#ebcc vfscount
Tracing... Ctrl-C to end.^C
ADDR             FUNC                          COUNT
ffffffff8124f8b1 vfs_symlink                       1
ffffffff8124f711 vfs_create                       11
ffffffff812426e1 vfs_readv                        22
ffffffff8124fbd1 vfs_unlink                       27
ffffffff81277c31 vfs_fsync_range                  98
ffffffff812790d1 vfs_statfs                     1126
ffffffff81269d51 vfs_getxattr                   1248
ffffffff812428f1 vfs_writev                     1749
ffffffff81250b01 vfs_rename                     2353
ffffffff8129bb51 vfs_lock_file                  6167
ffffffff8124d031 vfs_get_link                  21829
ffffffff812476b1 vfs_fstat                     50744
ffffffff81242301 vfs_write                    151061
ffffffff81240891 vfs_open                     181734
ffffffff812421d1 vfs_read                     336899
ffffffff81247711 vfs_fstatat                 1055146    --- tigger counts
ffffffff81247681 vfs_getattr                 1109493
ffffffff81247401 vfs_getattr_nosec           1130229

1.8 核心分析:开销来自于 “用户调用次数” 还是 “内核里vfs_fstatat 函数本身的latency” ?

Answer:

如下图所示,基本都在2-3个us就完成了。基本上可以说,latency不是很大,基本符合disk,nvme本身的latency,因此,开销主要来自counts,因此,优化调用次数,比 优化 这个内核函数本身的latency要有意义。

image

1.9 根本原因

通过eBCC中的工具追踪,发现logagent疯狂的使用vfs_fstatat,遍历A业务/home/admin/XXXX/worker/slave/disk_links/9999/ 目录下的文件, 至此,我们基本就把问题分析清楚了。

[root@xxx /home]
#/usr/share/ebcc/tools/trace -p 91885 'vfs_fstatat "%s", arg2'
91885   121566  logagent        vfs_fstatat      /home/admin/XXXX/worker/slave/disk_links/9999/auto_umars_YYYY_4_YYYY.TPP_mc
91885   121566  logagent        vfs_fstatat      /home/admin/XXXX/worker/slave/disk_links/9999/auto_umars_YYYY_4_YYYY.TPP_mc
91885   121566  logagent        vfs_fstatat      /home/admin/XXXX/worker/slave/disk_links/9999/auto_umars_YYYY_4_YYYY.TPP_mc
91885   121566  logagent        vfs_fstatat      /home/admin/XXXX/worker/slave/disk_links/9999/auto_umars_YYYY_4_YYYY.TPP_mc
91885   121566  logagent        vfs_fstatat      /home/admin/XXXX/worker/slave/disk_links/9999/auto_umars_YYYY_4_YYYY.TPP_mc
91885   121566  logagent        vfs_fstatat      /home/admin/XXXX/worker/slave/disk_links/9999/auto_umars_YYYY_4_YYYY.TPP_mc
91885   121566  logagent        vfs_fstatat      /home/admin/XXXX/worker/slave/disk_links/9999/auto_umars_YYYY_4_YYYY.TPP_mc
91885   121566  logagent        vfs_fstatat      /home/admin/XXXX/worker/slave/disk_links/9999/auto_umars_YYYY_4_YYYY.TPP_mc
91885   121566  logagent        vfs_fstatat      /home/admin/XXXX/worker/slave/disk_links/9999/auto_umars_YYYY_4_YYYY.TPP_mc
91885   121566  logagent        vfs_fstatat      /home/admin/XXXX/worker/slave/disk_links/9999/auto_umars_YYYY_4_YYYY.TPP_mc
91885   121566  logagent        vfs_fstatat      /home/admin/XXXX/worker/slave/disk_links/9999/auto_umars_YYYY_4_YYYY.TPP_mc
91885   121566  logagent        vfs_fstatat      /home/admin/XXXX/worker/slave/disk_links/9999/auto_umars_YYYY_4_YYYY.TPP_mc
91885   121566  logagent        vfs_fstatat      /home/admin/XXXX/worker/slave/disk_links/9999/auto_umars_YYYY_4_YYYY.TPP_mc
91885   121566  logagent        vfs_fstatat      /home/admin/XXXX/worker/slave/disk_links/9999/auto_umars_YYYY_4_YYYY.TPP_mc
91885   121566  logagent        vfs_fstatat      /home/admin/XXXX/worker/slave/disk_links/9999/auto_umars_YYYY_4_YYYY.TPP_mc
91885   121566  logagent        vfs_fstatat      /home/admin/XXXX/worker/slave/disk_links/9999/auto_umars_YYYY_4_YYYY.TPP_mc
91885   121566  logagent        vfs_fstatat      /home/admin/XXXX/worker/slave/disk_links/9999/auto_umars_YYYY_4_YYYY.TPP_mc
91885   121566  logagent        vfs_fstatat      /home/admin/XXXX/worker/slave/disk_links/9999/auto_umars_YYYY_4_YYYY.TPP_mc
91885   121566  logagent        vfs_fstatat      /home/admin/XXXX/worker/slave/disk_links/9999/auto_umars_YYYY_4_YYYY.TPP_mc
91885   121566  logagent        vfs_fstatat      /home/admin/XXXX/worker/slave/disk_links/9999/auto_umars_YYYY_4_YYYY.TPP_mc
91885   121566  logagent        vfs_fstatat      /home/admin/XXXX/worker/slave/disk_links/9999/auto_umars_YYYY_4_YYYY.TPP_mc
91885   121566  logagent        vfs_fstatat      /home/admin/XXXX/worker/slave/disk_links/9999/auto_umars_YYYY_4_YYYY.TPP_mc
91885   121566  logagent        vfs_fstatat      /home/admin/XXXX/worker/slave/disk_links/9999/auto_umars_YYYY_4_YYYY.TPP_mc
91885   121566  logagent        vfs_fstatat      /home/admin/XXXX/worker/slave/disk_links/9999/auto_umars_YYYY_4_YYYY.TPP_mc
91885   121566  logagent        vfs_fstatat      /home/admin/XXXX/worker/slave/disk_links/9999/auto_umars_YYYY_4_YYYY.TPP_mc
91885   121566  logagent        vfs_fstatat      /home/admin/XXXX/worker/slave/disk_links/9999/auto_umars_YYYY_4_YYYY.TPP_mc

2. Conclution

image

  • logagent在这个机器上有大量的lstat操作,平均每秒:11w次; 整机open次数,平均每秒:12w次。
  • 整机看vfs_fstatat 本身的latency,基本都在2-3us内完成, 没有太大的内核态似乎没有太大latency可以优化,因此,用户态的程序 优化 也许有更好的 效果。
  • logagent在机器运行1s内,大概开销占用总cpu的:338ms; 现在整机96core,那么就相当于有96s, 如果整机cpu sys占用:3%, 机器运行1s内,内核sys大概占用了3.456s,那么如果优化掉这338ms,cpu sys利用率会降低9.7%=(338ms/3.456s)。
  • 查看“A业务线”多个机器,发现是个通用现象。

相关文章:

spring-data-mongodb必须了解的操作

http://docs.spring.io/spring-data/data-mongo/docs/1.0.0.M5/api/org/springframework/data/mongodb/core/MongoTemplate.html 在线api文档 1关键之识别 KeywordSampleLogical resultGreaterThanfindByAgeGreaterThan(int age){"age" : {"$gt" : age}}Le…

旷视张祥雨:高效轻量级深度模型的研究和实践 | AI ProCon 2019

演讲嘉宾 | 张祥雨(旷视研究院主任研究员、基础模型组负责人)编辑 | Just出品 | AI科技大本营(ID:rgznai100)基础模型是现代视觉识别系统中一个至关重要的关注点。基础模型的优劣主要从精度、速度或功耗等角度判定,如何…

Python脱产8期 Day02

一 语言分类 机器语言,汇编语言,高级语言(编译和解释) 二 环境变量 1、配置环境变量不是必须的2、配置环境变量的目的:为终端提供执行环境 三Python代码执行的方式 1交互式:.控制台直接编写运行python代码 …

分别用Eigen和C++(OpenCV)实现图像(矩阵)转置

(1)、标量(scalar):一个标量就是一个单独的数。(2)、向量(vector):一个向量是一列数,这些数是有序排列的,通过次序中的索引,可以确定每个单独的数。(3)、矩阵(matrix):矩阵是一个二维数组,其中的…

Linux基础优化

***************************************************************************************linux系统的优化有很多,我简单阐述下我经常优化的方针:记忆口诀:***********************一清、一精、一增;两优、四设、七其他。*****…

数据集cifar10到Caffe支持的lmdb/leveldb转换的实现

在 http://blog.csdn.net/fengbingchun/article/details/53560637 对数据集cifar10进行过介绍,它是一个普通的物体识别数据集。为了使用Caffe对cifar10数据集进行train,下面实现了将cifar10到lmdb/leveldb的转换实现:#include "funset.h…

计算两个时间的间隔时间是多少

/*** 计算两个时间间隔* param startTime 开始时间* param endTime 结束时间* param type 类型(1:相隔小时 2:)* return*/public static int compareTime(String startTime, String endTime, int type) {if (endTime nul…

作为西二旗程序员,我是这样学习的.........

作为一名合格的程序员,需要时刻保持对新技术的敏感度,并且要定期更新自己的技能储备,是每个技术人的日常必修课。但要做到这一点,知乎上的网友说最高效的办法竟然是直接跟 BAT 等一线大厂取经。讲真的,BAT大厂的平台是…

2月国内搜索市场:360继续上升 百度下降0.62%

IDC评述网(idcps.com)03月06日报道:根据CNZZ数据显示,在国内搜索引擎市场中,百度在2014年2月份所占的份额继续被蚕食,环比1月份,下降了0.62%,为60.50%。与此相反,360搜索…

不止于刷榜,三大CV赛事夺冠算法技术的“研”与“用”

(由AI科技大本营付费下载自视觉中国)整理 | Jane出品 | AI科技大本营(ID:rgznai100)在 5 个月时间里(5月-9月),创新工场旗下人工智能企业创新奇智连续在世界顶级人脸检测竞赛 WIDER …

Ubuntu14.04上编译指定版本的protobuf源码操作步骤

Google Protobuf的介绍可以参考 http://blog.csdn.net/fengbingchun/article/details/49977903 ,这里介绍在Ubuntu14.04上编译安装指定版本的protobuf的操作步骤,这里以2.4.1为例:1. Ubuntu14.04上默认安装的是2.5.0,…

Linux下,各种解压缩命令集合

Linux下,各种解压缩命令集合tar xvfj lichuanhua.tar.bz2tar xvfz lichuanhua.tar.gztar xvfz lichuanhua.tgztar xvf lichuanhua.tarunzip lichuanhua.zip.gz解压 1:gunzip FileName.gz解压 2:gzip -d FileName.gz压缩:gzip File…

gtest使用初级指南

之前在 http://blog.csdn.net/fengbingchun/article/details/39667571 中对google的开源库gtest进行过介绍,现在看那篇博文,感觉有些没有说清楚,这里再进行总结下:Google Test是Google的开源C单元测试框架,简称gtest。…

iOS视频流采集概述(AVCaptureSession)

需求:需要采集到视频帧数据从而可以进行一系列处理(如: 裁剪,旋转,美颜,特效....). 所以,必须采集到视频帧数据. 阅读前提: 使用AVFoundation框架采集音视频帧数据GitHub地址(附代码) : iOS视频流采集概述 简书地址 : iOS视频流采…

300秒搞定第一超算1万年的计算量,量子霸权时代已来?

(由AI科技大本营付费下载自视觉中国)作者 | 马超责编 | 郭芮来源 | CSDN 博客近日,美国航天局(NASA)发布了一篇名为《Quantum Supremacy Using a Programmable Superconducting Processor》的报道,称谷歌的…

2014-3-6 星期四 [第一天执行分析]

昨日进度: [毛思想]:看测控技术量待定 --> [良]超额完成,昨天基本上把测控看了一大半啦 [汇编]:认真听课,边听边消化自学 --> [中]基本满足,还需要抽时间总结,特别是前面寻址的各种情况…

行列式介绍及Eigen/OpenCV/C++的三种实现

行列式,记作det(A),是一个将方阵A映射到实数的函数。行列式等于矩阵特征值的乘积。行列式的绝对值可以用来衡量矩阵参与矩阵乘法后空间扩大或者缩小了多少。如果行列式是0,那么空间至少沿着某一维完全收缩了,使其失去了所有的体积…

基于Go的语义解析开源库FMR,“屠榜”模型外的NLP利器

(由AI科技大本营付费下载自视觉中国)作者 | 刘占亮 一览群智技术副总裁编辑 | Jane出品 | AI科技大本营(ID:rgznai100)如何合理地表示语言的内在意义?这是自然语言处理业界中长久以来悬而未决的一个命题。在…

【高级数据类型2】- 10. 接口

2019独角兽企业重金招聘Python工程师标准>>> Go语言-接口 在Go语言中,一个接口类型总是代表着某一种类型(即所有实现它的类型)的行为。一个接口类型的声明通常会包含关键字type、类型名称、关键字interface以及由花括号包裹的若干…

Linux软件包命令

2019独角兽企业重金招聘Python工程师标准>>> dpkg命令&#xff1a; dpkg -i **/**.deb 安装软件 dpkg -x **.deb 解开.deb文件 dpkg -r /-p 删除并清配置 更详细的 用dpkg --help 查询 如下&#xff1a; dpkg -i|--install <.deb 文件的文件名> ... | -R|--re…

Caffe中计算图像均值的实现(cifar10)

在深度学习中&#xff0c;在进行test时经常会减去train数据集的图像均值&#xff0c;这样做的好处是&#xff1a;属于数据预处理中的数据归一化&#xff0c;降低数据间相似性&#xff0c;可以将数值调整到一个合理的范围。以下code是用于计算cifar10中训练集的图像均值&#xf…

阿里云弹性公网IP(EIP)的使用限制

阿里云弹性公网IP&#xff08;EIP&#xff09;是一种可以独立购买和持有的公网IP地址资源&#xff0c;弹性公网IP具有独立购买持有、弹性绑定和配置灵活等优势&#xff0c;但实际使用中弹性公网IP也是有很多限制的&#xff0c;阿里云惠网分享弹性公网IP&#xff08;EIP&#xf…

400名微软员工主动曝光薪资:28万元到228万元不等!

作者 | Dave Gershgorn译者 | 弯月&#xff0c;编辑 | 郭芮来源 | CSDN&#xff08;ID&#xff1a;CSDNnews&#xff09;【导读】近日&#xff0c;近400名微软员工分享了他们的薪酬&#xff08;从4万美元到32万美元不等&#xff0c;约为28万人民币到228万人民币&#xff09;&am…

Extjs:添加查看全部按钮

var grid new Ext.grid.GridPanel({renderTo:tsllb,title:产品成本列表,selModel:csm,height:350,columns:[csm,{header: "编码", dataIndex: "bm", sortable: true,hidden:true},{header: "产品", dataIndex: "cp", sortable: true},…

练手扎实基本功必备:非结构文本特征提取方法

作者 | Dipanjan (DJ) Sarkar编译 | ronghuaiyang来源 | AI公园&#xff08;ID:AI_Paradise&#xff09;【导读】本文介绍了一些传统但是被验证是非常有用的&#xff0c;现在都还在用的策略&#xff0c;用来对非结构化的文本数据提取特征。介绍在本文中&#xff0c;我们将研究如…

范数介绍及C++/OpenCV/Eigen的三种实现

有时我们需要衡量一个向量的大小。在机器学习中&#xff0c;我们经常使用被称为范数(norm)的函数衡量向量大小。形式上&#xff0c;Lp范数定义如下&#xff1a;范数(包括Lp范数)是将向量映射到非负值的函数。直观上来说&#xff0c;向量x的范数衡量从原点到点x的距离。更严格地…

js添加网页水印和three.js场景中加水印

我们在日常网页开发的时候&#xff0c;可能想给自己的网页或者canvas里面添加水印&#xff0c;增添个人标记&#xff0c;我这里分为普通静态html页面和threejs中3d场景里面添加水印功能。一 静态html页面添加水印你只需要在你的页面添加一个图片遮罩&#xff0c;通过绝对定位和…

JAVA学习笔记(6)

关于多线程的优先级&#xff0c;这个程序里面&#xff0c;现在计算机比较好&#xff0c;int存储不下了&#xff0c;我跑了好几次都是负分&#xff0c;特把int改成long。但是之后跑出来的结果&#xff0c;两个数字都差不多&#xff0c;不知道是什么问题&#xff1f;等待答案中。…

C++/C++11中std::deque的使用

std::deque是双端队列&#xff0c;可以高效的在头尾两端插入和删除元素&#xff0c;在std::deque两端插入和删除并不会使其它元素的指针或引用失效。在接口上和std::vector相似。与sdk::vector相反&#xff0c;std::deque中的元素并非连续存储&#xff1a;典型的实现是使用一个…

贾扬清:我对人工智能方向的一点浅见

阿里妹导读&#xff1a;作为 AI 大神&#xff0c;贾扬清让人印象深刻的可能是他写的AI框架Caffe &#xff0c;那已经是六年前的事了。经过多年的沉淀&#xff0c;成为“阿里新人”的他&#xff0c;对人工智能又有何看法&#xff1f;最近&#xff0c;贾扬清在阿里内部分享了他的…