手机版

PHP的DTrace动态跟踪:使用 PHP 和 DTrace

2019-09-09 阅读 :

在支持 DTrace 动态跟踪的平台上,可以配置 PHP 打开 DTrace 静态探针。

PHP DTrace 静态探针配置

请参考操作系统文档获取启用操作系统 DTrace 支持的信息。 例如,在 Oracle Linux 系统上启动 UEK3 内核,并进行如下操作:
# modprobe fasttrap
# chmod 666 /dev/dtrace/helper

除了 chmod 命令,您也可以使用 ACL 包规则来限制特定用户对于设备的访问权限。

使用 --enable-dtrace 配置参数构建 PHP:
# ./configure --enable-dtrace ...
# make
# make install

这样就启用了 PHP 核心的静态探针。对于提供了自有探针的 PHP 扩展需要分别构建。

PHP 核心的 DTrace 静态探针

PHP 中包括以下可用的静态探针
探针名称 探针描述 探针参数
request-startup 请求开始时触发。 char *file, char *request_uri, char *request_method
request-shutdown 请求关闭时触发。 char *file, char *request_uri, char *request_method
compile-file-entry 脚本开始编译时触发。 char *compile_file, char *compile_file_translated
compile-file-return 脚本完成编译时触发。 char *compile_file, char *compile_file_translated
execute-entry 操作数数组开始执行时触发。例如:函数调用,文件包含以及生成器恢复时会被触发。 char *request_file, int lineno
execute-return 操作数数组执行完毕之后触发。 char *request_file, int lineno
function-entry PHP 引擎进入 PHP 函数或者方法调用时触发。 char *function_name, char *request_file, int lineno, char *classname, char *scope
function-return PHP 引擎从 PHP 函数或者方法调用返回后触发。. char *function_name, char *request_file, int lineno, char *classname, char *scope
exception-thrown 有异常抛出时触发。 char *classname
exception-caught 有异常被捕获时触发。 char *classname
error 无论 error_reporting 的设定如何,在发生错误时都会触发。 char *errormsg, char *request_file, int lineno

PHP 扩展可以拥有额外的静态探针。

列出 PHP 中可用的静态探针

要列出 PHP 中可用的静态探针,开启一个 PHP 进程,然后运行:

# dtrace -l

输出信息类似如下所示:

   ID   PROVIDER            MODULE                          FUNCTION NAME   [ . . . ]    4   php15271               php               dtrace_compile_file compile-file-entry    5   php15271               php               dtrace_compile_file compile-file-return    6   php15271               php                        zend_error error    7   php15271               php  ZEND_CATCH_SPEC_CONST_CV_HANDLER exception-caught    8   php15271               php     zend_throw_exception_internal exception-thrown    9   php15271               php                 dtrace_execute_ex execute-entry   10   php15271               php           dtrace_execute_internal execute-entry   11   php15271               php                 dtrace_execute_ex execute-return   12   php15271               php           dtrace_execute_internal execute-return   13   php15271               php                 dtrace_execute_ex function-entry   14   php15271               php                 dtrace_execute_ex function-return   15   php15271               php              php_request_shutdown request-shutdown   16   php15271               php               php_request_startup request-startup

Provider 一列由 php 和当前进程 id 的组成。

如果运行的是 Apache web 服务器,那么模块名称可能是 libphp5.so, 并且可能会出现多块信息,每个运行中的 Apache 进程对应一个输出块。

Function Name 一列表示 Provider 对应的 PHP 内部 C 实现函数名称。

如果没有运行任何 PHP 进程,那么就不会显示任何 PHP 探针。

PHP DTrace 示例

下例展示了基本的 DTrace D 脚本。

Example #1 all_probes.d for tracing all PHP Static Probes with DTrace

#!/usr/sbin/dtrace -Zs#pragma D option quietphp*:::compile-file-entry{    printf("PHP compile-file-entry/n");    printf("  compile_file              %s/n", copyinstr(arg0));    printf("  compile_file_translated   %s/n", copyinstr(arg1));}php*:::compile-file-return{    printf("PHP compile-file-return/n");    printf("  compile_file              %s/n", copyinstr(arg0));    printf("  compile_file_translated   %s/n", copyinstr(arg1));}php*:::error{    printf("PHP error/n");    printf("  errormsg                  %s/n", copyinstr(arg0));    printf("  request_file              %s/n", copyinstr(arg1));    printf("  lineno                    %d/n", (int)arg2);}php*:::exception-caught{    printf("PHP exception-caught/n");    printf("  classname                 %s/n", copyinstr(arg0));}php*:::exception-thrown{    printf("PHP exception-thrown/n");    printf("  classname                 %s/n", copyinstr(arg0));}php*:::execute-entry{    printf("PHP execute-entry/n");    printf("  request_file              %s/n", copyinstr(arg0));    printf("  lineno                    %d/n", (int)arg1);}php*:::execute-return{    printf("PHP execute-return/n");    printf("  request_file              %s/n", copyinstr(arg0));    printf("  lineno                    %d/n", (int)arg1);}php*:::function-entry{    printf("PHP function-entry/n");    printf("  function_name             %s/n", copyinstr(arg0));    printf("  request_file              %s/n", copyinstr(arg1));    printf("  lineno                    %d/n", (int)arg2);    printf("  classname                 %s/n", copyinstr(arg3));    printf("  scope                     %s/n", copyinstr(arg4));}php*:::function-return{    printf("PHP function-return/n");    printf("  function_name             %s/n", copyinstr(arg0));    printf("  request_file              %s/n", copyinstr(arg1));    printf("  lineno                    %d/n", (int)arg2);    printf("  classname                 %s/n", copyinstr(arg3));    printf("  scope                     %s/n", copyinstr(arg4));}php*:::request-shutdown{    printf("PHP request-shutdown/n");    printf("  file                      %s/n", copyinstr(arg0));    printf("  request_uri               %s/n", copyinstr(arg1));    printf("  request_method            %s/n", copyinstr(arg2));}php*:::request-startup{    printf("PHP request-startup/n");    printf("  file                      %s/n", copyinstr(arg0));    printf("  request_uri               %s/n", copyinstr(arg1));    printf("  request_method            %s/n", copyinstr(arg2));}

此脚本在 dtrace 命令中使用了 -Z 选项。 此选项保证即使在没有任何 PHP 进程运行的时候脚本也能够正确执行。 如果省略了此选项,当没有任何探针可监控的时候,脚本会立即终止执行。

在运行此脚本的过程中,它将监控全部 PHP 核心静态探针。 运行 D 脚本:

# ./all_probes.d

再运行一个 PHP 脚本或者 PHP 应用,用来进行监控的 D 脚本会输出每个探针被触发时所携带的参数。

监控完成之后,使用 ^C 来终止 D 脚本的执行。

在多 CPU 的主机上,探针的显示顺序可能不是连续的,这取决于哪颗 CPU 执行探针以及多个 CPU 之间的线程迁移情况。 可以通过显示探针时间戳来减少混淆,例如:

php*:::function-entry{      printf("%lld: PHP function-entry ", walltimestamp);      [ . . .]}

参见

  • OCI8 和 DTrace 动态跟踪

服务器软件 网络工具 网站工具 服务器教程 服务器知识 服务器技术 服务器之家 vps教程 vps是什么

本文标题:PHP的DTrace动态跟踪:使用 PHP 和 DTrace - 服务器教程_服务器技术_服务器知识_vps教程
本文地址:https://www.helloaliyun.com/tutorial/412.html

相关文章

  • CentOS 7 常用命令(系统关机、重启以及登出)

    关机:(系统的关机、重启以及登出 ) # 关闭系统(1)[root@localhost ~]# shutdown -h now # 关闭系统(2)[root@localhost ~]# init 0 # 关闭系统(3)[root@localhost ~]# telinit 0 # 按预定时间关闭系统[root@localhost...

    2019-12-07 服务器教程
  • linux重启命令 reboot与shutdown -r now的区别与联系

    在linux命令中reboot是重新启动,shutdown -r now是立即停止然后重新启动,都说他们两个是一样的,其实是有一定的区别的。shutdown命令可以安全地关闭或重启Linux系统,它在系统关闭之前给系统上的所有登录用户提示一条警告...

    2019-12-07 服务器教程
  • CentOS 7 如何使用命令重启或关机

    安装GNOME的朋友们首先切换到字符界面。切换到字符界面的方法如下: 先登陆进入系统,进入图形化界面,然后按Ctrl+Alt+F6(笔记本的是Ctrl+Alt+shift+Fn),进入字符界面。关机命令:shutdown或poweroffshutdown:shutdown -h now...

    2019-12-07 服务器教程
  • CentOS 7 正确关机重启的命令方法

    linux主要用于服务器领域,而在服务器上执行一项服务是永无止境的,除非遇到特殊情况,否则不会关机。和Windows不同,在linux系统下,很多进程是在后台执行的。在屏幕背后,可能有很多人同时在工作。如果直接按下电源的按钮,其他...

    2019-12-07 服务器教程
  • CentOS下的yum upgrade和yum update区别,没事别乱用!

    说明:生产环境对软件版本和内核版本要求非常精确,别没事有事随便的进行yum update操作!!!!!!!!!yum update: 升级所有包同时也升级软件和系统内核yum upgrade:只升级所有包,不升级软件和系统内核...

    2019-12-07 服务器教程
你可能感兴趣
热门浏览