加入收藏 | 设为首页 | 会员中心 | 我要投稿 湖南网 (https://www.hunanwang.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程 > 正文

PHP实现通过strace定位妨碍缘故起因的要领

发布时间:2021-05-18 23:29:58 所属栏目:编程 来源:网络整理
导读:本篇章节讲授PHP实现通过strace定位妨碍缘故起因的要领。供各人参考研究详细如下: 俗话说:不怕贼偷,就怕贼惦念着。在面临妨碍的时辰,我也有相同的感受:不怕出妨碍,就怕你不知道妨碍的缘故起因,妨碍却隔三差五的找上门来。 十一长假还没竣事,处事器

本篇章节讲授PHP实现通过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配置每分钟执行:

100" | bc) = 1 ]; then /etc/init.d/php-fpm restart fi

痛惜这只是一个权宜之计,要想彻底办理就必需找出妨碍的真正缘故起因是什么。

闲言碎语不要讲,轮到Strace进场了,统计一下各个体系挪用的耗时环境:

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」很是可疑,它竟然淹灭了三成的时刻,保险起见,单独确认一下:

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」来查询一下它的寄义:

简朴点说就是内存不足用时通过它来申请新内存(data segment),然则为什么呢?

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上造成哀求拥堵,最终导致高负载妨碍。

下面必要验证一下揣度好像否正确,起首查询一下有哪些处所涉及题目剧本:

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

直接把它们都禁用了,看看处事器是否能缓过来,或者各人认为这太鲁蒙了,可黑白凡环境必需做出非凡的抉择,不能像个娘们儿似的柔嫩寡断,没过多久,处事器负载规复正常,接着再统计一下体系挪用的耗时:

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」就是妨碍的缘故起因。

拥抱妨碍,每一次妨碍都是历练。正所谓:天将降大任于斯人也,必先苦其心志,劳其筋骨,饿其体肤,空匮其身,行拂乱其所为,以是动心忍性,增益其所不能。

更多关于PHP相干内容感乐趣的读者可查察本站专题:《》、《》、《》、《》、《》、《》及《》

但愿本文所述对各人PHP措施计划有所辅佐。

(编辑:湖南网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    热点阅读