摘要:要看到具體的函數就需要用擴展或者用調試,高級點還可以用。就是要跟蹤的進程。原理眾所周知,是用寫的,而各種函數調用的信息都會用語言的來表示,所以只要兩步就能拿到堆棧信息讀取進程的內存在內存里找到函數調用堆棧信息第一步可以通過或實現。
生產環境多多少少會遇到CPU占用很高或者卡住的PHP進程,這時怎樣才能知道這個進程在干啥呢?
一個方法是strace跟蹤系統調用和參數,這樣能大概知道PHP進程在干啥。要看到具體的PHP函數就需要用PHP擴展(xdebug、xhprof)或者用GDB調試,高級點還可以用DTrace。
上周發現了ruby-stacktrace,它直接讀取ruby進程的內存來獲取堆棧信息,不用GDB和擴展,所以性能很好,于是我也照著寫了一個php-stacktrace,算是勉強能用的玩具。
使用使用比較簡單,下載解壓即可:
</>復制代碼
$ ./php-stacktrace --help
php-stacktrace 0.1
Sampling profiler for PHP programs
USAGE:
php-stacktrace
FLAGS:
-h, --help Prints help information
-V, --version Prints version information
ARGS:
trace or top or oneshot
Path to php debuginfo
PID of the PHP process you want to profile
三個參數都是必填的。
COMMAND可以是trace、top、oneshot。oneshot只查看一次就退出,trace和top會一直跟蹤,trace的輸出可以用來生成火焰圖,top統計函數耗時。
DEBUGINFO是調試信息文件的路徑,Linux通常要獨立安裝debuginfo包,因為不會從elf里解析路徑,所以要通過這個參數指定,通常的路徑是/usr/lib/debug/.dwz/php....(在隱藏目錄里,是個小坑)。
PID就是要跟蹤的PHP進程ID。
順帶一提,只支持非線程安全的PHP 7.1。
原理眾所周知,Zend VM是用C寫的,而各種PHP函數調用的信息都會用C語言的struct/union來表示,所以只要兩步就能拿到堆棧信息:
讀取PHP進程的內存
在內存里找到函數調用堆棧信息
第一步可以通過ptrace或process_vm_readv實現。ptrace就是調試器所用的方法,它可以暫停PHP進程然后讀取內存。process_vm_readv可以不暫停進程,性能可能更好,但是不可靠,因為PHP還在執行,堆棧信息不斷變化,很容易讀到錯誤的內存。
第二步就需要DWARF調試信息了,調試信息里記錄了結構體大小、字段偏移信息,通過這些信息我們就可以準確地去讀內存然后做解析。
原理還是很簡單的。
下一步復制vm_stack,盡量在一次process_vm_readv拿到主要的堆棧信息
增加作用域信息,現在只有函數名
完善錯誤處理,現在的代碼是一團糟
多學點Rust
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/30615.html
摘要:按使用的語言來總結一下年。第三個后端項目,還算比較成功,上線了大半年,沒有明顯的性能問題,做修改也是非常容易。還用了一個集群去做部署先是阿里云的集群方案,后是,集群監控日志采集配置管理等等都沒少弄。 showImg(https://segmentfault.com/img/bV0VHw?w=1495&h=1144); 按使用的語言來總結一下2017年。 TypeScript 用Type...
摘要:點擊進入我的博客命令行工具這些工具大多數是類庫的一層薄的包裝,它們的主要功能代碼是在類庫中實現的。可視化工具是到目前為止隨發布的功能最強大的運行監視和故障處理程序,并且可以預見在未來一段時間內都是官方主力發展的虛擬機故障處理工具。 點擊進入我的博客 3.1 JDK命令行工具 showImg(https://segmentfault.com/img/remote/14600000174...
摘要:下文如無特殊聲明將使用進程同時表示進程線程。收到數據后服務器程序進行處理然后使用向客戶端發送響應。現在各種高并發異步的服務器程序都是基于實現的,比如。 并發 IO 問題一直是服務器端編程中的技術難題,從最早的同步阻塞直接 Fork 進程,到 Worker 進程池/線程池,到現在的異步IO、協程。PHP 程序員因為有強大的 LAMP 框架,對這類底層方面的知識知之甚少,本文目的就是詳細介...
摘要:多進程中與多進程相關的兩個重要拓展是和。函數執行期間,主進程除了等待無法處理其他任務,所以一般不認為這是多進程編程。回收子進程有兩種方式,一種是主進程調用函數等待子進程結束另外一種是處理信號。 轉載請注明文章出處: https://tlanyan.me/php-review... PHP回顧系列目錄 PHP基礎 web請求 cookie web響應 session 數據庫操作 加解...
摘要:本文是關于我如何應用基本性能分析技術,借助火焰圖做了一處小改進,使得我們計算機集群的狀況獲得了倍的改善,并在第二年幫助節省了幾百萬刀。最終,通過對平均大小在的事件進行批量插入,我們的吞吐量獲得了的提高。 本文是關于我如何應用基本性能分析技術,借助火焰圖做了一處小改進,使得我們 Postgres 計算機集群的 CPU 狀況獲得了 10 倍的改善,并在第二年幫助 Heap 節省了幾百萬刀。針對用...
閱讀 2301·2023-04-25 14:22
閱讀 3741·2021-11-15 18:12
閱讀 1298·2019-08-30 15:44
閱讀 3220·2019-08-29 15:37
閱讀 647·2019-08-29 13:49
閱讀 3462·2019-08-26 12:11
閱讀 879·2019-08-23 18:28
閱讀 1586·2019-08-23 14:55
极致性价比!云服务器续费无忧!
Tesla A100/A800、Tesla V100S等多种GPU云主机特惠2折起,不限台数,续费同价。
NVIDIA RTX 40系,高性价比推理显卡,满足AI应用场景需要。
乌兰察布+上海青浦,满足东推西训AI场景需要