允许的内存大小不pipe数量多less,内存泄漏?

我在一个非常常见的使用Apache 2和PHP 5.3.3的CentOS 5.11上为我的妹妹运行一个小的Wordpress博客。

最近,我们发现,虽然她试图更新或安装任何使用Wordpress自己的界面,这一切都停滞不前,我发现这一点:

PHP Fatal error: Allowed memory size of 268435456 bytes exhausted (tried to allocate 20 bytes) in /var/www/foobar/wp-admin/includes/file.php on line 159, referer: http://foobar.com/wp-admin/update-core.php?action=do-core-upgrade 

search了一下后,最简单的事情似乎只是提高了内存的限制,但不pipe提高多less,基本上只花了更长的时间才能打到这个屋顶。

以下是一些摘录:

512M

 PHP Fatal error: Allowed memory size of 536870912 bytes exhausted (tried to allocate 261900 bytes) in /var/www/foobar/wp-admin/includes/file.php on line 159, referer: http://foobar.com/wp-admin/update-core.php?action=do-core-upgrade 

1024M

 PHP Fatal error: Allowed memory size of 1073741824 bytes exhausted (tried to allocate 261900 bytes) in /var/www/foobar/wp-admin/includes/file.php on line 159, referer: http://foobar.com/wp-admin/update-core.php?action=do-core-upgrade 

这是所有configuration使用两个…

 memory_limit = 1024M 

在/etc/php.ini以及…

 define('WP_MEMORY_LIMIT', '1024M'); } else { define('WP_MEMORY_LIMIT', '1024M'); } } if ( ! defined( 'WP_MAX_MEMORY_LIMIT' ) ) { define( 'WP_MAX_MEMORY_LIMIT', '1024M' ); } 

在〜/ wp-includes / default-constants.php中。

这显然导致我相信有一个内存泄漏的地方有待解决,但是当一切都预先包装Wordpress的东西,我怎么会去find这个? 按下“更新”button时,从顶部^ M中选取一些摘录:

之前

 Mem: 1034656k total, 235836k used, 798820k free, 6388k buffers Swap: 2048248k total, 107940k used, 1940308k free, 139156k cached PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND 23649 apache 19 0 160m 22m 15m S 0.0 2.2 0:07.06 httpd 

 Mem: 1034656k total, 1020396k used, 14260k free, 60k buffers Swap: 2048248k total, 152484k used, 1895764k free, 26880k cached PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND 23645 apache 21 0 1079m 906m 16m R 75.5 89.7 0:06.95 httpd 

WordPress版本4.2

MySQL 5.1

Apache 2.2.22

安装的插件:你好多莉1.6和Akismet 3.1.1


这是strace -f -r的输出,它正好停在那里:

29638 0.000134 writev(16, [{"28\r\n", 4}, {"<p>Enabling Maintenance mode&#82"..., 40}, {"\r\n", 2}], 3) = 46 29638 0.000122 time(NULL) = 1436025429 29638 0.000060 getcwd("/var/www/foobar/wp-admin"..., 4096) = 32 29638 0.000064 time(NULL) = 1436025429 29638 0.000040 open("/tmp/php9Ldioo", O_RDWR|O_CREAT|O_EXCL, 0600) = 19 29638 0.000061 getpeername(18, {sa_family=AF_INET, sin_port=htons(21), sin_addr=inet_addr("127.0.0.1")}, [16]) = 0 29638 0.000068 poll([{fd=18, events=POLLOUT}], 1, 240000) = 1 ([{fd=18, revents=POLLOUT}]) 29638 0.000038 send(18, "PASV\r\n", 6, 0) = 6 29638 0.000078 poll([{fd=18, events=POLLIN|POLLERR|POLLHUP}], 1, 240000) = 1 ([{fd=18, revents=POLLIN}]) 29638 0.000119 recv(18, "227 Entering Passive Mode (127,0"..., 4096, 0) = 45 29638 0.000048 socket(PF_INET, SOCK_STREAM, IPPROTO_IP) = 20 29638 0.000029 fcntl64(20, F_GETFL) = 0x2 (flags O_RDWR) 29638 0.000025 fcntl64(20, F_SETFL, O_RDWR|O_NONBLOCK) = 0 29638 0.000026 connect(20, {sa_family=AF_INET, sin_port=htons(8721), sin_addr=inet_addr("127.0.0.1")}, 16) = -1 EINPROGRESS (Operation now in progress) 29638 0.000060 poll([{fd=20, events=POLLIN|POLLOUT|POLLERR|POLLHUP}], 1, 240000) = 1 ([{fd=20, revents=POLLOUT}]) 29638 0.000039 getsockopt(20, SOL_SOCKET, SO_ERROR, [0], [4]) = 0 29638 0.000028 fcntl64(20, F_SETFL, O_RDWR) = 0 29638 0.000024 poll([{fd=18, events=POLLOUT}], 1, 240000) = 1 ([{fd=18, revents=POLLOUT}]) 29638 0.000036 send(18, "NLST /.maintenance\r\n", 20, 0) = 20 29638 0.000053 poll([{fd=18, events=POLLIN|POLLERR|POLLHUP}], 1, 240000) = 1 ([{fd=18, revents=POLLIN}]) 29638 0.000187 recv(18, "150 Here comes the directory lis"..., 4096, 0) = 39 29638 0.000111 poll([{fd=20, events=POLLIN|POLLERR|POLLHUP}], 1, 240000) = 1 ([{fd=20, revents=POLLIN}]) 29638 0.000037 recv(20, "", 4096, 0) = 0 29638 0.000024 close(20) = 0 29638 0.000038 lseek(19, 0, SEEK_SET) = 0 29638 0.000026 read(19, "", 8192) = 0 29638 0.000031 close(19) = 0 29638 0.000023 unlink("/tmp/php9Ldioo") = 0 29638 0.000042 poll([{fd=18, events=POLLIN|POLLERR|POLLHUP}], 1, 240000) = 1 ([{fd=18, revents=POLLIN}]) 29638 0.000037 recv(18, "226 Directory send OK.\r\n", 4096, 0) = 24 29638 0.000063 poll([{fd=18, events=POLLOUT}], 1, 240000) = 1 ([{fd=18, revents=POLLOUT}]) 29638 0.000038 send(18, "CWD /.maintenance/\r\n", 20, 0) = 20 29638 0.000035 poll([{fd=18, events=POLLIN|POLLERR|POLLHUP}], 1, 240000) = 1 ([{fd=18, revents=POLLIN}]) 29638 0.000067 recv(18, "550 Failed to change directory.\r"..., 4096, 0) = 33 29638 0.000050 poll([{fd=18, events=POLLOUT}], 1, 240000) = 1 ([{fd=18, revents=POLLOUT}]) 29638 0.000037 send(18, "PWD\r\n", 5, 0) = 5 29638 0.000052 poll([{fd=18, events=POLLIN|POLLERR|POLLHUP}], 1, 240000) = 1 ([{fd=18, revents=POLLIN}]) 29638 0.000035 recv(18, "257 \"/\"\r\n", 4096, 0) = 9 29638 0.000047 poll([{fd=18, events=POLLOUT}], 1, 240000) = 1 ([{fd=18, revents=POLLOUT}]) 29638 0.000036 send(18, "RMD /.maintenance\r\n", 19, 0) = 19 29638 0.000059 poll([{fd=18, events=POLLIN|POLLERR|POLLHUP}], 1, 240000) = 1 ([{fd=18, revents=POLLIN}]) 29638 0.000035 recv(18, "550 Remove directory operation f"..., 4096, 0) = 40 29638 0.002773 brk(0x929f000) = 0x929f000 29638 0.001533 brk(0x92df000) = 0x92df000 29638 0.001396 brk(0x931f000) = 0x931f000 29638 0.001436 brk(0x935f000) = 0x935f000 29638 0.001488 brk(0x939f000) = 0x939f000 29638 0.001460 brk(0x93df000) = 0x93df000 29638 0.001388 brk(0x941f000) = 0x941f000 29638 0.001452 brk(0x945f000) = 0x945f000 29638 0.000772 brk(0x949f000) = 0x949f000 29638 0.000668 brk(0x94df000) = 0x94df000 29638 0.001326 brk(0x951f000) = 0x951f000 29638 0.001320 brk(0x955f000) = 0x955f000 29638 0.001423 brk(0x959f000) = 0x959f000 29638 0.001508 brk(0x95df000) = 0x95df000 29638 0.001410 brk(0x961f000) = 0x961f000 29638 0.000280 brk(0x965f000) = 0x965f000 /29638 0.001073 brk(0x969f000) = 0x969f000 29638 0.001342 brk(0x96df000) = 0x96df000 29638 0.001341 brk(0x971f000) = 0x971f000 29638 0.001389 brk(0x975f000) = 0x975f000 29638 0.001385 brk(0x979f000) = 0x979f000 29638 0.001172 brk(0x97df000) = 0x97df000

它看起来像一个无限循环,因为wp-admin / includes / file.php的第159行是对函数wp_tmpnam()的recursion调用。 它打破了更新过程,所以可能是值得检查这个小的更正,它描述了你的问题: WordPress的错误修复

内存泄漏(或只是高内存使用)几乎总是因为WordPress的。

WordPress是一个众所周知的内存和CPU猪,特别是如果你使用不好的插件和模板。

您可以尝试逐个禁用所有的插件和模板,直到find哪一个导致高内存使用率,并将其replace为另一个相似的内容,或将问题报告给作者以便为您解决。

如果您不是WP开发人员,并且不了解PHP,那么解决导致高内存使用率的实际问题就无能为力了。

有一些情况下,某些PHP模块会导致类似的行为或简单的段错误。 如果禁用WP上的所有内容都不会改变任何东西,那么可以尝试一个接一个地禁用PHP的模块以查看是否有任何更改。
特别是与caching有关的模块(例如Xcache,APC,eAccelerator等)

如果你知道PHP,并想深入一点,你也可以安装PHP的xhprof模块,以便能够在运行wordpress时进行分析,以查看哪些方法,函数等占用了所有的内存并从那里开始。

由于您没有任何添加插件,我仍然build议您按照以下步骤操作:

  • 禁用这两个插件
  • 切换到默认的WordPress主题
  • 用病毒扫描程序扫描所有内容

然后尝试更新内容。 如果仍然消耗大量内存,则可能是服务器configuration问题。