charleschchen
作者charleschchen·2021-11-27 16:35
系统架构师·浪潮商用机器有限公司

/etc/security/limits文件设置不当导致应用out of memory报错问题

字数 2280阅读 3987评论 0赞 2

问题现象

某客户报告其xml解析程序近期频繁报告out of memory错误,但其系统实配内存512GB,而且报错时计算内存使用率始终不超过20% .

问题分析

AIX环境应用内存不足,通常有如下几种常见的情况:

  1. ulimit设置不足
    这种情况可以使用ulimit -a查看,修改/etc/security/limits文件解决。
  2. 32位程序导致的heap内存空间不足
    32位程序默认的heap/stack共享256MB的段空间。因此对于32位程序,如果出现内存不足,需要考虑maxdata设置问题。
    可以dump -ov 观察其maxDATA设置,并考虑通过ldedit或设置LDR_CNTRL环境变量进行调整.

如下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>

  1. paging space不足 (排除过小的paging space设置,如默认的512MB)
    如果lsps -a 显示存在类似问题,可以考虑扩充paging space。
  2. 系统或应用内存泄漏 (topas、svmon 观察系统、应用内存使用情况)
    请参考文档:
    https://www.talkwithtrend.com/Document/detail/tid/439193

问题结论

排查发现客户/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 条评论

Ctrl+Enter 发表

作者其他文章

X社区推广