Bug #62658 [Fbk->NoF]: When enable âwith-curlwrappers option, stream_get_contents() may cpu 100%
| From: | php-bugs at lists dot php dot net | Date: | Mon, 18 Feb 2013 00:35:56 +0000 |
| Subject: | Bug #62658 [Fbk->NoF]: When enable âwith-curlwrappers option, stream_get_contents() may cpu 100% | ||
| References: | 1 | Groups: | php.bugs |
| Request: | Send a blank email to php-bugs+get-177114@lists.php.net to get a copy of this message | ||
Edit report at https://bugs.php.net/bug.php?id=62658&edit=1
ID: 62658
Updated by: php-bugs@lists.php.net
Reported by: sopl dot wang at gmail dot com
Summary: When enable âwith-curlwrappers option,
stream_get_contents() may cpu 100%
-Status: Feedback
+Status: No Feedback
Type: Bug
Package: cURL related
Operating System: ALL
PHP Version: master-Git-2012-07-25 (Git)
Assigned To: pierrick
New Comment:
No feedback was provided. The bug is being suspended because
we assume that you are no longer experiencing the problem.
If this is not the case and you are able to provide the
information that was requested earlier, please do so and
change the status of the bug back to "Open". Thank you.
Previous Comments:
------------------------------------------------------------------------
[2012-11-17 00:53:40] pierrick@php.net
Here's what I have on my side with today's version of the master branch :
select(4, [3], [], [], {15, 0}) = 1 (in [3], left {4, 999876})
poll([{fd=3, events=POLLIN|POLLPRI}], 1, 0) = 1 ([{fd=3, revents=POLLIN}])
recvfrom(3, "1\r\n1\r\n", 16384, 0, NULL, NULL) = 6
select(4, [3], [], [], {15, 0}) = 1 (in [3], left {5, 182})
poll([{fd=3, events=POLLIN|POLLPRI}], 1, 0) = 1 ([{fd=3, revents=POLLIN}])
recvfrom(3, "1\r\n1\r\n", 16384, 0, NULL, NULL) = 6
I compiled it with the same curl version 7.21.6. As you can see I can't reproduce it. My select
don't have
anything in the Output file descriptor. Can you test if you still have this different output in your
strace ? Do
you use the exact same script you sent in your previous comment ?
------------------------------------------------------------------------
[2012-10-07 13:59:43] sopl dot wang at gmail dot com
You may try use
file_get_contents to open a very slow website to help reproduce
this problem. When open a very very slow website, this issue will be more evident.
------------------------------------------------------------------------
[2012-10-07 13:49:51] sopl dot wang at gmail dot com
Still have issue (a bit different of output, but still cpu 100%) when I build
and test on php-5.4.7 GA release. Follow is my build config:
./configure --prefix=/usr/local/webserver/php5.4.7 --with-config-file-
path=/usr/local/webserver/php5.4.7/etc --with-mysql=/usr/local/webserver/mysql5
--with-mysqli=/usr/local/webserver/mysql5/bin/mysql_config --with-iconv-dir=/usr
--with-freetype-dir --with-jpeg-dir --with-png-dir --with-zlib --with-libxml-
dir=/usr --enable-xml --disable-rpath --enable-bcmath --enable-shmop --enable-
sysvsem --enable-inline-optimization --with-curl=/usr --with-curlwrappers --
enable-ftp --enable-mbregex --enable-fpm --with-fpm-user=www --with-fpm-
group=www --disable-ipv6 --enable-mbstring --with-mcrypt --with-gd=/usr --
enable-gd-native-ttf --with-openssl --with-mhash --enable-pcntl --enable-sockets
--enable-gd-jis-conv --disable-debug --enable-sysvshm --enable-soap --with-pdo-
mysql=shared,/usr/local/webserver/mysql5 --with-pdo-sqlite=shared --with-
sqlite=shared --enable-pdo=shared
Test script
-----------
./sapi/cli/php <<<'<?php while(1) file_get_contents("http://www.l4ka.org");'
Output
------
poll([{fd=3, events=POLLIN|POLLPRI}], 1, 0) = 0 (Timeout)
clock_gettime(CLOCK_MONOTONIC, {26871452, 912511643}) = 0
clock_gettime(CLOCK_MONOTONIC, {26871452, 912536643}) = 0
clock_gettime(CLOCK_MONOTONIC, {26871452, 912553643}) = 0
select(4, [3], [3], [], {15, 0}) = 1 (out [3], left {15, 0})
clock_gettime(CLOCK_MONOTONIC, {26871452, 912606643}) = 0
poll([{fd=3, events=POLLIN|POLLPRI}], 1, 0) = 0 (Timeout)
clock_gettime(CLOCK_MONOTONIC, {26871452, 912643643}) = 0
clock_gettime(CLOCK_MONOTONIC, {26871452, 912668643}) = 0
clock_gettime(CLOCK_MONOTONIC, {26871452, 912685643}) = 0
select(4, [3], [3], [], {15, 0}) = 1 (out [3], left {15, 0})
clock_gettime(CLOCK_MONOTONIC, {26871452, 912738643}) = 0
poll([{fd=3, events=POLLIN|POLLPRI}], 1, 0) = 0 (Timeout)
clock_gettime(CLOCK_MONOTONIC, {26871452, 912775643}) = 0
clock_gettime(CLOCK_MONOTONIC, {26871452, 912800643}) = 0
clock_gettime(CLOCK_MONOTONIC, {26871452, 912817643}) = 0
select(4, [3], [3], [], {15, 0}) = 1 (out [3], left {15, 0})
System version
--------------
LSB Version: :core-4.0-amd64:core-4.0-ia32:core-4.0-noarch:graphics-4.0-
amd64:graphics-4.0-ia32:graphics-4.0-noarch:printing-4.0-amd64:printing-4.0-
ia32:printing-4.0-noarch
Distributor ID: CentOS
Description: CentOS release 5.6 (Final)
Release: 5.6
Codename: Final
Curl version
------------
curl 7.21.6 (x86_64-unknown-linux-gnu) libcurl/7.21.6 OpenSSL/0.9.8b zlib/1.2.3
libidn/0.6.5
Protocols: dict file ftp ftps gopher http https imap imaps ldap ldaps pop3 pop3s
rtsp smtp smtps telnet tftp
Features: IDN Largefile NTLM SSL libz
------------------------------------------------------------------------
[2012-09-28 19:44:39] pierrick@php.net
Do you still have this issue ? I tried on my local build and everything work as
expected. If it doesn't work could you give me more details about your build ?
libcurl version ?
------------------------------------------------------------------------
[2012-07-25 10:26:16] sopl dot wang at gmail dot com
Description:
------------
When enable âwith-curlwrappers option, with http(s)/ftp(s)/other curl-wrapped
stream protocols, file_get_contents(), stream_get_contents() and alike functions
may lead consume 100% cpu cycle on waiting for receive.
When strace problem php process, following will be develop:
<pre>
select(7, [6], [6], [], {15, 0}) = 1 (out [6], left {15, 0})
poll([{fd=6, events=POLLIN}], 1, 0) = 0 (Timeout)
select(7, [6], [6], [], {15, 0}) = 1 (out [6], left {15, 0})
poll([{fd=6, events=POLLIN}], 1, 0) = 0 (Timeout)
select(7, [6], [6], [], {15, 0}) = 1 (out [6], left {15, 0})
poll([{fd=6, events=POLLIN}], 1, 0) = 0 (Timeout)
select(7, [6], [6], [], {15, 0}) = 1 (out [6], left {15, 0})
poll([{fd=6, events=POLLIN}], 1, 0) = 0 (Timeout)
select(7, [6], [6], [], {15, 0}) = 1 (out [6], left {15, 0})
poll([{fd=6, events=POLLIN}], 1, 0) = 0 (Timeout)
select(7, [6], [6], [], {15, 0}) = 1 (out [6], left {15, 0})
poll([{fd=6, events=POLLIN}], 1, 0) = 0 (Timeout)
select(7, [6], [6], [], {15, 0}) = 1 (out [6], left {15, 0})
poll([{fd=6, events=POLLIN}], 1, 0) = 0 (Timeout)
select(7, [6], [6], [], {15, 0}) = 1 (out [6], left {15, 0})
poll([{fd=6, events=POLLIN}], 1, 0) = 0 (Timeout)
select(7, [6], [6], [], {15, 0}) = 1 (out [6], left {15, 0})
poll([{fd=6, events=POLLIN}], 1, 0) = 0 (Timeout)
select(7, [6], [6], [], {15, 0}) = 1 (out [6], left {15, 0})
poll([{fd=6, events=POLLIN}], 1, 0) = 0 (Timeout)
</pre>
The reason we found is in 'ext/curl/streams.c', function php_curl_stream_read(),
line 174:
<code>
select(curlstream->maxfd + 1, &curlstream->readfds, &curlstream->writefds,
&curlstream->excfds, &tv)
</code>
When select(), writefds always can write and immediate return, no block at
here and, upper module will detect that no data could read and re-invoke this
function (php_curl_stream_read()), a nonblock loop, lead this consume 100% cpu
bug.
If the link very slow, this 100% cpu problem may take the system load very high.
Test script:
---------------
Enable âwith-curlwrappers and test:
<code>
<?php
while (true)
file_get_contents('http://soplwang.com');
</code>
Expected result:
----------------
Expect the behavior like native php doesâ¦
When strace, native php generate:
<pre>
poll([{fd=3, events=POLLIN|POLLERR|POLLHUP}], 1, 60000) = 1 ([{fd=3,
revents=POLLIN}])
</pre>
Actual result:
--------------
When strace, generate:
<pre>
select(4, [3], [3], [], {15, 0}) = 1 (out [3], left {15, 0})
poll([{fd=3, events=POLLIN}], 1, 0) = 0 (Timeout)
select(4, [3], [3], [], {15, 0}) = 1 (out [3], left {15, 0})
poll([{fd=3, events=POLLIN}], 1, 0) = 0 (Timeout)
select(4, [3], [3], [], {15, 0}) = 1 (out [3], left {15, 0})
poll([{fd=3, events=POLLIN}], 1, 0) = 0 (Timeout)
select(4, [3], [3], [], {15, 0}) = 1 (out [3], left {15, 0})
poll([{fd=3, events=POLLIN}], 1, 0) = 0 (Timeout)
select(4, [3], [3], [], {15, 0}) = 1 (out [3], left {15, 0})
poll([{fd=3, events=POLLIN}], 1, 0) = 0 (Timeout)
...
</pre>
------------------------------------------------------------------------
--
Edit this bug report at https://bugs.php.net/bug.php?id=62658&edit=1