Bug #52061 [Csd->Asn]: memory_limit above 2G

From: Date: Sat, 19 Jun 2010 22:32:12 +0000
Subject: Bug #52061 [Csd->Asn]: memory_limit above 2G
References: 1  Groups: php.bugs 
Request: Send a blank email to php-bugs+get-151638@lists.php.net to get a copy of this message
Edit report at http://bugs.php.net/bug.php?id=52061&edit=1

 ID:               52061
 Updated by:       felipe@php.net
 Reported by:      mail-phpbugs at fushigi dot de
 Summary:          memory_limit above 2G
-Status:           Closed
+Status:           Assigned
 Type:             Bug
 Package:          Scripting Engine problem
 Operating System: Linux/Centos-5
 PHP Version:      5.2SVN-2010-06-12 (snap)
-Assigned To:      felipe
+Assigned To:      pajoye



Previous Comments:
------------------------------------------------------------------------
[2010-06-19 22:48:39] felipe@php.net

This bug has been fixed in SVN.

Snapshots of the sources are packaged every three hours; this change
will be in the next snapshot. You can grab the snapshot at
http://snaps.php.net/.
 
Thank you for the report, and for helping us make PHP better.



------------------------------------------------------------------------
[2010-06-19 22:47:27] felipe@php.net

Automatic comment from SVN on behalf of felipe
Revision: http://svn.php.net/viewvc/?view=revision&revision=300606
Log: - Fixed bug #52061 (memory_limit above 2G)
# MFH: zend_atol()

------------------------------------------------------------------------
[2010-06-12 02:56:41] mail-phpbugs at fushigi dot de

Description:
------------
PHP 5.2 doesn't coun't process memory_limit => 2048M in right way
in 32bit mode it works up to 4G, after that it would cause a fatal
error, this seems ok, because of the memory limitations of 32bit :)
in 64bit its a REAL BUG, because after 2047M the memory limit DOESN'T
MATCH, this means no memory limit is active !

as far as i have seen the memory limit for php51 isn't affectet this way
because it walks in an error as of 2GB
and it seems in php53 the problem is fixed, here i tried to set limits
up to 8GB and all worked fine.

The test script is from http://news.php.net/php.internals/48607 , but i
think is shows the problem very well :)

is it possible to fix this, so it will behave as php-5.3 ?
or have the same matching as in 32bit version, so there is a limit if
someone setting a too high value ?

i have found this problem as i wanted to get a customer from an old
php-5.2.13 32bit machine on a newer php-5.2.13 64bit machine :(


32bit 5.2:
Running 400000 times with a 16383 bytes long string ('   ...')
>      0 -  0.000s:        0.1 /       0.2 MB
>  10000 -  1.294s:      166.7 /     177.5 MB
>  20000 -  2.453s:      333.2 /     355.1 MB
>  30000 -  3.988s:      499.7 /     532.4 MB
>  40000 -  5.700s:      666.3 /     709.5 MB
>  50000 -  7.614s:      832.8 /     886.9 MB
>  60000 -  9.838s:      999.3 /   1'064.0 MB
>  70000 - 11.592s:    1'165.9 /   1'241.3 MB
>  80000 - 12.943s:    1'332.4 /   1'418.6 MB
>  90000 - 19.795s:    1'498.9 /   1'595.7 MB
PHP Fatal error:  Allowed memory size of -2147483648 bytes exhausted
(tried to allocate 40961 bytes) in /tmp/php-memtest.php on line 32

64bit 5.2:
Running 400000 times with a 16383 bytes long string ('   ...')
>      0 -  0.000s:        0.1 /       0.2 MB
>  10000 -  0.110s:      167.0 /     177.8 MB
>  20000 -  0.221s:      333.8 /     355.1 MB
>  30000 -  0.335s:      500.5 /     532.2 MB
>  40000 -  0.449s:      667.3 /     709.7 MB
>  50000 -  0.560s:      834.1 /     887.1 MB
>  60000 -  0.672s:    1'000.9 /   1'064.2 MB
>  70000 -  0.782s:    1'167.7 /   1'241.7 MB
>  80000 -  0.891s:    1'334.5 /   1'418.8 MB
>  90000 -  1.000s:    1'501.3 /   1'596.0 MB
> 100000 -  1.109s:    1'668.1 /   1'773.3 MB
> 110000 -  1.219s:    1'834.9 /   1'950.4 MB
> 120000 -  1.328s:    2'001.7 /   2'127.5 MB
> 130000 -  1.436s:    2'168.5 /   2'304.9 MB
> 140000 -  1.543s:    2'335.3 /   2'482.2 MB
> 150000 -  1.651s:    2'502.1 /   2'659.3 MB
> 160000 -  1.758s:    2'668.9 /   2'836.6 MB
> 170000 -  1.864s:    2'835.7 /   3'013.7 MB
> 180000 -  1.969s:    3'002.5 /   3'190.9 MB
> 190000 -  2.079s:    3'169.3 /   3'368.2 MB
> 200000 -  2.189s:    3'336.0 /   3'545.5 MB
> 210000 -  2.300s:    3'502.8 /   3'722.6 MB
> 220000 -  2.411s:    3'669.6 /   3'900.0 MB
> 230000 -  2.519s:    3'836.4 /   4'077.1 MB
> 240000 -  2.628s:    4'003.2 /   4'254.2 MB
> 250000 -  2.737s:    4'170.0 /   4'431.5 MB
> 260000 -  2.845s:    4'336.8 /   4'608.6 MB
> 270000 -  2.953s:    4'503.6 /   4'786.0 MB
> 280000 -  3.061s:    4'670.4 /   4'963.3 MB
> 290000 -  3.169s:    4'837.2 /   5'140.4 MB
> 300000 -  3.277s:    5'004.0 /   5'317.5 MB
> 310000 -  3.384s:    5'170.8 /   5'494.9 MB
> 320000 -  3.490s:    5'337.6 /   5'672.0 MB
> 330000 -  3.596s:    5'504.4 /   5'849.3 MB
> 340000 -  3.703s:    5'671.2 /   6'026.6 MB
> 350000 -  3.809s:    5'838.0 /   6'203.7 MB
> 360000 -  3.914s:    6'004.8 /   6'380.9 MB
> 370000 -  4.019s:    6'171.6 /   6'558.2 MB
> 380000 -  4.124s:    6'338.3 /   6'735.3 MB
> 390000 -  4.231s:    6'505.1 /   6'912.4 MB
> 400000 -  4.342s:    6'671.9 /   7'089.8 MB

Cleaning up 200001 output handlers
Done, total time:  4.638s, peak mem: 6'671.9 / 7'089.8 MB


########## Other Versions ######################
32bit 5.1:
Running 400000 times with a 16383 bytes long string ('   ...')
>      0 -  0.000s:        0.1 /       0.1 MB
>  10000 -  0.721s:      166.6 /     166.6 MB
>  20000 -  1.646s:      333.0 /     333.0 MB
>  30000 -  2.839s:      499.5 /     499.5 MB
>  40000 -  4.010s:      665.9 /     665.9 MB
>  50000 -  6.007s:      832.4 /     832.4 MB
>  60000 -  8.427s:      998.8 /     998.8 MB
>  70000 -  9.531s:    1'165.3 /   1'165.3 MB
>  80000 - 12.218s:    1'331.7 /   1'331.7 MB
>  90000 - 15.126s:    1'498.2 /   1'498.2 MB
> 100000 - 17.942s:    1'664.7 /   1'664.7 MB
Integer overflow in memory_limit check detected

64bit 5.1:
Running 400000 times with a 16383 bytes long string ('   ...')
>      0 -  0.000s:        0.1 /       0.1 MB
>  10000 -  0.116s:      166.7 /     166.7 MB
>  20000 -  0.235s:      333.3 /     333.3 MB
>  30000 -  0.356s:      499.9 /     499.9 MB
>  40000 -  0.473s:      666.5 /     666.5 MB
>  50000 -  0.586s:      833.1 /     833.1 MB
>  60000 -  0.698s:      999.7 /     999.7 MB
>  70000 -  0.807s:    1'166.3 /   1'166.3 MB
>  80000 -  0.916s:    1'332.9 /   1'332.9 MB
>  90000 -  1.024s:    1'499.5 /   1'499.5 MB
> 100000 -  1.133s:    1'666.1 /   1'666.1 MB
Integer overflow in memory_limit check detected


32bit 5.3:
Running 400000 times with a 16383 bytes long string ('   ...')
>      0 -  0.000s:        0.3 /       0.4 MB
>  10000 -  0.382s:      166.9 /     177.8 MB
>  20000 -  1.000s:      333.4 /     354.9 MB
>  30000 -  1.425s:      499.9 /     532.2 MB
>  40000 -  1.754s:      666.5 /     709.3 MB
>  50000 -  2.137s:      833.0 /     886.4 MB
>  60000 -  2.484s:      999.6 /   1'063.8 MB
>  70000 -  2.834s:    1'166.1 /   1'240.9 MB
>  80000 -  3.129s:    1'332.6 /   1'418.2 MB
>  90000 -  3.527s:    1'499.2 /   1'595.3 MB
PHP Fatal error:  Allowed memory size of -2147483648 bytes exhausted
(tried to allocate 40961 bytes) in /tmp/php-memtest.php on line 32

64bit 5.3:
Running 400000 times with a 16383 bytes long string ('   ...')
>      0 -  0.000s:        0.6 /       0.6 MB
>  10000 -  0.112s:      167.4 /     178.2 MB
>  20000 -  0.226s:      334.2 /     355.5 MB
>  30000 -  0.340s:      501.0 /     532.8 MB
>  40000 -  0.453s:      667.8 /     710.2 MB
>  50000 -  0.568s:      834.6 /     887.5 MB
>  60000 -  0.681s:    1'001.4 /   1'064.6 MB
>  70000 -  0.792s:    1'168.2 /   1'242.2 MB
>  80000 -  0.903s:    1'335.0 /   1'419.3 MB
>  90000 -  1.014s:    1'501.8 /   1'596.4 MB
PHP Fatal error:  Allowed memory size of 2147483648 bytes exhausted
(tried to allocate 40961 bytes) in /tmp/php-memtest.php on line 32



Test script:
---------------
<?php
ini_set("memory_limit", "2G");

function mib($b) {
     return $b ? number_format($b/1024/1204, 1, ".", "'") : "?";
}

function mgu($r, $p = false) {
     return mib($p ? memory_get_peak_usage($r) : 
memory_get_usage($r));
}

function obs($i) {
     global $start;
     fprintf(STDERR, "> %6d - %6.3fs: %10s /%10s MB\n",
         $i,
         microtime(true)-$start,
         mgu(false), mgu(true)
     );
}

$loop = 400000;
$data = str_repeat(" ", 0x3fff);

fprintf(STDERR, "Running %d times with a %d bytes long string
('%s...')\n",
     $loop,
     strlen($data),
     substr($data, 0, 3)
);

$start = microtime(true);
for ($i = 0; $i < $loop; ++$i) {
     ob_start();
     echo $data;

     if (!($i % 10000)) {
         obs($i);
     }

     if ($i % 2) {
         ob_flush();
     } elseif ($i) {
         ob_end_clean();
     }
}
obs($i);

fprintf(STDERR, "\nCleaning up %d output handlers\n",
     ob_get_level()
);
while(ob_get_level())
     ob_end_clean();

fprintf(STDERR, "Done, total time: %6.3fs, peak mem: %s / %s MB\n",
     microtime(true)-$start,
     mgu(false, true), mgu(true, true)
);
?>

Expected result:
----------------
Running 400000 times with a 16383 bytes long string ('   ...')
>      0 -  0.000s:        0.1 /       0.2 MB
>  10000 -  0.110s:      167.0 /     177.8 MB
>  20000 -  0.221s:      333.8 /     355.1 MB
>  30000 -  0.335s:      500.5 /     532.2 MB
>  40000 -  0.449s:      667.3 /     709.7 MB
>  50000 -  0.560s:      834.1 /     887.1 MB
>  60000 -  0.672s:    1'000.9 /   1'064.2 MB
>  70000 -  0.782s:    1'167.7 /   1'241.7 MB
>  80000 -  0.891s:    1'334.5 /   1'418.8 MB
>  90000 -  1.000s:    1'501.3 /   1'596.0 MB
PHP Fatal error:  Allowed memory size of 2147483648 bytes exhausted
(tried to allocate 40961 bytes) in /tmp/php-memtest.php on line 32

Actual result:
--------------
Running 400000 times with a 16383 bytes long string ('   ...')
>      0 -  0.000s:        0.1 /       0.2 MB
>  10000 -  0.110s:      167.0 /     177.8 MB
>  20000 -  0.221s:      333.8 /     355.1 MB
>  30000 -  0.335s:      500.5 /     532.2 MB
>  40000 -  0.449s:      667.3 /     709.7 MB
>  50000 -  0.560s:      834.1 /     887.1 MB
>  60000 -  0.672s:    1'000.9 /   1'064.2 MB
>  70000 -  0.782s:    1'167.7 /   1'241.7 MB
>  80000 -  0.891s:    1'334.5 /   1'418.8 MB
>  90000 -  1.000s:    1'501.3 /   1'596.0 MB
> 100000 -  1.109s:    1'668.1 /   1'773.3 MB
> 110000 -  1.219s:    1'834.9 /   1'950.4 MB
> 120000 -  1.328s:    2'001.7 /   2'127.5 MB
> 130000 -  1.436s:    2'168.5 /   2'304.9 MB
> 140000 -  1.543s:    2'335.3 /   2'482.2 MB
> 150000 -  1.651s:    2'502.1 /   2'659.3 MB
> 160000 -  1.758s:    2'668.9 /   2'836.6 MB
> 170000 -  1.864s:    2'835.7 /   3'013.7 MB
> 180000 -  1.969s:    3'002.5 /   3'190.9 MB
> 190000 -  2.079s:    3'169.3 /   3'368.2 MB
> 200000 -  2.189s:    3'336.0 /   3'545.5 MB
> 210000 -  2.300s:    3'502.8 /   3'722.6 MB
> 220000 -  2.411s:    3'669.6 /   3'900.0 MB
> 230000 -  2.519s:    3'836.4 /   4'077.1 MB
> 240000 -  2.628s:    4'003.2 /   4'254.2 MB
> 250000 -  2.737s:    4'170.0 /   4'431.5 MB
> 260000 -  2.845s:    4'336.8 /   4'608.6 MB
> 270000 -  2.953s:    4'503.6 /   4'786.0 MB
> 280000 -  3.061s:    4'670.4 /   4'963.3 MB
> 290000 -  3.169s:    4'837.2 /   5'140.4 MB
> 300000 -  3.277s:    5'004.0 /   5'317.5 MB
> 310000 -  3.384s:    5'170.8 /   5'494.9 MB
> 320000 -  3.490s:    5'337.6 /   5'672.0 MB
> 330000 -  3.596s:    5'504.4 /   5'849.3 MB
> 340000 -  3.703s:    5'671.2 /   6'026.6 MB
> 350000 -  3.809s:    5'838.0 /   6'203.7 MB
> 360000 -  3.914s:    6'004.8 /   6'380.9 MB
> 370000 -  4.019s:    6'171.6 /   6'558.2 MB
> 380000 -  4.124s:    6'338.3 /   6'735.3 MB
> 390000 -  4.231s:    6'505.1 /   6'912.4 MB
> 400000 -  4.342s:    6'671.9 /   7'089.8 MB

Cleaning up 200001 output handlers
Done, total time:  4.638s, peak mem: 6'671.9 / 7'089.8 MB


------------------------------------------------------------------------



-- 
Edit this bug report at http://bugs.php.net/bug.php?id=52061&edit=1


Thread (6 messages)

« previous php.bugs (#151638) next »