我的 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_size将memory_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 -i:http : //pastebin.com/EiRut6Nm
M. Tibbits 的回答暗示允许 Piwik 在归档过程中使用更多资源。
SQL 命令的执行大小有限制,默认为 1MB。欲了解更多信息;数据包太大
要增加 MySQL 中的大小限制,请编辑/etc/my.cnf并设置max_allowed_packet=32M
/usr/local/lib/php.ini通过编辑和设置,确保将每个分叉进程的 PHP 内存限制设置得足够高memory_limit = 512M
最后,通过在命令行上执行,确保所有进程在系统关闭它们之前至少有 1G 的硬限制。ulimit -v 1048576
更新
ulimit -v 1048576只会提高软限制。如果硬限制不够高,系统会自动将软限制重置为硬限制。
要设置硬限制,请添加-H开关:
ulimit -vH 1048576
Run Code Online (Sandbox Code Playgroud)
然后将软限制增加到该值:
ulimit -vS 1048576
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
10966 次 |
| 最近记录: |