某客户报告其xml解析程序近期频繁报告out of memory错误,但其系统实配内存512GB,而且报错时计算内存使用率始终不超过20% .
AIX环境应用内存不足,通常有如下几种常见的情况:
如下maxDATA取值为0,表示未进行特殊调整,即heap最大不超过256MB:
#dump -ov <executable>
***Object Module Header***
# Sections Symbol Ptr # Symbols Opt Hdr Len Flags
4 0x00000000 0 72 0x1007
Flags=( RELFLG EXEC LNNO DYNLOAD DEP_SYSTEM )
Timestamp = "Jan 19 09:06:06 2015"
Magic = 0x1df (32-bit XCOFF)
***Optional Header***
Tsize Dsize Bsize Tstart Dstart
0x000010e0 0x00000430 0x00000044 0x10000100 0x200001e0
SNloader SNentry SNtext SNtoc SNdata
0x0004 0x0002 0x0001 0x0002 0x0002
TXTalign DATAalign TOC vstamp entry
0x0007 0x0003 0x20000544 0x0001 0x20000524
maxSTACK maxDATA SNbss magic modtype
0x00000000 0x00000000 0x0003 0x010b 1L
可以通过如下命令将程序最大heap大小调整为1GB:
ldedit -bmaxdata:0x40000000 <executable>
排查发现客户/etc/security/limits文件存在格式错误,其中root用户一直到pconsole用户之间未留空行。这种不留空行的做法,会导致root到pconsole的所有用户采用pconsole的设置,也就是stack_hard为65536KB,data为640000KB。这使得客户进程(确认为64位进程)实际可用的heap空间不超过640MB,导致在解析大型xml文件时出现了out of memory错误。
有问题的/etc/security/limits文件内容(不同用户设置之间无空行):
default:
fsize = -1
core = -1
cpu = -1
data = -1
rss = -1
stack = -1
nofiles = -1
root:
daemon:
bin:
sys:
adm:
uucp:
guest:
nobody:
lpd:
pconsole:
stack_hard = 131072
data = 1280000
data_hard = 1280000
正确的/etc/security/limits文件内容(不同用户设置之间有空行):
default:
fsize = -1
core = -1
cpu = -1
data = -1
rss = -1
stack = -1
nofiles = -1
root:
daemon:
bin:
sys:
adm:
uucp:
guest:
nobody:
lpd:
pconsole:
stack_hard = 131072
data = 1280000
data_hard = 1280000
esaadmin:
stack = 393216
stack_hard = 393216
注意:不同用户的设置之间需要留空行;但同一个用户的设置之间不能有空行。
考虑到/etc/security/limits格式要求并非像看到的这么简单,建议不要手工编辑/etc/security/limits文件了。建议考虑用chsec命令来编辑,比如:
chsec -f /etc/security/limits -s root -a data=-1 -a data_hard=-1
如果觉得我的文章对您有用,请点赞。您的支持将鼓励我继续创作!
赞2
添加新评论0 条评论