前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Go PHP 性能分析之 Pyroscope 的进阶使用

Go PHP 性能分析之 Pyroscope 的进阶使用

作者头像
seth-shi
发布2023-12-18 15:25:18
3580
发布2023-12-18 15:25:18
举报
文章被收录于专栏:seth-shi的专栏

安装

  • 网上很多的教程都是直接一条Docker命令安装运行docker run -it -p 4040:4040 --restart=always pyroscope/pyroscope:latest server
  • 只像上面那样安装的话, 很多配置不能用, 比如数据页面直接展示不需要登录, 不能限制API上报(只允许某些机器上报: 通过Key来限制), 容器销毁后不能保存数据
  • 这里我使用docker-compose.yml来配置
代码语言:javascript
复制
version: "3"
services:
  pyroscope:
    image: "pyroscope/pyroscope:latest"
    ports:
      - "4040:4040"
    command:
      - "server"
    environment:
      ## 限制必须使用 API 秘钥上传
      - PYROSCOPE_AUTH_INGESTION_ENABLED=true
      ## 设置账号密码登录后台
      - PYROSCOPE_AUTH_INTERNAL_ENABLED=true    
    volumes:
      ## 设置数据共享目录
      - ./data:/var/lib/pyroscope
  • 配置好之后, 直接在当前目录运行docker-compose up -d, 然后访问127.0.0.1:4040即可进入登录页面
  • 此时需要输入账号密码方可进入(admin, admin), 进入系统后可以自行修改账号密码
  • 然后添加秘钥 (设置 -> API Keys -> Add Key), 这里稍微要注意的是, Role必须选择Agent才可以上报数据

Pyroscope

Go使用

Go 有两种模式, 拉取模式 类似Prometheus, 由于是自己个人的项目,我选择使用推送的模式

  • 项目增加依赖
代码语言:javascript
复制
# make sure you also upgrade pyroscope server to version 0.3.1 or higher
go get github.com/pyroscope-io/client/pyroscope
  • 项目中启动服务
代码语言:javascript
复制
package main

import "github.com/pyroscope-io/client/pyroscope"


func main() {

    pyroscope.Start(pyroscope.Config{
        // 项目名字, 只能英文不能中文
        ApplicationName: "remeber-dream-api",
        // 按实际自己 pyroscope 服务的地址
        ServerAddress:   "127.0.0.1:4040",
        Logger:          pyroscope.StandardLogger,
        // 如果开启了 PYROSCOPE_AUTH_INGESTION_ENABLED, 
        // 并且按照以上步骤添加了 Key, 那么把 Key 放到此处即可
        AuthToken: "xxxx",
    
        // by default all profilers are enabled,
        // but you can select the ones you want to use:
        ProfileTypes: []pyroscope.ProfileType{
            pyroscope.ProfileCPU,
            pyroscope.ProfileAllocObjects,
            pyroscope.ProfileAllocSpace,
            pyroscope.ProfileInuseObjects,
            pyroscope.ProfileInuseSpace,
        },
    })

    // your code goes here
}

PHP使用

  • 看了一下文档中PHP 直接使用的话, 只能在命令行下分析(php-fpm运行模式直接开启慢日志即可)
  • 由于我的项目使用的是laravel-s, 所以可以使用
  • 镜像文件
代码语言:javascript
复制
FROM phpswoole/swoole:php7.4

# 修改中国镜像源
RUN sed -i "s@http://deb.debian.org@http://mirrors.aliyun.com@g" /etc/apt/sources.list && rm -Rf /var/lib/apt/lists/* && apt-get update

# 快速安装 PHP 扩展
COPY --from=mlocati/php-extension-installer /usr/bin/install-php-extensions /usr/local/bin/

RUN install-php-extensions pcntl redis pdo_mysql gd

WORKDIR /var/www
COPY . .
RUN chmod -R 0777 storage && \
    chmod -R 0777 bootstrap/cache && \
    composer config -g repo.packagist composer https://mirrors.aliyun.com/composer/ && \
    composer install --optimize-autoloader --no-dev && \
    php artisan config:cache && \
    php artisan route:cache && \
    php artisan view:cache && \
    php artisan laravels publish --no-interaction


# this copies pyroscope binary from pyroscope image to your image:
COPY --from=pyroscope/pyroscope:latest /usr/bin/pyroscope /usr/bin/pyroscope

## 建议在 docker run --env 注入环境变量
#ENV PYROSCOPE_SERVER_ADDRESS=
#ENV PYROSCOPE_APPLICATION_NAME=
#ENV PYROSCOPE_AUTH_TOKEN=
## docker run -d --cap-add=sys_ptrace --env PYROSCOPE_SERVER_ADDRESS=xx --env PYROSCOPE_APPLICATION_NAME=xx --env PYROSCOPE_AUTH_TOKEN=xx -p 80:5200 --name monday-shop-service monday-shop

CMD ["pyroscope", "exec", "php", "bin/laravels", "start", "--env=product"]
注意点
  • 不能使用alpine的镜像, 否则容器启动不起来
  • 注入容器的环境变量, 建议通过docker run注入, 这样子可以不用把秘钥等写在Dockerfile
  • 运行的时候把pyroscope exec写在要运行的命令前面, 参考https://pyroscope.io/docs/php/
  • 最后上一张效果图

Pyroscope

  • 因为压测的是一个有缓存的接口, 可以看到时间基本都消耗在路由匹配和Redis的存取当中

字段解释

含义

cpu

inuse_objects

已分配但尚未释放的对象数量

alloc_objects

已分配的对象总数(不论已释放的对象)

inuse_space

已分配但尚未释放的内存数量

alloc_space

分配的内存总量(不管释放了多少内存)

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022-02-15 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 安装
  • Go使用
  • PHP使用
    • 注意点
    • 字段解释
    相关产品与服务
    容器服务
    腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
    领券
    问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档