检查 TOP 里面线程 A 占用的 1.3GB 内存的详细使用情况,以减少 VMWare 的内存分配达到 1GB 可以运行系统

global_biz 2014-11-05 10:29:16
Hi,

下面是一张 Linux RedHat 系统的 top 结果,其中 PID 为 4561 (第一行)的 线程A (我将线程名隐藏了,因为不好公开名称)占了 1.3 GB 的内存,我想知道这 1.3GB 内存是怎么样来的,目的是想通过了解其内存使用情况,然后想办法减少内存的使用量。



版本 6.0 的描述:

上面这个图是我在 VMWare 里面安装的一个服务器应用系统(US 的产品),目前版本为 6.0 , 现在给 VM 是分配了 2GB 的内存,系统才能正常运行起来,如果是给 VM 1GB 的内存的时候,系统会直接在启动上面图中的 线程A 的时候整个系统都 Hang 住了不能动(等了很长时间也不能动).检查

版本 5.0 的描述: (作为一个对比)

以前在 VMWare 里面安装相同的这个服务器应用系统的时候,当时版本为 5.0,里面也是运行同一个这个 线程A ,在安装 5.0 版本的时候,给 VM 分配了 1GB 内存就可以直接运行得很畅顺了,还有很多多出来的内存。

目的:

请帮下忙看下如何检查线程 A 在版本 6.0 的时候,内存到底使用在哪里面去了,应该如何检查?是直接进 /proc 里面去看吗?还是有其他方法?

我已经试过以下方法:
在这个文件里面 /etc/security/limits.conf 加上下面两行:
* hard as 524288
* soft as 524288
想限制所有线程最大内存是 512 MB ,但是重启还是看到 1.3GB,是不是这种设置无效??还是使用的参数错了???

谢谢。
...全文
402 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
Cody2k3 2014-11-11
  • 打赏
  • 举报
回复
引用 6 楼 global_biz 的回复:
[quote=引用 5 楼 Cody2k3 的回复:] 反编译然后更改,理论上可行实际上比较困难,因为牵扯到变量大小,重定位,指令对齐,binary checksum等等,虽然有一些elf edit的tool,但是不建议尝试 作为一个程序当然是可以malloc大量空间然后自己做customize的分配的 几个办法可以试一下 1.pmap 然后看内存哪里消耗严重 2.如果没有源代码,自己写一个简单malloc/free 实现,preload这个程序,做相应的log 分析内存申请的不合理的地方 3.如果有源代码scan一下看看哪里可疑,做适当logging 仅供楼主参考
请问这个 preload 程序如何更改 malloc/free 的实现?有没有具体的例子?我想试一下这个方法,谢谢。[/quote] 网上很多例子哈,楼主不介意读一点英文这里有一个 http://stackoverflow.com/questions/6083337/overriding-malloc-using-the-ld-preload-mechanism http://www.zyztematik.org/?p=151 。。。 只需搜 preload + malloc 就可以
global_biz 2014-11-08
  • 打赏
  • 举报
回复
引用 5 楼 Cody2k3 的回复:
反编译然后更改,理论上可行实际上比较困难,因为牵扯到变量大小,重定位,指令对齐,binary checksum等等,虽然有一些elf edit的tool,但是不建议尝试 作为一个程序当然是可以malloc大量空间然后自己做customize的分配的 几个办法可以试一下 1.pmap 然后看内存哪里消耗严重 2.如果没有源代码,自己写一个简单malloc/free 实现,preload这个程序,做相应的log 分析内存申请的不合理的地方 3.如果有源代码scan一下看看哪里可疑,做适当logging 仅供楼主参考
请问这个 preload 程序如何更改 malloc/free 的实现?有没有具体的例子?我想试一下这个方法,谢谢。
Cody2k3 2014-11-08
  • 打赏
  • 举报
回复
反编译然后更改,理论上可行实际上比较困难,因为牵扯到变量大小,重定位,指令对齐,binary checksum等等,虽然有一些elf edit的tool,但是不建议尝试 作为一个程序当然是可以malloc大量空间然后自己做customize的分配的 几个办法可以试一下 1.pmap 然后看内存哪里消耗严重 2.如果没有源代码,自己写一个简单malloc/free 实现,preload这个程序,做相应的log 分析内存申请的不合理的地方 3.如果有源代码scan一下看看哪里可疑,做适当logging 仅供楼主参考
global_biz 2014-11-07
  • 打赏
  • 举报
回复
引用 3 楼 Cody2k3 的回复:
据我粗浅的了解,pam_limits 一般是用来限制登录用户的,它起作用一般是在/etc/pam.d/login 里面加上 session required pam_limits.so 所以前提条件是你必须登录然后从shell run你的程序,否则比如系统自动启动的daemon是不经过pam stack的,你的设置也就无法起作用 如果你可以接受登录后从shell启动你的程序,应该是可以的,比如我设置 * hard as 100000 登录后run ulimit就可以看到 $ulimit -a address space limit (Kibytes) (-M) 100000 如果需要apply到daemon,那么在init.d中的script开头加一个 ulimit 的call,比如 ulimit -M 524288 仅供楼主参考
我试了你说的方法,在 sh 里面先调用了 ulimit -v 加了 512MB 的限制,再调用启动上面的 线程A, 结果是线程 A 无法启动,定住了不能动。 在想是不是因为线程A 里面使用了比如 malloc (内存值) 这样的函数直接先自己申请了大量的内存放在里面。 我用 objdump 了一下线程 A, 它的文件结构是 elf32-i386 请问在这种情况下(只是尝试的方式),可否将线程 A 反汇编,然后,将所有调用 malloc () 方法的地方,将所有 malloc 的参数值修改成 512MB,然后,再通过(不知什么工具)将修改后的文件重新生成新的 “线程A“??
Cody2k3 2014-11-07
  • 打赏
  • 举报
回复
引用 2 楼 global_biz 的回复:
[quote=引用 1 楼 Cody2k3 的回复:] 如果没有猜错, 估计这个process是dp_mgr create出来的吧 看内存分布可以 pmap 4561 或者 cat /proc/4561/maps 然后看看地址空间都分配在哪里 看proc 的resource limit可以 cat /proc/4561/limits pam_limits 应该是限制登录的user session的,可能和楼主想要达到的目标不完全一致,同时楼主也要看pam limit有没有被enable 如果process是从shell手动启动,楼主可以试下ulimit, man bash 然后可以看到ulimit的用法, resource limit生效后应该在/proc/4561/limits 里面反映出来
我已经试过以下方法: 在这个文件里面 /etc/security/limits.conf 加上下面两行: * hard as 524288 * soft as 524288 想限制所有线程最大内存是 512 MB ,但是重启还是看到 1.3GB,是不是这种设置无效??还是使用的参数错了??? 请问我设置了这个,重启机器,为什么没发生作用?我想限制整个系统,任何进程都不能超过 512MB.[/quote] 据我粗浅的了解,pam_limits 一般是用来限制登录用户的,它起作用一般是在/etc/pam.d/login 里面加上 session required pam_limits.so 所以前提条件是你必须登录然后从shell run你的程序,否则比如系统自动启动的daemon是不经过pam stack的,你的设置也就无法起作用 如果你可以接受登录后从shell启动你的程序,应该是可以的,比如我设置 * hard as 100000 登录后run ulimit就可以看到 $ulimit -a address space limit (Kibytes) (-M) 100000 如果需要apply到daemon,那么在init.d中的script开头加一个 ulimit 的call,比如 ulimit -M 524288 仅供楼主参考
Cody2k3 2014-11-06
  • 打赏
  • 举报
回复
如果没有猜错, 估计这个process是dp_mgr create出来的吧 看内存分布可以 pmap 4561 或者 cat /proc/4561/maps 然后看看地址空间都分配在哪里 看proc 的resource limit可以 cat /proc/4561/limits pam_limits 应该是限制登录的user session的,可能和楼主想要达到的目标不完全一致,同时楼主也要看pam limit有没有被enable 如果process是从shell手动启动,楼主可以试下ulimit, man bash 然后可以看到ulimit的用法, resource limit生效后应该在/proc/4561/limits 里面反映出来
global_biz 2014-11-06
  • 打赏
  • 举报
回复
引用 1 楼 Cody2k3 的回复:
如果没有猜错, 估计这个process是dp_mgr create出来的吧 看内存分布可以 pmap 4561 或者 cat /proc/4561/maps 然后看看地址空间都分配在哪里 看proc 的resource limit可以 cat /proc/4561/limits pam_limits 应该是限制登录的user session的,可能和楼主想要达到的目标不完全一致,同时楼主也要看pam limit有没有被enable 如果process是从shell手动启动,楼主可以试下ulimit, man bash 然后可以看到ulimit的用法, resource limit生效后应该在/proc/4561/limits 里面反映出来
我已经试过以下方法: 在这个文件里面 /etc/security/limits.conf 加上下面两行: * hard as 524288 * soft as 524288 想限制所有线程最大内存是 512 MB ,但是重启还是看到 1.3GB,是不是这种设置无效??还是使用的参数错了??? 请问我设置了这个,重启机器,为什么没发生作用?我想限制整个系统,任何进程都不能超过 512MB.

742

社区成员

发帖
与我相关
我的任务
社区描述
该论坛主要探讨Linux系统在IBM Power平台的安装、部署、应用开发等话题,并为网友们提供自由交流的平台。
社区管理员
  • Power Linux社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧