我们正在尝试调查中等负载下 java 进程的内存使用情况。
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
12663 test 20 0 8378m 6.0g 4492 S 43 8.4 162:29.95 java
Run Code Online (Sandbox Code Playgroud)
如您所见,我们的常驻内存为 6Gb。现在有趣的部分是:这个过程是用这些参数执行的:
查看这些设置和实际内存使用情况,我们偶然发现了我们期望此进程使用的内容与它实际使用的内容之间的差异。
通常我们的内存问题是通过分析堆转储来解决的,但在这种情况下,我们的内存是在堆外的某个地方使用的。
问题:尝试找出如此高内存使用率的原因的步骤是什么?哪些工具可以帮助我们识别在该过程中使用内存的内容?
编辑 0
看起来这不是堆相关的问题,因为我们仍然有相当多的空间:
jmap -heap 12663
Run Code Online (Sandbox Code Playgroud)
结果(编辑以节省空间)
Heap Configuration:
MinHeapFreeRatio = 40
MaxHeapFreeRatio = 70
MaxHeapSize = 2147483648 (2048.0MB)
NewSize = 536870912 (512.0MB)
MaxNewSize = 536870912 (512.0MB)
OldSize = 1610612736 (1536.0MB)
NewRatio = 7
SurvivorRatio = 8
PermSize = 21757952 …Run Code Online (Sandbox Code Playgroud) 使用 ps,我可以看到大小、vsize(与 top 的 VIRT 相同?)和 rss(与 top 的 RES 相同?)。(我在上面看到的另一个是 SHR。)
有人可以为我总结这些不同领域的含义吗?
我希望有人能帮帮忙。我们有一台带有 16GB RAM的Windows Server 2008 R2机器,它的所有可用内存不断被某些东西吃掉。在没有任务管理器或资源监视器显示使用300MB以上的内存中的任何程序......但在服务器上的内存使用量是15.7GB。

唯一运行的是SQL Server 2008和IIS7.5(使用 ASP.Net)。
注意:重新启动后的 RAM 使用率开始较低并逐渐增加。一周左右后,我们不断在这种情况下发现自己。
我怎样才能发现是什么吞噬了我们所有的记忆?:(
windows-server-2008 memory performance-monitoring task-manager memory-usage
在设置 MySQL 以提高性能方面,我是一个非常大的菜鸟。老实说,我并不担心从 MySQL 中挤出最后一点性能的微调,但我知道提供一些最佳结果的最重要的事情是正确设置缓存/缓冲区。
我试图通过仅使用 InnoDB 作为存储引擎来保持简单。而且我确实有一个用于 MySQL 的专用服务器。它有 8GB 的 RAM,我应该如何分配它以最大限度地提高性能?我希望能够将我的整个数据库放入内存以获得最佳性能。数据库大约5GB。这可能吗?
我应该为查询缓存分配多少内存?InnoDB 缓冲池多少钱?计算机的其余部分(即非 MySQL 相关进程)多少钱?等等。
由于我没有使用 MyISAM,所以我真的不需要在密钥缓存中放入大量内存,对吗?
DRAM 芯片非常紧凑。研究表明,相邻位可以随机翻转。
参考:
我知道 SQL 喜欢 RAM,但是当 Windows 询问时会释放它。我知道这就是 SQL 应该如何工作。但是我有一个 Windows 管理员不相信 SQL 实际上会返回 RAM,并且在这个特定的(虚拟)服务器上,一旦 Analysis Services 完成,SQL 就不需要太多多问 SQL。
所以我试图向 Windows 管理员保证虚拟环境的问题不是“因为 SQL 使用了太多 RAM”,但我似乎无法说服 SQL 在不重新启动服务的情况下释放它。
在处理多维数据集时,SQL 服务愉快地占用了 8GB 的 RAM,但由于它没有压力,所以在正常的一天中它不会释放太多内存。Windows 人尖叫,让 SQL 发布它会更好。
我不想使用最大内存设置,因为我确实希望 SQL 在处理时使用那么多 RAM。我只是希望它之后再次下降。
它可能是SQL Server 不释放内存和从 SQL Server 回收内存的重复,但我想知道是否有不同的答案。等待 Windows 收回它不会说服这里的 Windows 人员。重新启动服务是一种选择,但我真的不喜欢这个想法。
我想知道如何让 Windows 要求它回来......
不太熟悉用于刀片服务器设置的英特尔“镜像通道模式”(您在裸机刀片上运行的典型中等重型 MySQL OLTP 数据库;现在没有虚拟化)。
从英特尔文档中,我能够找到:
英特尔至强处理器 5500 系列和英特尔至强处理器 5600 系列支持通道镜像,以在镜像配置中配置 DDR3 DIMM 的可用通道。镜像配置是内存的冗余映像,尽管存在偶发的无法纠正的错误,但仍可继续运行。通道镜像是一种 RAS 功能,其中维护内存数据的两个相同映像,从而提供最大的冗余。
在基于英特尔至强处理器 5500 系列和英特尔至强处理器 5600 系列处理器的英特尔服务器主板上,实现了跨通道镜像。活动通道保存主映像,其他通道保存系统内存的次映像。英特尔至强处理器 5500 系列和英特尔至强处理器 5600 系列处理器中的集成内存控制器在两个通道之间交替进行读取事务。在正常情况下,写入事务会发送到两个通道。
但是,我并没有真正了解他们在这里放置的东西。我失去了一半的存储容量,但我获得了内存的“冗余”并可能获得读/写性能优势?像 RAM 的 RAID 1?有人对这种配置有任何实际经验吗?
大约每周一次,但有时甚至一天几次在正常运行几天后,我的 EC2 实例变得无响应。Munin 的内存图讲述了一个非常简单的故事:分配给“应用程序”的内存开始增长并且不会停止,直到交换完全使用并且实例有效地降低到膝盖为止。另一个自定义图显示不断增长的进程是apache2。
我使用 mod_php 和一些 PHP 脚本运行标准的 prefork Apache 设置。正如您在下图中所看到的,发生一些事情会触发 apache2 进程开始消耗越来越多的内存。我及时发现了第一个绿色尖峰,并在事情失控之前重新启动了 Apache。第二个峰值变得更远了,实例必须彻底重启。
我想知道的是如何最好地调试它。除了使用 FastCGI 设置 PHP 并让它在自己的进程中运行之外,有什么好方法可以找出是 Apache 还是 PHP 和我的代码的组合导致内存使用过多?你们会采取什么步骤来追踪这个问题?
更新:正如马特在下面建议的那样,在涉及 strace 后,我能够追踪泄漏。
在找到内存中逐渐且持续增长的 apache2 进程后,我向我的 PHP 脚本添加了更多的 error_log() 调用,以打印出在其执行过程中各个点使用的 RSS 总量(使用 ps 的输出)。然而,结果证明这是一种误导——虽然 RSS 似乎只有在我的脚本执行完毕后才会跳转,但后来的调试表明情况并非如此。当心!
幸运的是,所有这些 error_log() 调用最终都证明是有用的。当我启动 strace ( strace -p <pid> -tt -o trace.log -s 256) 时,我看到对于每个请求,进程分配了大约 400k 的内存(查找 'brk' 系统调用并从最后一个调用的参数中减去第一个调用的参数——一些通常是一个之后)。然后,我搜索了包含我的 error_log() 消息的最新“写入”系统调用,它告诉我在脚本中的哪个点分配了内存。通过一些更具策略性的 error_log() 调用来更准确地查明位置,我终于找到了罪魁祸首。
当我们从 PHP 脚本调用 curl_exec() 时,内存正在泄漏。一些与处理 SSL 连接相关的 curl 代码做错了——当我切换到 HTTP 时,泄漏就消失了。Curl 的更新日志引用了一些在 7.19.5 中修复的 SSL 内存泄漏(我们在 …
红帽EL5
我按照我喜欢的方式配置了我的顶部,以 MB 为单位显示内存摘要和交换摘要。我不得不关闭我的外壳,然后当我重新打开它时,它又以(默认?)千字节显示。
我已经搜索了 google 和 top help 并管理了页面。我似乎无法在 MB 选项中找到显示。虽然,我确实发现了许多其他有些奇怪的选择......
如果有人知道我肯定会很感激。
谢谢!
memory ×10
linux ×3
ecc ×2
top ×2
apache-2.2 ×1
bug ×1
database ×1
freenas ×1
innodb ×1
java ×1
memory-usage ×1
mysql ×1
performance ×1
php ×1
ps ×1
redhat ×1
security ×1
sql-server ×1
task-manager ×1
windows ×1
zfs ×1