我的 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 …Run Code Online (Sandbox Code Playgroud) 我有一个 Godaddy 服务器,它定期变得无响应。很难排除故障,因为当它无响应时我无法 ssh 进入。我通过添加一个 cron 作业来弄清楚发生了什么,该作业每 5 分钟将输出从“top”传送到日志文件。下次我在它无响应后重新启动它时,我检查了这些日志,发现 ram 已用完,但交换大部分未使用。
我正在努力减少那台机器上两个应用程序服务器的 ram 使用量(事实证明打开的连接太多了。每个连接都用了 30m,所以在打开 40 之后,服务器用完了 ram),但是我' d 真的很想知道如何确保我可以 ssh 进入机器。
如果交换文件未满,那么我认为服务器会有足够的空间来响应,即使它响应很慢。有什么办法可以保留一点内存,以便我始终可以通过 ssh 进入机器?
以下是服务器正常运行时的外观示例:
top - 15:13:21 up 3:12, 2 users, load average: 0.15, 0.30, 0.33
Tasks: 127 total, 1 running, 126 sleeping, 0 stopped, 0 zombie
Cpu(s): 2.4%us, 1.8%sy, 0.0%ni, 95.7%id, 0.0%wa, 0.0%hi, 0.2%si, 0.0%st
Mem: 2064980k total, 1611252k used, 453728k free, 45852k buffers
Swap: 2096472k total, 0k used, 2096472k free, 790212k cached
Run Code Online (Sandbox Code Playgroud)
这是在服务器停止运行之前记录的最后一个顶级日志:
top - 14:45:08 …Run Code Online (Sandbox Code Playgroud) 除了占用大量 CPU 之外,TrustedInstaller.exe 还占用了我的 Windows server 2008 中的大量内存。这个问题有什么解决方案吗?顺便说一句,Windows 更新服务应该是肯定启动的。
我使用的是 HP DL360p Generation 8。我需要一个非常可靠的服务器,所以我使用了带有备用驱动器的 RAID 1,我还添加了一个额外的电源。但是我应该安装在线备用内存吗?还是只是在浪费钱?
我们每天都重新启动 apache 服务器,因为 RAM 使用量达到了极限。
虽然有价值看到这个 serverfault answer,我不认为降低MaxClientsapache 配置是解决未知根问题的方法。
下面的 apache 进程以 MB 为单位出现异常大并且时间很长。这是否意味着存在内存泄漏。这是否意味着我们应该降低 MaxRequestsPerChild 设置?
见http://www.devside.net/articles/apache-performance-tuning
你能理解下面的数据吗?
下面是摘录什么
$top 和 M
返回:
20839 www-data 20 0 1008m 359m 22m S 4 4.8 1:52.61 apache2
20844 www-data 20 0 1008m 358m 22m S 1 4.8 1:51.85 apache2
20842 www-data 20 0 1008m 356m 22m S 1 4.8 1:54.60 apache2
20845 www-data 20 0 944m 353m 22m S 0 4.7 1:51.80 apache2
Run Code Online (Sandbox Code Playgroud)
然后调查一个单一的过程
$sudo strace -p …Run Code Online (Sandbox Code Playgroud) 我们正在使用 Newrelic 来衡量我们的 Python/Django 应用程序性能。Newrelic 报告说,在我们的系统中,“Memcached”正在平均12ms响应命令。
深入到前十个左右的 Web 视图(按请求数),我可以看到有些Memcache get占30ms; 我无法Memcache get在小于10ms.
有关系统架构的更多详细信息:
~0.5msMemcached 的响应时间不是10ms很慢吗?
据我了解,如果您认为“Memcache 太慢”那么“您做错了”。那我做错了吗?
这是memcache-top命令的输出:
memcache-top v0.7 (default port: 11211, color: on, refresh: 3 seconds)
INSTANCE USAGE HIT % CONN TIME EVICT/s GETS/s SETS/s READ/s WRITE/s
cache1:11211 37.1% 62.7% 10 5.3ms 0.0 73 9 3958 …Run Code Online (Sandbox Code Playgroud) 在 Ubuntu 14.04 上,当内存和交换使用率达到 100% 时,必须增加交换文件。
在实时生产服务器上,是否可以在对服务造成最小中断的情况下增加交换?
的输出free -h:
total used free shared buffers cached
Mem: 3.9G 3.4G 435M 24K 1.2M 7.5M
-/+ buffers/cache: 3.4G 443M
Swap: 8.0G 6.6G 1.4G
Run Code Online (Sandbox Code Playgroud) 假设我有一个 docker 主机,其中设置了 50 个容器,每个容器运行一个由 Apache 提供服务的站点。
据我了解,每个容器都会运行一个 Apache 实例,通常每个 Apache 实例每 ram 使用 ~250mb。Apache 然后每个子进程需要几 mb。
假设每个容器都需要完整 Apache 实例的内存,我是否正确?例如。50 个站点需要 50 x ~300mb?
或者 Apache 是否能够在容器之间共享部分内存以提高内存效率?
Docker 是否适合高效的“大规模”托管(例如,大量站点,每个站点都需要很少的资源),其中每个站点都是一个容器?或者只让一个 Apache 容器服务于 50 个站点是否可行?
在具有 32GB RAM 内存的 Centos 7 服务器上,我正在运行一些程序,即 MySQL、Apache2、PHP。最近我想验证剩余的内存量,因为我计划安装更多的程序,令我惊讶的是内存量很低!经过调查,我发现 Slab 使用了超过 20GB。2 天前,我删除了缓存,因此平板使用率下降到 0 并再次缓慢增加。在使用程序监视它时,我注意到使用率呈线性增长。在过去 24 小时内,它增加了约 5200MB(60 小时内总共增加了 13GB)。磁盘上的总数据在 40GB 以下。'find /' 的输出只有几 MB。如果 dentries 被缓存,似乎有很多东西?
我有帖子说 curl 附带的 NSS 是原因。我检查了那里安装的 NSS 版本,它是一个应该应用修复程序的版本。
我还发现建议使用 vfs_cache_pressure 的帖子,但是增加它似乎并没有阻止使用率上升到极高的值。
我想知道对于小于 50GB 的小磁盘,身份的正常内存量是多少?我怎样才能找到来源以及如何解决这个问题?
相关图片:
slabtop 的屏幕截图:这里
slab 可回收和缓存内存的图表:这里
编辑:
# sysctl -n vm.vfs_cache_pressure
10000
Run Code Online (Sandbox Code Playgroud)
(以前是 100,我增加了 x100 但内存仍然增加相同的数量)
# find / -type d -size +10M -ls
#
Run Code Online (Sandbox Code Playgroud)
(无输出)
至于 cronjobs,除了每日日志轮换之外,还有一个脚本可以建立一些 tcp 连接来获取数据并将其存储在数据库中(原始套接字,没有 curl 或任何东西)。除了那个 cronjob,还有 2 个每周运行一次的备份 cronjob。唯一应该能够导致 I/O 的是安装了 SMF 的 …
我的日常任务之一是使用我们的软件创建 USB 闪存盘的可启动映像。映像必须包含两个分区,第一个分区为 FAT32,第二个为 EXT3。首先,我们将 Linux 内核和一个小的启动脚本放在我们要启动的设备上的引导加载程序中,并在启动时读取。
在第二个分区上,我们放置了 rootfs。
现在,这是我的做法:
将 USB 随身碟插入我的 Linux comp。找出它的设备文件(这里假设/dev/sdx)
将它的前 600 MB 清零:dd if=/dev/zero of=/dev/sdx bs=1M count=600
创建两个分区,第一个 10 MB 和第二个 500 MB: sfdisk /dev/sdx --unit S << EOF ,20000,c ,1000000,83 EOF
mkfs.vfat /dev/sdx1 mkfs.ext3 /dev/sdx2
(假设扇区大小为 512 字节!)
现在,所有这些都有效。明显的改进是创建一个脚本来自动完成这一切。这也可以完成,但仍然需要一个手动步骤:插入 USB 随身碟。
我在想,我们可以使用 RAM 中的块设备来代替实际的 USB 磁盘。这样不仅可以省去手动插入U盘的步骤,而且速度也会更快。
所以我需要的是 RAM 中的普通块设备。可以像物理 USB 笔式驱动器一样分成多个分区。
我刚刚研究了这个话题,似乎唯一的选择是
memory ×10
linux ×4
apache-2.2 ×2
cache ×2
docker ×1
hp ×1
hp-proliant ×1
memcached ×1
memory-usage ×1
php ×1
python ×1
ssh ×1
swap ×1
ubuntu ×1