婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av

主頁 > 知識庫 > 使用strace命令定位和診斷故障的實例分享

使用strace命令定位和診斷故障的實例分享

熱門標簽:江蘇小型外呼系統軟件 文山外呼營銷系統 百度地圖標注未成功 電話機器人服務器部署 中山防封卡電銷卡辦理 地圖上標注點位的圖標 拉薩銷售外呼系統軟件 電銷語音機器人哪個好 常熟外呼系統

通過Strace定位故障原因
這是一個Nginx錯誤日志:

connect() failed (110: Connection timed out) while connecting to upstream
connect() failed (111: Connection refused) while connecting to upstream
看上去是Upstream出了問題,在本例中Upstream就是PHP(版本:5.2.5)。可惜監控不完善,我搞不清楚到底是哪出了問題,無奈之下只好不斷重啟PHP來緩解故障。

如果每次都手動重啟服務無疑是個苦差事,幸運的是可以通過CRON設置每分鐘執行:

復制代碼
代碼如下:

#/bin/bash/p> p>LOAD=$(awk '{print $1}' /proc/loadavg)/p> p>if [ $(echo "$LOAD > 100" | bc) = 1 ]; then
/etc/init.d/php-fpm restart
fi

可惜這只是一個權宜之計,要想徹底解決就必須找出故障的真正原因是什么。

閑言碎語不要講,輪到Strace出場了,統計一下各個系統調用的耗時情況:

復制代碼
代碼如下:

shell> strace -c -p $(pgrep -n php-cgi)

% time     seconds  usecs/call     calls    errors syscall
------ ----------- ----------- --------- --------- ----------------
 30.53    0.023554         132       179           brk
 14.71    0.011350         140        81           mlock
 12.70    0.009798          15       658        16 recvfrom
  8.96    0.006910           7       927           read
  6.61    0.005097          43       119           accept
  5.57    0.004294           4       977           poll
  3.13    0.002415           7       359           write
  2.82    0.002177           7       311           sendto
  2.64    0.002033           2      1201         1 stat
  2.27    0.001750           1      2312           gettimeofday
  2.11    0.001626           1      1428           rt_sigaction
  1.55    0.001199           2       730           fstat
  1.29    0.000998          10       100       100 connect
  1.03    0.000792           4       178           shutdown
  1.00    0.000773           2       492           open
  0.93    0.000720           1       711           close
  0.49    0.000381           2       238           chdir
  0.35    0.000271           3        87           select
  0.29    0.000224           1       357           setitimer
  0.21    0.000159           2        81           munlock
  0.17    0.000133           2        88           getsockopt
  0.14    0.000110           1       149           lseek
  0.14    0.000106           1       121           mmap
  0.11    0.000086           1       121           munmap
  0.09    0.000072           0       238           rt_sigprocmask
  0.08    0.000063           4        17           lstat
  0.07    0.000054           0       313           uname
  0.00    0.000000           0        15         1 access
  0.00    0.000000           0       100           socket
  0.00    0.000000           0       101           setsockopt
  0.00    0.000000           0       277           fcntl
------ ----------- ----------- --------- --------- ----------------
100.00    0.077145                 13066       118 total
看上去「brk」非常可疑,它竟然耗費了三成的時間,保險起見,單獨確認一下:

復制代碼
代碼如下:

shell> strace -T -e brk -p $(pgrep -n php-cgi)

brk(0x1f18000) = 0x1f18000 0.024025>
brk(0x1f58000) = 0x1f58000 0.015503>
brk(0x1f98000) = 0x1f98000 0.013037>
brk(0x1fd8000) = 0x1fd8000 0.000056>
brk(0x2018000) = 0x2018000 0.012635>
說明:在Strace中和操作花費時間相關的選項有兩個,分別是「-r」和「-T」,它們的差別是「-r」表示相對時間,而「-T」表示絕對時間。簡單統計可以用「-r」,但是需要注意的是在多任務背景下,CPU隨時可能會被切換出去做別的事情,所以相對時間不一定準確,此時最好使用「-T」,在行尾可以看到操作時間,可以發現確實很慢。

在繼續定位故障原因前,我們先通過「man brk」來查詢一下它的含義:

brk() sets the end of the data segment to the value specified by end_data_segment, when that value is reasonable, the system does have enough memory and the process does not exceed its max data size (see setrlimit(2)).

簡單點說就是內存不夠用時通過它來申請新內存(data segment),可是為什么呢?

復制代碼
代碼如下:

shell> strace -T -p $(pgrep -n php-cgi) 2>1 | grep -B 10 brk

stat("/path/to/script.php", {...}) = 0 0.000064>
brk(0x1d9a000) = 0x1d9a000 0.000067>
brk(0x1dda000) = 0x1dda000 0.001134>
brk(0x1e1a000) = 0x1e1a000 0.000065>
brk(0x1e5a000) = 0x1e5a000 0.012396>
brk(0x1e9a000) = 0x1e9a000 0.000092>
通過「grep」我們很方便就能獲取相關的上下文,反復運行幾次,發現每當請求某些PHP腳本時,就會出現若干條耗時的「brk」,而且這些PHP腳本有一個共同的特點,就是非常大,甚至有幾百K,為何會出現這么大的PHP腳本?實際上是程序員為了避免數據庫操作,把非常龐大的數組變量通過「var_export」持久化到PHP文件中,然后在程序中通過「include」來獲取相應的變量,因為變量太大,所以PHP不得不頻繁執行「brk」,不幸的是在本例的環境中,此操作比較慢,從而導致處理請求的時間過長,加之PHP進程數有限,于是乎在Nginx上造成請求擁堵,最終導致高負載故障。

下面需要驗證一下推斷似乎否正確,首先查詢一下有哪些地方涉及問題腳本:

復制代碼
代碼如下:

shell> find /path -name "*.php" | xargs grep "script.php"

直接把它們都禁用了,看看服務器是否能緩過來,或許大家覺得這太魯蒙了,但是特殊情況必須做出特殊的決定,不能像個娘們兒似的優柔寡斷,沒過多久,服務器負載恢復正常,接著再統計一下系統調用的耗時:

復制代碼
代碼如下:

shell> strace -c -p $(pgrep -n php-cgi)

% time     seconds  usecs/call     calls    errors syscall
------ ----------- ----------- --------- --------- ----------------
 24.50    0.001521          11       138         2 recvfrom
 16.11    0.001000          33        30           accept
  7.86    0.000488           8        59           sendto
  7.35    0.000456           1       360           rt_sigaction
  6.73    0.000418           2       198           poll
  5.72    0.000355           1       285           stat
  4.54    0.000282           0       573           gettimeofday
  4.41    0.000274           7        42           shutdown
  4.40    0.000273           2       137           open
  3.72    0.000231           1       197           fstat
  2.93    0.000182           1       187           close
  2.56    0.000159           2        90           setitimer
  2.13    0.000132           1       244           read
  1.71    0.000106           4        30           munmap
  1.16    0.000072           1        60           chdir
  1.13    0.000070           4        18           setsockopt
  1.05    0.000065           1       100           write
  1.05    0.000065           1        64           lseek
  0.95    0.000059           1        75           uname
  0.00    0.000000           0        30           mmap
  0.00    0.000000           0        60           rt_sigprocmask
  0.00    0.000000           0         3         2 access
  0.00    0.000000           0         9           select
  0.00    0.000000           0        20           socket
  0.00    0.000000           0        20        20 connect
  0.00    0.000000           0        18           getsockopt
  0.00    0.000000           0        54           fcntl
  0.00    0.000000           0         9           mlock
  0.00    0.000000           0         9           munlock
------ ----------- ----------- --------- --------- ----------------
100.00    0.006208                  3119        24 total
顯而易見,「brk」已經不見了,取而代之的是「recvfrom」和「accept」,不過這些操作本來就是很耗時的,所以可以定位「brk」就是故障的原因。

用 strace 診斷問題
早些年,如果你知道有個 strace 命令,就很牛了,而現在大家基本都知道 strace 了,如果你遇到性能問題求助別人,十有八九會建議你用 strace 掛上去看看,不過當你掛上去了,看著滿屏翻滾的字符,卻十有八九看不出個所以然。本文通過一個簡單的案例,向你展示一下在用 strace 診斷問題時的一些套路。
如下真實案例,如有雷同,實屬必然!讓我們看一臺高負載服務器的 top 結果:

技巧:運行 top 時,按「1」打開 CPU 列表,按「shift+p」以 CPU 排序。

在本例中大家很容易發現 CPU 主要是被若干個 PHP 進程占用了,同時 PHP 進程占用的比較多的內存,不過系統內存尚有結余,SWAP 也不嚴重,這并不是問題主因。

不過在 CPU 列表中能看到 CPU 主要消耗在內核態「sy」,而不是用戶態「us」,和我們的經驗不符。Linux 操作系統有很多用來跟蹤程序行為的工具,內核態的函數調用跟蹤用「strace」,用戶態的函數調用跟蹤用「ltrace」,所以這里我們應該用「strace」:

復制代碼
代碼如下:

shell> strace -p PID>

不過如果直接用 strace 跟蹤某個進程的話,那么等待你的往往是滿屏翻滾的字符,想從這里看出問題的癥結并不是一件容易的事情,好在 strace  可以按操作匯總時間:

復制代碼
代碼如下:

shell> strace -cp PID>

通過「c」選項用來匯總各個操作的總耗時,運行后的結果大概如下圖所示:

很明顯,我們能看到 CPU 主要被 clone 操作消耗了,還可以單獨跟蹤一下 clone:

復制代碼
代碼如下:

shell> strace -T -e clone -p PID>

通過「T」選項可以獲取操作實際消耗的時間,通過「e」選項可以跟蹤某個操作:

很明顯,一個 clone 操作需要幾百毫秒,至于 clone 的含義,參考 man 文檔:

clone() creates a new process, in a manner similar to fork(2). It is actually a library function layered on top of the underlying clone() system call, hereinafter referred to as sys_clone. A description of sys_clone is given towards the end of this page.

Unlike fork(2), these calls allow the child process to share parts of its execution context with the calling process, such as the memory space, the table of file descriptors, and the table of signal handlers. (Note that on this manual page, “calling process” normally corresponds to “parent process”. But see the description of CLONE_PARENT below.)

簡單來說,就是創建一個新進程。那么在 PHP 里什么時候會出現此類系統調用呢?查詢業務代碼看到了 exec 函數,通過如下命令驗證它確實會導致 clone 系統調用:

復制代碼
代碼如下:

shell> strace -eclone php -r 'exec("ls");'

最后再考大家一個題:如果我們用 strace 跟蹤一個進程,輸出結果很少,是不是說明進程很空閑?其實試試 ltrace,可能會發現別有洞天。記住有內核態和用戶態之分。

標簽:河南 鶴壁 景德鎮 天門 海北 黔南 欽州 威海

巨人網絡通訊聲明:本文標題《使用strace命令定位和診斷故障的實例分享》,本文關鍵詞  使用,strace,命令,定位,和,;如發現本文內容存在版權問題,煩請提供相關信息告之我們,我們將及時溝通與處理。本站內容系統采集于網絡,涉及言論、版權與本站無關。
  • 相關文章
  • 下面列出與本文章《使用strace命令定位和診斷故障的實例分享》相關的同類信息!
  • 本頁收集關于使用strace命令定位和診斷故障的實例分享的相關信息資訊供網民參考!
  • 推薦文章
    婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av
    欧美日韩免费视频| 五月天丁香久久| 亚洲精品在线免费观看视频| 欧美一区二区三区电影| 在线91免费看| 欧美激情一区二区三区蜜桃视频| 久久精品综合网| 成人欧美一区二区三区黑人麻豆 | 国产成人av电影在线| 精东粉嫩av免费一区二区三区| 蜜臀精品久久久久久蜜臀| 久久超级碰视频| 国产成都精品91一区二区三| 一本大道av伊人久久综合| 色综合天天综合| 日韩欧美的一区二区| 中文字幕欧美激情| 亚洲6080在线| 成人午夜电影网站| 午夜精品爽啪视频| 91精品国产麻豆| 欧美一区二区三区白人| 成人影视亚洲图片在线| 国产精品久久久久影院老司| 欧美成va人片在线观看| 欧美人伦禁忌dvd放荡欲情| 99re8在线精品视频免费播放| 丁香亚洲综合激情啪啪综合| 国产一区在线看| www.爱久久.com| 日韩美女视频一区二区| 色诱亚洲精品久久久久久| 国产精品国产馆在线真实露脸 | 粉嫩嫩av羞羞动漫久久久| 日韩欧美在线观看一区二区三区| 成人小视频在线观看| 亚洲国产日韩av| 91精品国产色综合久久ai换脸| 奇米色一区二区三区四区| 欧美一区二区日韩一区二区| av在线播放一区二区三区| 久久嫩草精品久久久精品一| 奇米影视一区二区三区小说| 欧美经典三级视频一区二区三区| 蜜臀av性久久久久蜜臀aⅴ| 91精品国产综合久久精品麻豆| 毛片一区二区三区| 精品国产一区二区三区久久影院| 日本不卡视频在线观看| 美女视频黄 久久| www.成人网.com| 欧美精品三级在线观看| 亚洲国产美女搞黄色| 亚洲成av人片在线观看| 国产乱码精品一区二区三区av| 国产成人免费视| 亚洲成人精品影院| 舔着乳尖日韩一区| 日本系列欧美系列| 国产激情视频一区二区三区欧美| 欧美一区二区三区免费观看视频 | 欧美午夜理伦三级在线观看| 自拍偷拍亚洲综合| 欧美日韩一本到| 欧美日韩视频专区在线播放| 国产精品自产自拍| 成人性视频网站| www.欧美色图| 欧美精品在欧美一区二区少妇| 日韩三级视频中文字幕| 综合色中文字幕| 美洲天堂一区二卡三卡四卡视频 | 亚洲不卡在线观看| 奇米一区二区三区| 91影视在线播放| 欧美电影免费观看高清完整版在线观看 | 欧美影院精品一区| 欧美精品一区二区三区在线播放 | 麻豆专区一区二区三区四区五区| 国产日韩欧美不卡| 日韩美女主播在线视频一区二区三区| 在线观看亚洲精品| 欧美成人免费网站| 成人小视频免费在线观看| 中文字幕一区二区三区四区不卡| 久久免费偷拍视频| 国产免费成人在线视频| 国产婷婷色一区二区三区在线| 91香蕉国产在线观看软件| 色综合久久综合网| 97久久久精品综合88久久| 在线不卡欧美精品一区二区三区| 国产精品久久夜| 狠狠色伊人亚洲综合成人| 欧美二区三区91| 亚洲大片免费看| 欧美在线视频日韩| 亚洲电影一级黄| 国产精品久久久久久户外露出| 亚洲一区二区三区不卡国产欧美 | 亚洲男同1069视频| 激情丁香综合五月| 国产色婷婷亚洲99精品小说| 国产精品影视天天线| 国产欧美一区在线| 成人国产在线观看| 亚洲日本在线视频观看| 成人国产亚洲欧美成人综合网| 中文字幕在线观看不卡| 91麻豆精品一区二区三区| 视频一区二区不卡| 精品国内二区三区| 成人激情电影免费在线观看| 国产精品久久久久久户外露出 | 国产精品欧美久久久久无广告| 不卡在线观看av| 亚洲h动漫在线| 久久久综合网站| 欧美中文字幕不卡| 激情五月播播久久久精品| 国产精品理论在线观看| 欧美色图激情小说| 国产精品456露脸| 国产清纯在线一区二区www| 成人免费va视频| 亚洲精品午夜久久久| 欧美一区二区视频在线观看2022| 国产电影精品久久禁18| 午夜免费欧美电影| 国产拍揄自揄精品视频麻豆| 欧美美女bb生活片| 97se亚洲国产综合在线| 黄色小说综合网站| 婷婷亚洲久悠悠色悠在线播放| 欧美国产成人精品| 日韩美女视频在线| 欧美主播一区二区三区| 9人人澡人人爽人人精品| 免费观看91视频大全| 午夜不卡av在线| 天堂蜜桃一区二区三区| 亚洲免费色视频| 亚洲免费av高清| 自拍偷拍国产亚洲| 国产精品二三区| 综合自拍亚洲综合图不卡区| 国产精品第五页| 一区二区三区四区在线播放| √…a在线天堂一区| 亚洲欧美日韩在线播放| 亚洲精品你懂的| 天堂一区二区在线免费观看| 亚洲第一主播视频| 天天色天天操综合| 日本不卡免费在线视频| 国产九九视频一区二区三区| 国产成人综合网| 91美女在线看| 91精品国产乱| 久久色在线观看| 亚洲乱码精品一二三四区日韩在线 | 青椒成人免费视频| 国产精品一二三在| 91福利在线免费观看| 欧美疯狂做受xxxx富婆| 欧美影院一区二区三区| 欧美日韩不卡在线| 中文字幕乱码亚洲精品一区| 亚洲视频在线一区| 狠狠网亚洲精品| 欧洲精品一区二区| 国产情人综合久久777777| 日韩在线卡一卡二| 成人av第一页| 久久久久久久久久久黄色| 亚洲欧美另类久久久精品| 久久99久国产精品黄毛片色诱| 色狠狠色狠狠综合| 久久久久成人黄色影片| 久久欧美一区二区| 久久精品亚洲一区二区三区浴池| 亚洲男人的天堂av| 国产一区二区久久| 日韩一区二区不卡| 亚洲成a人片在线不卡一二三区| 国产91精品精华液一区二区三区 | 91极品视觉盛宴| 欧美激情一区二区三区四区| 久草在线在线精品观看| 欧美日韩一区 二区 三区 久久精品| 国产精品久久久久三级| 粉嫩在线一区二区三区视频| 国产欧美一二三区| 成人福利视频在线| 17c精品麻豆一区二区免费| av成人动漫在线观看| 亚洲自拍与偷拍| 欧美久久久久久久久中文字幕| 亚洲一二三四在线观看| 欧美另类高清zo欧美|