【PHP】關於系統性能追蹤工具molten

1、簡介

關於molten的介紹網上有不少,是一個全鏈路追蹤的工具,Molten能夠看作是phptrace的的升級版(流行的php問題定位工具譬如phptrace,xhprof,這些工具能夠自行Google,看看如何使用)php

Molten能幹啥java

molten追蹤php核心調用庫運行時信息而且按照zipkin/optracing格式輸出信息。
能夠追蹤`curl,pdo,mysqli,redis,mongodb,memcached` 這麼多的運行信息。mysql

你能夠直接看到你耗時比較久的接口的運行信息,調用信息,一眼就能看到哪一個地方慢git

2、安裝

zipkin 開源分佈式系統調用跟蹤工具(java寫的工具),因此係統須要安裝Java或者docker
molten爲php做對應的數據收集github

一、安裝Java

最簡單的方式rpm 安裝,我這裏能夠直接安裝redis

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)

二、安裝依賴 

yum -y install libevent-devel

三、安裝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

四、配置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/"

五、下載並啓動zipkin

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

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

啓動界面sql

                                    ********
                                  **        **
                                 *            *
                                **            **
                                **            **
                                 **          **
                                  **        **
                                    ********
                                      ****
                                      ****
        ****                          ****
     ******                           ****                                 ***
  ****************************************************************************
    *******                           ****                                 ***
        ****                          ****
                                       **
                                       **


             *****      **     *****     ** **       **     **   **
               **       **     **  *     ***         **     **** **
              **        **     *****     ****        **     **  ***
             ******     **     **        **  **      **     **   **

:: 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)

六、分析數據

能夠打開 http://127.0.0.1:9411/zipkin/  進行數據分析了mongodb

 

 

 

3、功能

如今Molten提供curl、pdo、mysqli、redis、mongodb、memcached等組件的攔截,這些信息攔截都是應用透明,開箱即用,輸出zipkin格式很是方便。docker

查看molten是否正常啓動了,能夠訪問:http://your.domain/molten/status:apache

輸出內容格式讓人感到疑惑,其實這個是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數據分析的基礎上進行大量的開發, 自己性能在開啓採樣率的狀況下影響較小。

應用影響以下:

4、增長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);
}
相關文章
相關標籤/搜索