一、简介

关于molten的介绍网上有很多,是一个全链路追踪的工具,Molten可以看做是phptrace的的升级版(流行的php问题定位工具譬如phptrace,xhprof,这些工具可以自行Google,看看如何使用)

Molten能干啥

molten追踪php核心调用库运行时信息并且按照zipkin/optracing格式输出信息。
可以追踪`curl,pdo,mysqli,redis,mongodb,memcached` 这么多的运行信息。

你可以直接看到你耗时比较久的接口的运行信息,调用信息,一眼就能看到哪个地方慢

二、安装

zipkin 开源分布式系统调用跟踪工具(java写的工具),所以系统需要安装Java或者docker
molten为php作对应的数据收集

1、安装Java

最简单的方式rpm 安装,我这里可以直接安装

yum -y install java

查看Java安装情况

[root@localhost~]# java -version
openjdk version "1.8.0_212"
OpenJDK Runtime Environment (build 1.8.0_212-b04)
OpenJDK 64-Bit Server VM (build 25.212-b04, mixed mode)

2、安装依赖

yum -y install libevent-devel

3、安装molten

cd /usr/local/src
git clone https://github.com/chuan-yun/Molten.git cd Molten
phpize
./configure --enable-zipkin-header=yes
make && make install

4、配置molte.ini

[molten]
extension="molten.so"
molten.enable="1"
molten.service_name="local"
molten.tracing_cli=1
molten.open_report=1
molten.sampling_type=2
molten.sampling_rate=1
molten.notify_uri="http://127.0.0.1:9411/zipkin/"
molten.sink_http_uri="http://127.0.0.1:9411/api/v1/spans"
molten.sink_type=4
molten.sink_log_path="/tmp/logs/"

5、下载并启动zipkin

curl -sSL https://zipkin.apache.org/quickstart.sh | bash -s

java -jar zipkin.jar --logging.level.zipkin=DEBUG 2>&1 >/dev/null &

启动界面

                                    ********
** **
* *
** **
** **
** **
** **
********
****
****
**** ****
****** **** ***
****************************************************************************
******* **** ***
**** ****
**
** ***** ** ***** ** ** ** ** **
** ** ** * *** ** **** **
** ** ***** **** ** ** ***
****** ** ** ** ** ** ** ** :: Powered by Spring Boot :: (v2.1.5.RELEASE) 2019-05-21 22:26:30.113 INFO 19403 --- [ main] z.s.ZipkinServer : Starting ZipkinServer v2.14.0 on iZwz9ccq9xttkykppxhkwtZ with PID 19403
2019-05-21 22:26:30.123 DEBUG 19403 --- [ main] z.s.ZipkinServer : Running with Spring Boot v2.1.5.RELEASE, Spring v5.1.7.RELEASE
2019-05-21 22:26:30.123 INFO 19403 --- [ main] z.s.ZipkinServer : The following profiles are active: shared
2019-05-21 22:26:34.586 INFO 19403 --- [ main] c.l.a.c.Flags : com.linecorp.armeria.verboseExceptions: false (default)
2019-05-21 22:26:34.587 INFO 19403 --- [ main] c.l.a.c.Flags : com.linecorp.armeria.verboseSocketExceptions: false (default)
2019-05-21 22:26:34.587 INFO 19403 --- [ main] c.l.a.c.Flags : com.linecorp.armeria.verboseResponses: false (default)
2019-05-21 22:26:34.667 INFO 19403 --- [ main] c.l.a.c.Flags : com.linecorp.armeria.useEpoll: true (default)
2019-05-21 22:26:34.927 INFO 19403 --- [ main] c.l.a.c.Flags : com.linecorp.armeria.useOpenSsl: true (default)
2019-05-21 22:26:34.930 INFO 19403 --- [ main] c.l.a.c.Flags : com.linecorp.armeria.maxNumConnections: 2147483647 (default)
2019-05-21 22:26:34.930 INFO 19403 --- [ main] c.l.a.c.Flags : com.linecorp.armeria.numCommonWorkers: 2 (default)
2019-05-21 22:26:34.931 INFO 19403 --- [ main] c.l.a.c.Flags : com.linecorp.armeria.numCommonBlockingTaskThreads: 200 (default)
2019-05-21 22:26:34.941 INFO 19403 --- [ main] c.l.a.c.Flags : com.linecorp.armeria.defaultMaxRequestLength: 10485760 (default)
2019-05-21 22:26:34.942 INFO 19403 --- [ main] c.l.a.c.Flags : com.linecorp.armeria.defaultMaxResponseLength: 10485760 (default)
2019-05-21 22:26:34.942 INFO 19403 --- [ main] c.l.a.c.Flags : com.linecorp.armeria.defaultRequestTimeoutMillis: 10000 (default)
2019-05-21 22:26:34.942 INFO 19403 --- [ main] c.l.a.c.Flags : com.linecorp.armeria.defaultResponseTimeoutMillis: 15000 (default)
2019-05-21 22:26:34.943 INFO 19403 --- [ main] c.l.a.c.Flags : com.linecorp.armeria.defaultConnectTimeoutMillis: 3200 (default)
2019-05-21 22:26:34.943 INFO 19403 --- [ main] c.l.a.c.Flags : com.linecorp.armeria.defaultWriteTimeoutMillis: 1000 (default)
2019-05-21 22:26:34.947 INFO 19403 --- [ main] c.l.a.c.Flags : com.linecorp.armeria.defaultServerIdleTimeoutMillis: 15000 (default)
2019-05-21 22:26:34.948 INFO 19403 --- [ main] c.l.a.c.Flags : com.linecorp.armeria.defaultClientIdleTimeoutMillis: 10000 (default)
2019-05-21 22:26:34.948 INFO 19403 --- [ main] c.l.a.c.Flags : com.linecorp.armeria.defaultHttp2InitialConnectionWindowSize: 1048576 (default)
2019-05-21 22:26:34.949 INFO 19403 --- [ main] c.l.a.c.Flags : com.linecorp.armeria.defaultHttp2InitialStreamWindowSize: 1048576 (default)
2019-05-21 22:26:34.951 INFO 19403 --- [ main] c.l.a.c.Flags : com.linecorp.armeria.defaultHttp2MaxFrameSize: 16384 (default)
2019-05-21 22:26:34.952 INFO 19403 --- [ main] c.l.a.c.Flags : com.linecorp.armeria.defaultHttp2MaxStreamsPerConnection: 2147483647 (default)
2019-05-21 22:26:34.952 INFO 19403 --- [ main] c.l.a.c.Flags : com.linecorp.armeria.defaultHttp2MaxHeaderListSize: 8192 (default)
2019-05-21 22:26:34.956 INFO 19403 --- [ main] c.l.a.c.Flags : com.linecorp.armeria.defaultHttp1MaxInitialLineLength: 4096 (default)
2019-05-21 22:26:34.957 INFO 19403 --- [ main] c.l.a.c.Flags : com.linecorp.armeria.defaultHttp1MaxHeaderSize: 8192 (default)
2019-05-21 22:26:34.957 INFO 19403 --- [ main] c.l.a.c.Flags : com.linecorp.armeria.defaultHttp1MaxChunkSize: 8192 (default)
2019-05-21 22:26:34.957 INFO 19403 --- [ main] c.l.a.c.Flags : com.linecorp.armeria.defaultUseHttp2Preface: true (default)
2019-05-21 22:26:34.957 INFO 19403 --- [ main] c.l.a.c.Flags : com.linecorp.armeria.defaultUseHttp1Pipelining: false (default)
2019-05-21 22:26:34.958 INFO 19403 --- [ main] c.l.a.c.Flags : com.linecorp.armeria.defaultBackoffSpec: exponential=200:10000,jitter=0.2 (default)
2019-05-21 22:26:34.958 INFO 19403 --- [ main] c.l.a.c.Flags : com.linecorp.armeria.defaultMaxTotalAttempts: 10 (default)
2019-05-21 22:26:34.965 INFO 19403 --- [ main] c.l.a.c.Flags : com.linecorp.armeria.routeCache: maximumSize=4096 (default)
2019-05-21 22:26:34.966 INFO 19403 --- [ main] c.l.a.c.Flags : com.linecorp.armeria.compositeServiceCache: maximumSize=256 (default)
2019-05-21 22:26:34.966 INFO 19403 --- [ main] c.l.a.c.Flags : com.linecorp.armeria.parsedPathCache: maximumSize=4096 (default)
2019-05-21 22:26:34.966 INFO 19403 --- [ main] c.l.a.c.Flags : com.linecorp.armeria.headerValueCache: maximumSize=4096 (default)
2019-05-21 22:26:34.967 INFO 19403 --- [ main] c.l.a.c.Flags : com.linecorp.armeria.cachedHeaders: :authority,:scheme,:method,accept-encoding,content-type (default)
2019-05-21 22:26:34.974 INFO 19403 --- [ main] c.l.a.c.Flags : com.linecorp.armeria.annotatedServiceExceptionVerbosity: unhandled (default)
2019-05-21 22:26:34.979 INFO 19403 --- [ main] c.l.a.c.Flags : Using /dev/epoll
2019-05-21 22:26:34.979 INFO 19403 --- [ main] c.l.a.c.Flags : Using OpenSSL: BoringSSL, 0x1010007f
2019-05-21 22:26:35.504 INFO 19403 --- [ main] c.l.a.s.d.DocStringExtractor : Using com.linecorp.armeria.thrift.jsonDir: META-INF/armeria/thrift
2019-05-21 22:26:35.538 INFO 19403 --- [ main] c.l.a.c.u.SystemInfo : Hostname: izwz9ccq9xttkykppxhkwtz (from /proc/sys/kernel/hostname)
2019-05-21 22:26:36.036 INFO 19403 --- [oss-http-*:9411] c.l.a.s.Server : Serving HTTP at /0.0.0.0:9411 - http://127.0.0.1:9411/
2019-05-21 22:26:36.037 INFO 19403 --- [ main] c.l.a.s.ArmeriaAutoConfiguration : Armeria server started at ports: {/0.0.0.0:9411=ServerPort(/0.0.0.0:9411, [http])}
2019-05-21 22:26:36.139 INFO 19403 --- [ main] c.d.d.core : DataStax Java driver 3.7.1 for Apache Cassandra
2019-05-21 22:26:36.166 INFO 19403 --- [ main] c.d.d.c.GuavaCompatibility : Detected Guava >= 19 in the classpath, using modern compatibility layer
2019-05-21 22:26:37.149 INFO 19403 --- [ main] c.d.d.c.ClockFactory : Using native clock to generate timestamps.
2019-05-21 22:26:37.577 INFO 19403 --- [ main] z.s.ZipkinServer : Started ZipkinServer in 9.103 seconds (JVM running for 11.001)

6、分析数据

可以打开 http://127.0.0.1:9411/zipkin/  进行数据分析了

三、功能

现在Molten提供curl、pdo、mysqli、redis、mongodb、memcached等组件的拦截,这些信息拦截都是应用透明,开箱即用,输出zipkin格式非常方便。

查看molten是否正常启动了,可以访问:http://your.domain/molten/status:

输出内容格式让人感到疑惑,其实这个是prometheus监控exporter输出格式,输出这种格式方便和prometheus集成。

还可以通过POST http://your.domain/molten/status修改探针采样的方式,内容如下:

{"enable":1,"samplingType":2,"samplingRate":20,"samplingRequest":100}

其中samplingType是采样类型:1是根据采样率采样,2是根据每分钟的请求数。

samplingRate是采样率,即多少个请求采样一个,samplingRequest是每分钟的前多少个请求被采样。采样是降低性能损耗的有效方式,通过还能够根据系统的承载量动态的调整。

还可通过molten.sink_type设置数据输出方式, 1是输出到文件中, 2输出到标准输出,4 通过http发送。

Molten在phptrace数据分析的基础上进行大量的开发, 本身性能在开启采样率的情况下影响较小。

应用影响如下:

四、增加trace方法

分析源码文件 molten_intercept.c可以看到在 `mo_intercept_ctor` 方法中,通过在 MINIT 阶段注入相关的方法实现了对调用的监控。

其中 PDO

PDOStatement@execute
PDO@exec
PDO@query
PDO@commit
PDO@prepare

其中 mysqli

mysqli_connect mysqli@__construct
mysqli_real_connect mysqli@real_connect
mysqli_query mysqli@query
mysqli_prepare mysqli@prepare
mysqli_stmt_prepare mysqli_stmt@prepare
mysqli_stmt_execute mysqli_stmt@execute
mysqli@commit

其中 curl

curl_setopt
curl_exec
curl_setopt_array
curl_reset

可以看到 molten 对 PHP 常用的远程调用服务方法都做了监控,但还不够全面,更新也不够及时,如果我们想对其他方法监控(比如 rpc、predis、kafka 等)可以做一些改造。

参考其他的方法追加代码

/* predis */
{
ADD_INTERCEPTOR_TAG(pit, Predis\\Client);
INIT_INTERCEPTOR_ELE(Predis\\Client@__construct, &default_capture, &default_predis_record);
INIT_INTERCEPTOR_ELE(Predis\\Client@__call, &default_capture, &default_predis_record);
}

针对 predis 编写predis_request_record方法

/* {{{ predis default method record */
static void default_predis_record(mo_interceptor_t *pit, mo_frame_t *frame)
{
zval *span = build_com_record(pit, frame, 0); merge_span_extra(span, frame); pit->psb->span_add_ba_ex(span, "componet", "Predis\\Client", frame->exit_time, pit->pct, BA_NORMAL); pit->psb->span_add_ba_ex(span, "db.type", "redis", frame->exit_time, pit->pct, BA_NORMAL); /* check exception */
SET_DEFAULT_EXCEPTION(frame, pit); /* add span */
mo_chain_add_span(pit->pct->pcl, span);
}

  

【PHP】关于系统性能追踪工具molten的更多相关文章

  1. Java动态,安全追踪工具

    Java动态,安全追踪工具 在我们日常的开发中,总是难以避免的要解决线上的问题.如果线上的问题我们在本地调试的时候无论调试多少次发现明明本地调用了这个方法呀,怎么线上就是没调呢?还有就是出了问题的时候 ...

  2. 监控Linux系统性能的工具--nmon(一)

    今天看到一资料上写着,nmon可以对linux系统进行性能监控,随手在自己的阿里云上敲了一下这个命令,提示'command not find' 一脸懵~,然后探索了一下如何安装这个工具以及如何更好的查 ...

  3. Linux系统性能统计工具Sar和实时系统性能监控脚本

    sar(System Activity Reporter系统活动情况报告)是目前 Linux 上最为全面的系统性能分析工具之一,可以从多方面对系统的活动进行报告,包括:文件的读写情况.系统调用的使用情 ...

  4. Linux系统性能诊断工具纲要

    Linux的性能分析工具众多,在微博上发现了系统性能专家Brendan D. Gregg,在最近LinuxCon NA 2014大会上发布的关于Linux性能方面的talk和幻灯片.和去年比较,今年增 ...

  5. linux下关于程序性能和系统性能的工具、方法

    观察性能/状态的方法:top free netstat /pro/目录下的信息 其中/pro/meminfo下的信息相当丰富 ------------------------------------- ...

  6. 链路追踪工具之Zipkin学习小记

    (接触了Zipkin,权将所了解或理解的记于此,以备忘) 分布式追踪系统 随着业务发展,系统拆分多个微服务.此时对于一个前端请求可能需要调用多个后端端服务才能完成,当整个请求变慢或不可用时,我们是无法 ...

  7. Linux运维之系统性能---vmstat工具分析内存的瓶颈

    为了提高磁盘存取效率, Linux做了一些精心的设计, 除了对dentry进行缓存(用于VFS,加速文件路径名到inode的转换), 还采取了两种主要Cache方式:Buffer Cache和Page ...

  8. 基于BranchTraceStore机制的CPU执行分支追踪工具 —— CpuWhere [修正版 仅驱动]

    [前言] 在张银奎老师的<软件调试>一书中,详细地讲解了使用内存的分支记录机制——BTS机制(5.3),并且给出了示例工具CpuWhere及其源代码.但实际运行(VMware XP_SP3 ...

  9. 追踪工具strace

    目录 一.简介 二.例子 找出程序读取的文件 查看现在程序在做什么 查看程序中哪个部分消耗大量cpu 无法连接服务器查看信息 一.简介 Linux 操作系统有很多用来跟踪程序行为的工具,内核态的函数调 ...

随机推荐

  1. Ubantu搭建虚拟环境

    配置虚拟环境 Ubantu16.0.4 1.安装python虚拟环境 sudo apt-get install virtualenv 2.vrtaulenvwrapper是virtualenv的扩展包 ...

  2. 配置docker服务器支持远程连接

    操作系统:linux-ubuntu 参考文档:https://cloud.tencent.com/developer/article/1047265 采用上述文档:非安全的连接方式/服务端配置/通常的 ...

  3. C学习笔记(1)---数据类型,变量,储存类

    1.常用基本数据类型占用空间(64位机器为例): char : 1个字节 -- int :4个字节 -- float:4个字节 -- double:8个字节 2.书写类型: A.整数: a. 默认为1 ...

  4. 第50 课C++对象模型分析——成员函数(上)

    类中的成员函数位于代码段中调用成员函数时对象地址作为参数隐式传递成员函数通过对象地址访问成员变量C++语法规则隐藏了对象地址的传递过程 #include<iostream> #includ ...

  5. 用背包问题思路解决 322. Coin Change(完全背包)

    首先需要明白 0-1 背包问题中的放置表格,见 “玩转算法面试 从真题到思维全面提升算法思维” 9-5 节,本题思路类似表格纵向为:只考虑第 [0 …,… index] 种硬币(物品)表格横向为:需要 ...

  6. appium常使用的命令

    1.查看apk安装包的appPackagehe和appActivity aapt dump badging E:\taobao.apk > E:\taobao.txt   -- 将appPack ...

  7. boostrap --- 弹窗modal的使用

    <input id="btntext" type="button" value="添加文本组件" data-toggle=" ...

  8. Django 连接数据库

    配置数据库 Django 默认连接的是SQLite,如果想要连接MySQL则需修改配置:在 setting.py 中找到数据库的默认配置: DATABASES = { 'default': { 'EN ...

  9. CF-1175 B.Catch Overflow!

    题目大意:有一个初始变量,值为0,三种操作 for x 一个循环的开始,循环x次 end 一个循环的结束 add 将变量值加一 问最后变量的值是否超过2^32-1,若超过,输出一串字符,不超过则输出变 ...

  10. 【2019.7.20 NOIP模拟赛 T2】B(B)(数位DP)

    数位\(DP\) 首先考虑二进制数\(G(i)\)的一些性质: \(G(i)\)不可能有连续两位第\(x\)位和第\(x+1\)位都是\(1\).因为这样就可以进位到第\(x+2\)位.其余情况下,这 ...