前幾天東政同學反饋說Linode服務器快卡死了,今天有時間排查了一下具體原因,最終原因稍微有點悲壯:file_get_contents沒有設置超時時間,加上我用的php5.2關于curl的代碼有個bug,于是導致PHP進程進入死循環。
今天下午又發現系統負載很高,于是上去看了一下,發現一大坨PHP進程沒有退出,占用了很多CPU,如圖:
問題進程:
后面運行的腳本是我的RSS定時更新任務,看來PHP代碼什么地方有問題,于是strace -p 14043看了一下:
1
2
3
4
5
6
|
select(5, [4], [4], [], {15, 0}) = 1 (out [4], left {14, 999996}) poll([{fd=4, events=POLLIN|POLLPRI}], 1, 0) = 0 (Timeout) clock_gettime(CLOCK_MONOTONIC, {4582888, 760370017}) = 0 clock_gettime(CLOCK_MONOTONIC, {4582888, 760468615}) = 0 clock_gettime(CLOCK_MONOTONIC, {4582888, 760565053}) = 0 select(5, [4], [4], [], {15, 0}) = 1 (out [4], left {14, 999997}) |
在4號fd上面死循環了,于是看看FD是什么:ll /proc/14043/fd
lrwx—— 1 wuhaiwen wuhaiwen 64 7月 21 11:00 4 -> socket:[53176380]
再看了一下原來是在請求CSDN的一個網頁的時候死循環了,但不知道什么地方請求的,想到GDB一下php進程看看,bt顯示:
(gdb) bt
#0 0x00007f6721f8f013 in __select_nocancel () at ../sysdeps/unix/syscall-template.S:82
#1 0×0000000000481952 in php_curl_stream_read (stream=0×2280650,
buf=0x22ea5d0 “2Fwww.laruence.com%2Ftag%2F%25e6%25ad%25a3%25e5%2588%2599%27+class%3D%27tag-link-191%27+title%3D%273+topics%27+style%3D%27font-size%3A+9.0243902439pt%3B%27%3E%E6%AD%A3%E5%88%99%3C%2Fa%3E%3C%2Ftags%3E\”"…, count=8192) at /home/wuhaiwen/install/php-env/src/php/php-5.2.8/ext/curl/streams.c:169
#2 0x00000000006738f9 in php_stream_fill_read_buffer (stream=0×2280650, size=4283) at /home/wuhaiwen/install/php-env/src/php/php-5.2.8/main/streams/streams.c:554
#3 0x0000000000673c39 in _php_stream_read (stream=0×2280650,
buf=0x2301fd5 “f='http://www.laruence.com/tag/json' class='tag-link-79′ php" id="highlighter_970485">
1
2
3
4
5
6
|
(gdb) p *op_array $4 = {type = 2 '\002' , function_name = 0x1e54278 "getContent" , scope = 0x1f8e850, fn_flags = 257, prototype = 0x0, num_args = 2, required_num_args = 1, arg_info = 0x1fd5e20, pass_rest_by_reference = 0 '\000' , return_reference = 0 '\000' , refcount = 0x1fd3ab8, opcodes = 0x1fddcc8, last = 28, size = 28, vars = 0x1fd3cc0, last_var = 6, size_var = 16, T = 15, brk_cont_array = 0x0, last_brk_cont = 0, current_brk_cont = 4294967295, try_catch_array = 0x0, last_try_catch = 0, static_variables = 0x0, start_op = 0x0, backpatch_count = 0, done_pass_two = 1 '\001' , uses_this = 0 '\000' , filename = 0x1fd3b58 "/home/wuhaiwen/webroot/kulvrss/libs/Myrss/Model/UrlContenter.php" , line_start = 9, line_end = 30, doc_comment = 0x0, doc_comment_len = 0, reserved = {0x0, 0x0, 0x0, 0x0}} |