情況是在一個PHP開發的web產品裡,使用Guzzle6這個庫作為HTTP Client來訪問外部介面,現在發現訪問外部介面時速度很慢,要15秒才能收到響應。而在CLI裡直接CURL這個外部介面,響應是很快的。
自己試圖解決這個問題,發現現象如下:
1.首先Guzzle應該也是使用CURL來訪問的,這是從Guzzle偶爾報出的curl error中看出的。偶爾會出CURLE_COULDNT_RESOLVE_HOST這樣的錯誤。
2.接著判斷是不是DNS的問題,直接換用ip訪問,結果是一樣的。
3.接著試了兩個CURL的兩個選項,一個是逾時設定,一個是考慮是不是IPV6的影響,對應到Guzzle分別是:
['connect_timeout' => 2, 'curl' => [ CURLOPT_IPRESOLVE => CURL_IPRESOLVE_V4 ],]
依然沒有變化。
4.將被提供者host換成baidu,qq,taobao這些,發現此時大部分訪問速度正常,qq除外。。也是很慢
5.訪問時間長度目前看來都是15秒。最後對php-fpm進行strace,抽取出主要的內容如下:
5519 22:30:08.260401 connect(7, {sa_family=AF_INET, sin_port=htons(80), sin_addr=inet_addr("121.xx.xx.xx")}, 16) = -1 EINPROGRESS (Operation now in progress)5519 22:30:08.260744 clock_gettime(CLOCK_MONOTONIC, {278258, 519214625}) = 05519 22:30:08.260853 poll([{fd=7, events=POLLOUT|POLLWRNORM}], 1, 149999) = 1 ([{fd=7, revents=POLLOUT|POLLWRNORM}])5519 22:30:08.286791 getsockopt(7, SOL_SOCKET, SO_ERROR, [0], [4]) = 05519 22:30:08.286851 clock_gettime(CLOCK_MONOTONIC, {278258, 545285059}) = 05519 22:30:08.286891 clock_gettime(CLOCK_MONOTONIC, {278258, 545323358}) = 05519 22:30:08.286926 clock_gettime(CLOCK_MONOTONIC, {278258, 545358858}) = 05519 22:30:08.286962 clock_gettime(CLOCK_MONOTONIC, {278258, 545394658}) = 05519 22:30:08.286997 clock_gettime(CLOCK_MONOTONIC, {278258, 545429558}) = 05519 22:30:08.287055 sendto(7, "GET /v1/xxx/xxx HTTP/1.1"..., 110, MSG_NOSIGNAL, NULL, 0) = 1105519 22:30:08.287206 poll([{fd=7, events=POLLIN|POLLPRI|POLLRDNORM|POLLRDBAND}], 1, 0) = 0 (Timeout)5519 22:30:08.287248 poll([{fd=7, events=POLLIN|POLLPRI|POLLRDNORM|POLLRDBAND}], 1, 0) = 0 (Timeout)5519 22:30:08.287284 clock_gettime(CLOCK_MONOTONIC, {278258, 545716856}) = 05519 22:30:08.287350 clock_gettime(CLOCK_MONOTONIC, {278258, 545782755}) = 05519 22:30:08.287388 clock_gettime(CLOCK_MONOTONIC, {278258, 545820755}) = 05519 22:30:08.287471 poll([{fd=7, events=POLLIN|POLLPRI|POLLRDNORM|POLLRDBAND}], 1, 1000 ....5519 22:30:09.288586 <... poll resumed> ) = 0 (Timeout)5519 22:30:09.288678 poll([{fd=7, events=POLLIN|POLLPRI|POLLRDNORM|POLLRDBAND}], 1, 0) = 0 (Timeout)5519 22:30:09.288727 clock_gettime(CLOCK_MONOTONIC, {278259, 547161322}) = 05519 22:30:09.288767 clock_gettime(CLOCK_MONOTONIC, {278259, 547199920}) = 05519 22:30:09.288806 clock_gettime(CLOCK_MONOTONIC, {278259, 547239318}) = 05519 22:30:09.288842 poll([{fd=7, events=POLLIN|POLLPRI|POLLRDNORM|POLLRDBAND}], 1, 1000 ...5519 22:30:10.289957 <... poll resumed> ) = 0 (Timeout)5519 22:30:10.290024 poll([{fd=7, events=POLLIN|POLLPRI|POLLRDNORM|POLLRDBAND}], 1, 0) = 0 (Timeout)5519 22:30:10.290070 clock_gettime(CLOCK_MONOTONIC, {278260, 548504637}) = 05519 22:30:10.290110 clock_gettime(CLOCK_MONOTONIC, {278260, 548542537}) = 05519 22:30:10.290149 clock_gettime(CLOCK_MONOTONIC, {278260, 548581437}) = 05519 22:30:10.290184 poll([{fd=7, events=POLLIN|POLLPRI|POLLRDNORM|POLLRDBAND}], 1, 1000 ...一直持續到第15秒接受到響應5519 22:30:23.309074 <... poll resumed> ) = 0 (Timeout)5519 22:30:23.309151 poll([{fd=7, events=POLLIN|POLLPRI|POLLRDNORM|POLLRDBAND}], 1, 0) = 0 (Timeout)5519 22:30:23.309210 clock_gettime(CLOCK_MONOTONIC, {278273, 567644629}) = 05519 22:30:23.309250 clock_gettime(CLOCK_MONOTONIC, {278273, 567682629}) = 05519 22:30:23.309289 clock_gettime(CLOCK_MONOTONIC, {278273, 567721628}) = 05519 22:30:23.309324 poll([{fd=7, events=POLLIN|POLLPRI|POLLRDNORM|POLLRDBAND}], 1, 1000) = 1 ([{fd=7, revents=POLLIN|POLLRDNORM}])5519 22:30:23.386517 poll([{fd=7, events=POLLIN|POLLPRI|POLLRDNORM|POLLRDBAND}], 1, 0) = 1 ([{fd=7, revents=POLLIN|POLLRDNORM}])5519 22:30:23.386578 recvfrom(7, "HTTP/1.1 200 OK\r\nServer: XXX"..., 16384, 0, NULL, NULL) = 18375519 22:30:23.386676 clock_gettime(CLOCK_MONOTONIC, {278273, 645121620}) = 0
請大家幫忙分析下出現原因可能是什麼。
謝謝。
回複內容:
情況是在一個PHP開發的web產品裡,使用Guzzle6這個庫作為HTTP Client來訪問外部介面,現在發現訪問外部介面時速度很慢,要15秒才能收到響應。而在CLI裡直接CURL這個外部介面,響應是很快的。
自己試圖解決這個問題,發現現象如下:
1.首先Guzzle應該也是使用CURL來訪問的,這是從Guzzle偶爾報出的curl error中看出的。偶爾會出CURLE_COULDNT_RESOLVE_HOST這樣的錯誤。
2.接著判斷是不是DNS的問題,直接換用ip訪問,結果是一樣的。
3.接著試了兩個CURL的兩個選項,一個是逾時設定,一個是考慮是不是IPV6的影響,對應到Guzzle分別是:
['connect_timeout' => 2, 'curl' => [ CURLOPT_IPRESOLVE => CURL_IPRESOLVE_V4 ],]
依然沒有變化。
4.將被提供者host換成baidu,qq,taobao這些,發現此時大部分訪問速度正常,qq除外。。也是很慢
5.訪問時間長度目前看來都是15秒。最後對php-fpm進行strace,抽取出主要的內容如下:
5519 22:30:08.260401 connect(7, {sa_family=AF_INET, sin_port=htons(80), sin_addr=inet_addr("121.xx.xx.xx")}, 16) = -1 EINPROGRESS (Operation now in progress)5519 22:30:08.260744 clock_gettime(CLOCK_MONOTONIC, {278258, 519214625}) = 05519 22:30:08.260853 poll([{fd=7, events=POLLOUT|POLLWRNORM}], 1, 149999) = 1 ([{fd=7, revents=POLLOUT|POLLWRNORM}])5519 22:30:08.286791 getsockopt(7, SOL_SOCKET, SO_ERROR, [0], [4]) = 05519 22:30:08.286851 clock_gettime(CLOCK_MONOTONIC, {278258, 545285059}) = 05519 22:30:08.286891 clock_gettime(CLOCK_MONOTONIC, {278258, 545323358}) = 05519 22:30:08.286926 clock_gettime(CLOCK_MONOTONIC, {278258, 545358858}) = 05519 22:30:08.286962 clock_gettime(CLOCK_MONOTONIC, {278258, 545394658}) = 05519 22:30:08.286997 clock_gettime(CLOCK_MONOTONIC, {278258, 545429558}) = 05519 22:30:08.287055 sendto(7, "GET /v1/xxx/xxx HTTP/1.1"..., 110, MSG_NOSIGNAL, NULL, 0) = 1105519 22:30:08.287206 poll([{fd=7, events=POLLIN|POLLPRI|POLLRDNORM|POLLRDBAND}], 1, 0) = 0 (Timeout)5519 22:30:08.287248 poll([{fd=7, events=POLLIN|POLLPRI|POLLRDNORM|POLLRDBAND}], 1, 0) = 0 (Timeout)5519 22:30:08.287284 clock_gettime(CLOCK_MONOTONIC, {278258, 545716856}) = 05519 22:30:08.287350 clock_gettime(CLOCK_MONOTONIC, {278258, 545782755}) = 05519 22:30:08.287388 clock_gettime(CLOCK_MONOTONIC, {278258, 545820755}) = 05519 22:30:08.287471 poll([{fd=7, events=POLLIN|POLLPRI|POLLRDNORM|POLLRDBAND}], 1, 1000 ....5519 22:30:09.288586 <... poll resumed> ) = 0 (Timeout)5519 22:30:09.288678 poll([{fd=7, events=POLLIN|POLLPRI|POLLRDNORM|POLLRDBAND}], 1, 0) = 0 (Timeout)5519 22:30:09.288727 clock_gettime(CLOCK_MONOTONIC, {278259, 547161322}) = 05519 22:30:09.288767 clock_gettime(CLOCK_MONOTONIC, {278259, 547199920}) = 05519 22:30:09.288806 clock_gettime(CLOCK_MONOTONIC, {278259, 547239318}) = 05519 22:30:09.288842 poll([{fd=7, events=POLLIN|POLLPRI|POLLRDNORM|POLLRDBAND}], 1, 1000 ...5519 22:30:10.289957 <... poll resumed> ) = 0 (Timeout)5519 22:30:10.290024 poll([{fd=7, events=POLLIN|POLLPRI|POLLRDNORM|POLLRDBAND}], 1, 0) = 0 (Timeout)5519 22:30:10.290070 clock_gettime(CLOCK_MONOTONIC, {278260, 548504637}) = 05519 22:30:10.290110 clock_gettime(CLOCK_MONOTONIC, {278260, 548542537}) = 05519 22:30:10.290149 clock_gettime(CLOCK_MONOTONIC, {278260, 548581437}) = 05519 22:30:10.290184 poll([{fd=7, events=POLLIN|POLLPRI|POLLRDNORM|POLLRDBAND}], 1, 1000 ...一直持續到第15秒接受到響應5519 22:30:23.309074 <... poll resumed> ) = 0 (Timeout)5519 22:30:23.309151 poll([{fd=7, events=POLLIN|POLLPRI|POLLRDNORM|POLLRDBAND}], 1, 0) = 0 (Timeout)5519 22:30:23.309210 clock_gettime(CLOCK_MONOTONIC, {278273, 567644629}) = 05519 22:30:23.309250 clock_gettime(CLOCK_MONOTONIC, {278273, 567682629}) = 05519 22:30:23.309289 clock_gettime(CLOCK_MONOTONIC, {278273, 567721628}) = 05519 22:30:23.309324 poll([{fd=7, events=POLLIN|POLLPRI|POLLRDNORM|POLLRDBAND}], 1, 1000) = 1 ([{fd=7, revents=POLLIN|POLLRDNORM}])5519 22:30:23.386517 poll([{fd=7, events=POLLIN|POLLPRI|POLLRDNORM|POLLRDBAND}], 1, 0) = 1 ([{fd=7, revents=POLLIN|POLLRDNORM}])5519 22:30:23.386578 recvfrom(7, "HTTP/1.1 200 OK\r\nServer: XXX"..., 16384, 0, NULL, NULL) = 18375519 22:30:23.386676 clock_gettime(CLOCK_MONOTONIC, {278273, 645121620}) = 0
請大家幫忙分析下出現原因可能是什麼。
謝謝。
如果需求不是太複雜的話還是自己封裝一個簡單的httpclient吧,這樣去找一個第三方庫的問題還是比較麻煩的,要麼就用調試工具跑跑看
換個試下,直接用 curl訪問看看速度