无法删除 PHP 脚本的内存使用限制

Jes*_*ord 7 linux php memory

情况

我的 PHP 脚本出现问题,收到以下错误消息:

Fatal error: Out of memory (allocated 359923712) (tried to allocate 72 bytes) in /path/to/piwik/core/DataTable.php on line 969

我正在运行的脚本是: /path/to/piwik/misc/cron/archive.sh

我假设数字是字节,这意味着总数约为 360MB。

出于所有意图和目的,我已将服务器的内存限制增加到远高于 360MB,但这是它始终出错的数字(给予或接受一个字节)。

请注意:这个问题不是关于修复脚本中的内存泄漏,也不是关于脚本本身使用这么多内存的原因。该脚本是 Piwik 归档过程的一部分,所以我不能只修复任何内存泄漏等。有关此脚本的更多信息以及我增加内存限制的原因,请参阅“如何设置自动归档”

问题

鉴于脚本试图使用超过 360MB 的内存,我无法更改,为什么我似乎无法增加服务器上 php 可用的内存量?

6 月 23 日更新:请参阅下面的“我尝试过的内容”>“增加 Linux 的每个进程内存限制”以了解背景......如果我设置了ulimit -v 1024000,然后检查它ulimit -v我得到了正确的“1024000”值。如果我再次运行该脚本,它将继续前进,但最终会在达到相同的内存限制 (~360MB) 时出错。如果我立即检查ulimit -v,它已重置为“524288”的原始值。这似乎是问题的根本原因。


我试过的

增加 PHP 的 memory_limit

鉴于 php.ini 文件:

php -i | grep php.ini
Configuration File (php.ini) Path => /usr/local/lib
Loaded Configuration File => /usr/local/lib/php.ini
Run Code Online (Sandbox Code Playgroud)

我已经编辑了该文件,因此 memory_limit 指令读取;

memory_limit = -1
Run Code Online (Sandbox Code Playgroud)

重启Apache,检查新值是否卡住;

$ php -i | grep memory_limit
memory_limit => -1 => -1
Run Code Online (Sandbox Code Playgroud)

运行脚本,得到同样的错误。

我也试过1G,768M等,结果都是一样的(即没有变化)。

6 月 22 日更新:基于Vangel 的帮助,我尝试post_max_sizememory_limit. 同样,这没有效果。

6 月 23 日更新:根据olefebvre 的帮助,我可以确认运行脚本的用户对包含 .ini设置的 php.ini 文件具有读/写权限memory_limit

移除 Apache 子进程的内存限制

我找到并编辑了 httpd.conf 文件以确保没有RLimitMEM指令。

然后我使用 WHM 的 Apache 配置 > 内存使用限制来生成一个限制,它声称是 1000M(并通过检查 httpd.conf 确认)。

这两个结果都没有改变 360MB 的脚本错误。

增加 Linux 的每个进程内存限制

在系统上设置的当前限制:

$ ulimit -m
524288

$ ulimit -v
524288
Run Code Online (Sandbox Code Playgroud)

我试图将这两个设置为无限制:

$ ulimit -m unlimited
$ ulimit -v unlimited

$ ulimit -m
unlimited

$ ulimit -v
unlimited
Run Code Online (Sandbox Code Playgroud)

再一次,这导致我的问题完全没有改善。

6 月 23 日更新:我在这里遇到了一个相关问题。如果我设置了ulimit -v 1024000,然后检查它ulimit -v我得到了正确的'1024000'值。如果我再次运行该脚本,它会进一步发展,但最终会因为达到相同的内存限制而出错。如果我立即检查ulimit -v,它已重置为“524288”的原始值。这似乎是问题的根本原因。


我的设置

$ cat /etc/redhat-release
CentOS release 5.5 (Final)

$ uname -a
Linux example.com 2.6.18-164.15.1.el5 #1 SMP Wed Mar 17 11:30:06 EDT 2010 x86_64 x86_64 x86_64 GNU/Linux

$ php -i | grep "PHP Version"
PHP Version => 5.2.9

$ httpd -V
Server version: Apache/2.0.63
Server built:   Feb  2 2011 01:25:12
Cpanel::Easy::Apache v3.2.0 rev5291
Server's Module Magic Number: 20020903:13
Server loaded:  APR 0.9.17, APR-UTIL 0.9.15
Compiled using: APR 0.9.17, APR-UTIL 0.9.15
Architecture:   64-bit
Server compiled with....
 -D APACHE_MPM_DIR="server/mpm/prefork"
 -D APR_HAS_SENDFILE
 -D APR_HAS_MMAP
 -D APR_HAVE_IPV6 (IPv4-mapped addresses enabled)
 -D APR_USE_SYSVSEM_SERIALIZE
 -D APR_USE_PTHREAD_SERIALIZE
 -D SINGLE_LISTEN_UNSERIALIZED_ACCEPT
 -D APR_HAS_OTHER_CHILD
 -D AP_HAVE_RELIABLE_PIPED_LOGS
 -D HTTPD_ROOT="/usr/local/apache"
 -D SUEXEC_BIN="/usr/local/apache/bin/suexec"
 -D DEFAULT_PIDLOG="logs/httpd.pid"
 -D DEFAULT_SCOREBOARD="logs/apache_runtime_status"
 -D DEFAULT_LOCKFILE="logs/accept.lock"
 -D DEFAULT_ERRORLOG="logs/error_log"
 -D AP_TYPES_CONFIG_FILE="conf/mime.types"
 -D SERVER_CONFIG_FILE="conf/httpd.conf"
Run Code Online (Sandbox Code Playgroud)

输出$ php -ihttp : //pastebin.com/EiRut6Nm

Jes*_*ord 2

M. Tibbits 的回答暗示允许 Piwik 在归档过程中使用更多资源。

SQL 命令的执行大小有限制,默认为 1MB。欲了解更多信息;数据包太大

要增加 MySQL 中的大小限制,请编辑/etc/my.cnf并设置max_allowed_packet=32M

/usr/local/lib/php.ini通过编辑和设置,确保将每个分叉进程的 PHP 内存限制设置得足够高memory_limit = 512M

ulimit -v 1048576最后,通过在命令行上执行,确保所有进程在系统关闭它们之前至少有 1G 的硬限制。

更新

ulimit -v 1048576只会提高限制。如果限制不够高,系统会自动将软限制重置为硬限制。

要设置硬限制,请添加-H开关:

ulimit -vH 1048576
Run Code Online (Sandbox Code Playgroud)

然后将软限制增加到该值:

ulimit -vS 1048576
Run Code Online (Sandbox Code Playgroud)