使用strace來查詢php的坑
一段廢話
之前的shell分享中提到過strace這個流弊的工具,當時也是用linux C的程式碼造了一個場景來演示,而今再使用php構造一個場景來演示下如何查詢一些坑,儘管差異不是很大
問題
先看下問題,最後會描述下構造的問題,問題如下
[root@c488ca153abc xiaoju]# php7/bin/php strace.php &
執行了一個php指令碼,沒有按照預期時間內返回,目測是阻塞住了
查問題
首先查pid
[root@c488ca153abc xiaoju]# ps aux | grep strace.php
root 12052 0.0 0.0 222344 10816 pts/0 S 18:15 0:00 php7/bin/php strace.php
通過strace看下12052程式的系統呼叫的阻塞情況
[root@c488ca153abc ~]# strace -p 12052
Process 12052 attached
wait4(-1,
可以看到當前阻塞在wait4,該系統呼叫會掛起當前程式,等待指定的子程式狀態改變,其中引數是-1表示等待任一子程式的返回,如此我們去檢視下12052下面的子程式
[root@c488ca153abc ~]# pstree -p 12052
php(12052)───php(12053)
繼續使用strace看看12503為什麼死也不返回
[root@c488ca153abc ~]# strace -p 12053
Process 12053 attached
flock(3, LOCK_EX
好吧,是flock檔案鎖,還是排他鎖,檔案描述符是3,看下對應的檔名是啥
可以通過lsof看,也可以通過/proc/12053/fd目錄檢視,該檔案包含程式開啟檔案的情況
[root@c488ca153abc fd]# ll
總用量 0
lrwx------ 1 root root 64 11月 21 18:16 0 -> /dev/pts/0
lrwx------ 1 root root 64 11月 21 18:16 1 -> /dev/pts/0
lrwx------ 1 root root 64 11月 21 18:16 2 -> /dev/pts/0
lrwx------ 1 root root 64 11月 21 18:16 3 -> /home/xiaoju/lock
lrwx------ 1 root root 64 11月 21 18:16 5 -> socket:[2333709193]
倒數第三列就是檔案描述符,3 -> /home/xiaoju/lock,找到12053心心念唸的檔案了,看下是誰佔用了這個檔案
[root@c488ca153abc fd]# lsof /home/xiaoju/lock | grep -v 12053
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
php 12052 root 3uW REG 253,6 0 17725454 /home/xiaoju/lock
至此,可以斷定是一個'死鎖'了,父程式鎖著檔案等待子程式返回,子程式一直在等待父程式釋放檔案鎖,如果還要進一步確定,可以到/proc/12052/目錄中看到更多詳細的資訊,這裡不贅述.
構造問題
構造了一個如下的問題,使用pcntl_fork建立一個父子程式,父子程式同時開啟一個檔案(核心級別會是兩個不同的控制程式碼),父程式先鎖住A檔案,然後開始pcntl_wait等待子程式的返回,最後釋放鎖,子程式以阻塞模式去獲取檔案鎖,造成一個雙等待的阻塞,如下是php的程式碼
<?php
/**
* Created by tanlin
* Email: jokertanlin@didichuxing.com
* Date: 2018/11/21
* Time: 下午4:49
*/
$pid = pcntl_fork();
$fp = fopen("./lock", "a+");
if ($pid == -1) {
// failed to fork
die('could not fork');
} else if ($pid) {
// parent wait
flock($fp, LOCK_EX);
pcntl_wait($status);
flock($fp, LOCK_UN);
exit(0);
} else {
// child
sleep(5);
$waitIfLocked = true;
flock($fp, LOCK_EX, $waitIfLocked);
exit(0);
}
相關文章
- 使用 strace 查詢 Emacs 啟動阻塞的原因Mac
- Mysql建表、索引、函式、查詢使用中的坑!!!MySql索引函式
- php查詢演算法的理解PHP演算法
- PHP二分查詢PHP
- 使用PHP應用查詢SAP HANA Express Edition裡的資料PHPExpress
- mysql使用KILL命令來終止特定的查詢程序MySql
- MySQL like查詢字元轉義遇到的坑MySql字元
- 二分查詢【折半查詢】演算法 PHP 版演算法PHP
- [20190314]使用strace注意的問題.txt
- 使用GraphQL查詢引數來設計強大的APIAPI
- .net 6 使用 NEST 查詢,時間欄位傳值踩坑
- 很高興!終於踩到了慢查詢的坑
- [20181217]strace使用問題.txt
- 人大金倉切割逗號拼接的字串,並使用in來查詢字串
- 使用mybatis example 和 java 8的特性來實現多表關聯且帶有查詢條件的查詢MyBatisJava
- PHP 實現二分查詢PHP
- 故障排查工具-strace,tcpdump的簡單使用TCP
- SQL查詢的:子查詢和多表查詢SQL
- Linux神器strace的使用方法及實踐Linux
- 半夜被慢查詢告警吵醒,limit深度分頁的坑MIT
- KImysql timestamp比較查詢遇到的坑及解決ehsMySql
- PHP連線、查詢MySQL資料庫PHPMySql資料庫
- PHP--動態生成sql查詢表格PHPSQL
- PHP APCu快取使用與避坑PHP快取
- Laravel使用MongoDB複雜的查詢LaravelMongoDB
- Linux系列開坑記(四)-檔案查詢工具Linux
- 北京實時公交查詢——Flutter 入坑實戰Flutter
- 在 Linux 上用 strace 來理解系統呼叫Linux
- php要小心的坑PHP
- group by,having查詢 ”每**“的查詢
- PHP 查詢、擷取字串函式詳解PHP字串函式
- 【PHP資料結構】雜湊表查詢PHP資料結構
- es的複雜查詢測試,使用jest的dsl工具寫查詢語句
- 【PHP】關於fastadmin框架中使用with進行連表查詢時setEagerlyType欄位的理解PHPAST框架
- UserService 查詢使用者查詢許可權 isGlobalQuery分析
- 教你使用SQLite 子查詢SQLite
- mybatis-plus 使用In查詢MyBatis
- 分塊查詢【大規模資料查詢演算法優化】【索引順序查詢】演算法 PHP 版演算法優化索引PHP