当前位置: 首页 > 面试题库 >

如何优化php进程的内存使用情况?

谢俊悟
2023-03-14
问题内容

我正在运行一个wordpress网站,每个PHP进程的使用空间约为200mb至250mb。使用16GB的ram,服务器只能处理大约70个进程。通过将虚拟内存增加到16GB,它可以处理140个。之后,负载不断增加。如果10分钟内有200个连接,则在3Ghz四核xeon处理器上服务器负载将达到20个!

我曾尝试停用所有插件,但这只会使每个进程的PHP内存使用量减少不到10%。suPHP告诉我哪个用户正在使用那么多的内存,而不告诉我wordpress代码的哪一部分。

关于如何减少内存使用的任何建议?还是升级到32GB RAM的唯一选择?

PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND
10585 nobody    16   0 2266m 237m 199m S 21.3  1.5   1:09.17 /usr/bin/php
10597 nobody    16   0 2257m 255m 226m S 15.3  1.6   0:17.56 /usr/bin/php

pmap -d的最大输出

000000000e8b8000   27580 rw--- 000000000e8b8000 000:00000   [ anon ]
00002b3772850000 2097152 rw-s- 0000000000000000 000:00009   [ shmid=0x2d1b803a ]
00002b37f2a62000   55108 r---- 0000000000000000 0fd:00000 locale-archive
mapped: 2320852K    writeable/private: 30012K    shared: 2097152K

ipcs输出

------ Semaphore Arrays --------

key        semid      owner      perms      nsems
0x000000a7 0          root      600        1
0x00000000 162529281  nobody    600        1
0x00000000 162562050  nobody    600        1
0x00000000 162594819  nobody    600        1
0x00000000 162627588  nobody    600        1
------ Message Queues --------

key        msqid      owner      perms      used-bytes   messages`

问题答案:

我将总结一下丽莎为发现问题所做的工作:

  • 使用来检查单个PHP进程的内存布局pmap -d <pid>。输出显示该进程使用了​​大量共享内存:
00002b3772850000 2097152 rw-s- 0000000000000000 000:00009   [

shmid=0x2d1b803a ]

  • 使用来检查共享内存区域ipcs -m。结果表明,没有人(Web服务器)创建了许多共享内存区域,以下是其中一些:
0x00000000 117964807 nobody 600 2147483648 1 dest
0x00000000 117997576 nobody 600 2147483648 1 dest
0x00000000 118030345 nobody 600 2147483648 1 dest
0x00000000 118063114 nobody 600 2147483648 1 dest
  • 在php.ini中禁用eAccelerator并删除创建的共享内存区域:

为我在ipcs -m | 切-d''-f2 | grep'^ [0-9]'; ipcrm -m $ i; 做完了



 类似资料:
  • 问题内容: 我有大量的名称-值对(大约100k),我需要将它们存储在某种高速缓存(例如哈希映射)中,其中值是一个平均大小约为30k字节的字符串。 现在我知道一个事实,大量的值具有完全相同的字符串数据。为了避免多次分配相同的字符串数据,我想以某种方式重用以前分配的字符串,从而减少内存消耗。另外,这需要相当快。即,不能一一扫描所有先前分配的值。 关于如何解决此问题的任何建议? 问题答案: 千万 不能

  • 问题内容: 您如何衡量Linux中应用程序或进程的内存使用情况? 从了解Linux上的内存使用的博客文章中可以看出,这不是用于此目的的准确工具。 为什么是“错” 根据您的看法,它不会报告进程的实际内存使用情况。它的真正作用是显示 如果 每个进程 是唯一运行的进程 , 则 每个进程将占用多少实际内存。当然,一台典型的Linux机器在任何给定时间都运行着几十个进程,这意味着报告的VSZ和RSS编号几乎

  • 问题内容: 我需要在C中获取当前进程的内存使用情况。有人可以提供在Linux平台上执行此操作的代码示例吗? 我知道获取内存使用情况的方法,但是我不知道如何在C中捕获它。 顺便说一句,它是针对我正在修改的PHP扩展(当然,我是C新手)。如果PHP扩展API中有可用的快捷方式,那将更加有用。 问题答案: 您始终可以像常规文件一样在系统中打开“文件” (使用“自我”符号链接,因此您不必查找自己的pid)

  • 本文向大家介绍Redis 如何做内存优化?相关面试题,主要包含被问及Redis 如何做内存优化?时的应答技巧和注意事项,需要的朋友参考一下 尽量使用 Redis 的散列表,把相关的信息放到散列表里面存储,而不是把每个字段单独存储,这样可以有效的减少内存使用。比如将 Web 系统的用户对象,应该放到散列表里面再整体存储到 Redis,而不是把用户的姓名、年龄、密码、邮箱等字段分别设置 key 进行存

  • 问题内容: jvm进程的内存使用量一直在增加,并且从未减少。我通过在linux服务器上执行top进行检查。该应用程序正在将作业调度到群集(使用Quartz + SunJava DRMAA API) Java堆空间在应用程序生命周期内保持在限制之内,但是jvm进程显示内存使用率稳定增长且从未下降。 这是内存泄漏吗?如果是这样,为什么堆空间在限制之内。有人可以解释一下。 更新: 当我通过jconsol