Re: Questions regarding limits of processes launched by system, exec, passthru ...

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]



On Thu, 25 Sep 2008, Valentin Schmid - ICSurselva AG wrote:

To: php-install@xxxxxxxxxxxxx
From: Valentin Schmid - ICSurselva AG <php@xxxxxxxxxxxxxxxxxx>
Subject:  Questions regarding limits of processes launched by
    system, exec, passthru ...

Hello all,

Is there a way to limit the memory consumption and / or the CPU
consumption of processes launched by the php functions system,
exec, passthru, proc_open and shell_exec?

We use mod_php with an apache (mpm-prefork) on Linux.

The following settings don't have any effect at all:
PHP:
 max_execution_time 30
 memory_limit 8M
Apache:
 RLimitCPU 30 30
 RLimitMEM 8388608 8388608

The limits above do have effect on php-scripts (without system calls)
and on CGIs (as well on processes launched by CGIs).

Any Ideas?

Kind Regards
valli


PS: I tested it with the following two scripts:
system_memorytest.php
=====================
<html>
<head>
 <title>php-systemcall-memory test</title>
</head>
<body>
 php-systemcall-memory test<br>
 ... and here's the system call:<br>
 <pre>
<?php
  $cmd = '/usr/bin/perl -e \'
     $| = 1;
     print "start of the systemcall<br>\n";
     $s = "teststr_";
     while (1) {
        print "len=".length($s)."<br>\n";
        sleep(1);
        $s .= $s;
     }
  \'';
  print htmlspecialchars($cmd);
?>
 </pre>
<?php
 ob_flush();
 flush();
 system($cmd);
?>
</body>
</html>


system_timeouttest.php
======================
<html>
<head>
 <title>php-systemcall-timeout test</title>
</head>
<body>
 php-systemcall-timeout test<br>
 ... and here's the system call:<br>
 <pre>
<?php
  $cmd = '/usr/bin/perl -e \'
     $| = 1;
     print "start of the systemcall<br>\n";
     $i = 0;
     while (1) {
        if (($i % 10000000) == 0) {
           print "i=".$i."<br>\n";
        }
        $i += 1;
     }
  \'';
  print htmlspecialchars($cmd);
?>
 </pre>
<?php
 ob_flush();
 flush();
 system($cmd);
?>
</body>
</html>


What OS are you running? If it's Unix/Linux then you might be able to control these settings with ulimit.

Please see the manual page for ulimit for details.

'pinfo' is a lynx-style info page browser that I find very usefull for browsing info manual pages on Linux.

from the Linux info pages for ulimit:

Here is a list of resources for which you can specify a limit. Memory and file sizes are measured in bytes.

`RLIMIT_CPU'
The maximum amount of CPU time the process can use. If it runs for longer than this, it gets a signal: `SIGXCPU'. The value is measured in seconds. *Note Operation Error Signals::.

`RLIMIT_FSIZE'
The maximum size of file the process can create. Trying to write a larger file causes a signal: `SIGXFSZ'. *Note Operation Error Signals::.

`RLIMIT_DATA'
The maximum size of data memory for the process. If the process tries to allocate data memory beyond this amount, the allocation function fails.

`RLIMIT_STACK'
The maximum stack size for the process. If the process tries to extend its stack past this size, it gets a `SIGSEGV' signal. *Note Program Error Signals::.

`RLIMIT_CORE'
The maximum size core file that this process can create. If the process terminates and would dump a core file larger than this, then no core file is created. So setting this limit to zero prevents core files from ever being created.

`RLIMIT_RSS'
The maximum amount of physical memory that this process should get. This parameter is a guide for the system's scheduler and memory allocator; the system may give the process more memory when there is a surplus.

`RLIMIT_MEMLOCK'
The maximum amount of memory that can be locked into physical memory (so it will never be paged out).

`RLIMIT_NPROC'
The maximum number of processes that can be created with the same user ID. If you have reached the limit for your user ID, `fork' will fail with `EAGAIN'. *Note Creating a Process::.

`RLIMIT_NOFILE'
`RLIMIT_OFILE'
The maximum number of files that the process can open. If it tries to open more files than this, its open attempt fails with `errno' `EMFILE'. *Note Error Codes::. Not all systems support this limit; GNU does, and 4.4 BSD does.

`RLIMIT_AS'
The maximum size of total memory that this process should get. If the process tries to allocate more memory beyond this amount with, for example, `brk', `malloc', `mmap' or `sbrk', the allocation function fails.

`RLIM_NLIMITS'
The number of different resource limits. Any valid RESOURCE operand must be less than `RLIM_NLIMITS'.

-- Constant: int RLIM_INFINITY
This constant stands for a value of "infinity" when supplied as the limit value in `setrlimit'.

`ulimit' and the command symbols are declared in `ulimit.h'.

HTH

Kind Regards,

Keith Roberts

-----------------------------------------------------------------
Websites:
http://www.php-debuggers.net
http://www.karsites.net
http://www.raised-from-the-dead.org.uk

The mind of the prudent is ever getting knowledge, and the
eear of the wise is ever seeking, inquiring for and craving
knowledge. Pr. 18:15 Amp

All email addresses are challenge-response protected with
TMDA [http://tmda.net]
-----------------------------------------------------------------

[Index of Archives]     [PHP Users]     [PHP Home]     [PHP on Windows]     [Kernel Newbies]     [PHP Classes]     [Postgresql]     [PHP Books]     [PHP Databases]     [PHP SOAP]
  Powered by Linux