rdebug icon indicating copy to clipboard operation
rdebug copied to clipboard

流量录制,请求后没有php-fpm worker子进程,lsof 没找到加载koala-record.so,session文件夹也没有写入文,koala的debug日志提示说recorded,怎么回事

Open xiaofeitu2 opened this issue 5 years ago • 11 comments

xiaofeitu2 avatar May 23 '19 14:05 xiaofeitu2

找问题找到这里了,我也有这个问题,看了一下dockerfile ,在docker上好像是可以生成的,

RUN install_packages apt-utils git vim curl lsof procps ca-certificates sudo locales supervisor && \
    chmod 444 /usr/local/var/koala/*so && \
    addgroup nobody && \
    sed -i -e 's/\s*Defaults\s*secure_path\s*=/# Defaults secure_path=/' /etc/sudoers && \
        echo "nobody ALL=NOPASSWD: ALL" >> /etc/sudoers && \
    sed -i \
        -e "s/pm = ondemand/pm = static/g" \
        -e "s/^listen = 9000/listen = \/usr\/local\/var\/run\/php-fpm.sock/g" \
        -e "s/^;clear_env = no$/clear_env = no/" \
        /opt/bitnami/php/etc/php-fpm.d/www.conf && \
    sed -i \
        -e "s/user=daemon/user=nobody/g" \
        -e "s/^group=daemon/group=nobody/g" \
        -e "s/listen.owner=daemon/listen.owner=nobody/g" \
        -e "s/listen.group=daemon/listen.group=nobody/g" \
        /opt/bitnami/php/etc/common.conf

是不是php-fpm 分配方式一定要是静态的呢?我的环境是动态的,

还有就是'listen.owner' 'listen.group' 为'nobody' , 这些都是与docker环境上有差的,

nginx 上 我也是走sock的。

location ~ [^/]\.php(/|$) {
    #fastcgi_pass remote_php_ip:9000;
    fastcgi_pass unix:/dev/shm/php-cgi.sock;
    fastcgi_index index.php;
    include fastcgi.conf;
  }

在系统上,我的是centos 7.3,docker上大概走的就是ubuntu,

按这个思路一个个排查,折腾一下。

rain16881 avatar Jun 10 '19 09:06 rain16881

还有个问题就是,在我的开发机上php-fpm是走服务自动启动的,看了一下

录制说明:https://github.com/didi/rdebug/blob/master/doc/recorder/recorder.md

# or, Linux
$ LD_PRELOAD="/usr/local/var/koala/koala-libc.so /usr/lib64/libcurl.so.4" LC_CTYPE="C" KOALA_SO=/usr/local/var/koala/koala-recorder.so KOALA_RECORD_TO_DIR=/usr/local/var/koala /usr/local/sbin/php-fpm

他是在这启动的

然后我把这个写到 '/etc/profile' 中,好像是有点问题

我的配置是这样的

export GOPROXY=https://goproxy.io

export KOALA_SO=/usr/local/var/koala/koala-recorder.so
export KOALA_RECORD_TO_DIR=/usr/local/var/koala
export KOALA_LOG_FILE="/tmp/rdebug/debug.log"
export KOALA_LOG_LEVEL="DEBUG"
export LD_PRELOAD="/usr/local/var/koala/koala-libc.so /usr/lib64/libcurl.so.4"
export LC_CTYPE="C"

#/usr/local/php/sbin/php-fpm

确认'KOALA_RECORD_TO_DIR'可以写

//# Before start php-fpm with koala, export env:
//$ export KOALA_LOG_FILE="/tmp/rdebug/debug.log" KOALA_LOG_LEVEL="DEBUG"
//If everything is ok, but can not find recorded session files. Make sure your KOALA_RECORD_TO_DIR directory can writeable.

rain16881 avatar Jun 10 '19 10:06 rain16881

我这边能成功 log 与 session 产生文件了 , 解决问题主要就是重新编辑了一下

主要是不放到tmp/编译

step01

koala-libc/build.sh

step02

koala/build-recorder.sh

#!/usr/bin/env bash

set -e
set -x

# /mnt1t/__go__/src/github.com/didi/rdebug
RDEBUG=$(cd ../`dirname $0` && pwd -P)


# record to file, only for testing purpose
export GOPATH=/mnt1t/__go__
export CGO_CFLAGS="-DKOALA_LIBC_NETWORK_HOOK -DKOALA_LIBC_FILE_HOOK"
export CGO_CPPFLAGS="-DKOALA_LIBC_NETWORK_HOOK -DKOALA_LIBC_FILE_HOOK"
export CGO_CXXFLAGS="-std=c++11 -Wno-ignored-attributes"
exec go build -tags="koala_recorder" -buildmode=c-shared -o $RDEBUG/output/libs/koala-recorder.so github.com/didi/rdebug/koala/cmd/recorder

step03

koala/build-replayer.sh

#!/usr/bin/env bash

set -e
set -x

# /mnt1t/__go__/src/github.com/didi/rdebug
RDEBUG=$(cd ../`dirname $0` && pwd -P)


# build replayer by default
export CGO_CFLAGS="-DKOALA_LIBC_NETWORK_HOOK -DKOALA_LIBC_FILE_HOOK -DKOALA_LIBC_TIME_HOOK -DKOALA_LIBC_PATH_HOOK"
export CGO_CPPFLAGS="-DKOALA_LIBC_NETWORK_HOOK -DKOALA_LIBC_FILE_HOOK -DKOALA_LIBC_TIME_HOOK -DKOALA_LIBC_PATH_HOOK"
export CGO_CXXFLAGS="-std=c++11 -Wno-ignored-attributes"
go build -tags="koala_replayer" -buildmode=c-shared -o $RDEBUG/output/libs/koala-replayer.so github.com/didi/rdebug/koala/cmd/replayer
cp $RDEBUG/output/libs/koala-replayer.so $RDEBUG/php/midi/res/replayer/koala-replayer.so

但问题是,开了这东西。我的硬盘感觉被占IO, chrome直接是打不开, 没有细测, 屏蔽/etc/profile 的设置了

rain16881 avatar Jun 11 '19 07:06 rain16881

”是不是php-fpm 分配方式一定要是静态的呢?我的环境是动态的, 还有就是'listen.owner' 'listen.group' 为'nobody' , 这些都是与docker环境上有差的,“

fpm 的进程管理模式,是静态还是动态,是没有影响的。 其次,listen 的配置以你环境为准,只要保证 fpm 能够正常运行即可。Docker 的配置只是一个示例。

”在我的开发机上php-fpm是走服务自动启动的“

把环境变量 和 启动命令放到一起。而不是通过 /etc/profile 来控制。这样的好处是,可以通过环境变量来随意切换录制和非录制。可以写一个 shell 脚本来控制 fpm 的启停,在 shell 里设置环境变量,这样可以通过修改 shell 脚本来控制是否开启录制;其次在需要重启服务的时候,直接运行脚本即可。

最终是通过重新编译,才可以录制了?(注意,仓库中自带的 so 是 macOS 版本的,其他系统得重新编译。)

MingliangT avatar Jun 11 '19 09:06 MingliangT

supervisor.conf 里改成/opt/bitnami/php/var/run/php-fpm.pid 然后php-fpm的ini 配置里 /run/php-fpm.pid注释打开 ,这样试试.

xiaofeitu2 avatar Jun 14 '19 10:06 xiaofeitu2

有几个问题请教下

  1. 通过教程启动fpm的时候,进程启动了,没报错,我不知道注入成功了没,可以从哪个地方看? image
  2. 如果第一步启动成功了,但是我curl url(两次)之后,session文件夹没出来,nginx的打出来的日志是200,响应结果正常返回 image
  3. 我按照三楼的教程设置了打印日志,但是我的/usr/local/var/koala文件夹没有打印出来日志,我怀疑是文件写入无权限,修改文件权限之后,依旧是没有
export KOALA_LOG_FILE="/usr/local/var/koala" KOALA_LOG_LEVEL="DEBUG"

备注: 系统版本

Linux version 3.10.0-862.el7.x86_64 ([email protected]) (gcc version 4.8.5 20150623 (Red Hat 4.8.5-28) (GCC) ) #1 SMP Fri Apr 20 16:44:24 UTC 2018

php版本

PHP 7.0.33 (cli)

ps: 烦请帮忙看下

testerSunshine avatar Jul 25 '19 03:07 testerSunshine

有几个问题请教下

  1. 通过教程启动fpm的时候,进程启动了,没报错,我不知道注入成功了没,可以从哪个地方看? image
  2. 如果第一步启动成功了,但是我curl url(两次)之后,session文件夹没出来,nginx的打出来的日志是200,响应结果正常返回 image
  3. 我按照三楼的教程设置了打印日志,但是我的/usr/local/var/koala文件夹没有打印出来日志,我怀疑是文件写入无权限,修改文件权限之后,依旧是没有
export KOALA_LOG_FILE="/usr/local/var/koala" KOALA_LOG_LEVEL="DEBUG"

备注: 系统版本

Linux version 3.10.0-862.el7.x86_64 ([email protected]) (gcc version 4.8.5 20150623 (Red Hat 4.8.5-28) (GCC) ) #1 SMP Fri Apr 20 16:44:24 UTC 2018

php版本

PHP 7.0.33 (cli)

ps: 烦请帮忙看下

lsof -p 18277 

看是否有 koala相关的东西

727155455 avatar Aug 12 '19 15:08 727155455

@testerSunshine 遇到和你一模一样的问题 - - 请问有找到解决办法吗

kayyellow avatar Aug 21 '19 08:08 kayyellow

1.看下 确保php-fpm的配置中close_env=no 2.确保日志目录有权限 3.check下so是不是自己编译,默认好像是mac的

727155455 avatar Aug 21 '19 11:08 727155455

@727155455 针对1,2:都改过配置了,都排除了。 针对3:用的是docker build 出来的,ok吗? 还有rdebug是否与语言无关,java的demo有吗?

kayyellow avatar Aug 22 '19 01:08 kayyellow

@727155455 针对1,2:都改过配置了,都排除了。 针对3:用的是docker build 出来的,ok吗? 还有rdebug是否与语言无关,java的demo有吗?

现支持 PHP,Java 还没人力跟进

MingliangT avatar Aug 27 '19 03:08 MingliangT