charleschchen
作者charleschchen·2022-08-24 14:16
系统架构师·浪潮商用机器有限公司

AIX网络内存问题诊断案例分析

字数 1092阅读 2020评论 0赞 1

问题现象

客户反馈系统无法登录,但已有的登录窗口可以执行命令,但部分网络相关命令执行提示错误,如下:

#no -a
0821-055 no: Cannot create a socket. The error number is 74.

问题分析

UNIX环境的错误码定义在errno.h头文件中,74号错误代表为No buffer space available, 也就是缓存资源不足:

# grep 74 /usr/include/sys/errno.h  
#define ENOBUFS 74 /* No buffer space available */

通过topas/nmon检查内存使用,发现计算内存占用仅略超过50%,并未发现系统物理内存资源不足的现象。根据实际报错,需要进一步排查网络内存使用情况。

在AIX环境下,套接字(socket) 网络内存使用主要由如下参数限定:

  1. thewall
    限定网络内存最大使用上限,固定为系统总内存的一半。该参数为静态值,根据系统内存实际配置情况而定,不可更改。如果系统中网络内存使用已达到thewall,所有后续网络内存申请失败,这可能导致系统挂死或宕机。
  2. sockthresh
    指定可以为套接字分配的最大网络内存量,单位为基于thewall取值的
    百分比,默认值85。用于防止新套接字或TCP连接耗尽所有网络内存,为现有套接字或TCP接口保留剩余内存。

因此,当网络内存分配总量达到系统总内存的42.5%(=thewall*sockthresh/100)时,在系统中新建socket会失败,错误为ENOBUFS。新的连接请求将被静默丢弃,而已有的套接字可以继续使用额外的内存。

结合系统实际表现,新建连接失败,现有窗口可以继续访问,但部分网络类操作失败,初步判定系统中存在网络内存占用过高的问题。通过kdb系列内部命令可以进一步证实该问题。
普通用户可以通过nmon然后输入m,观察到系统内核内存分配占比,即下图右上角System部分(45.9%):

作为对比,该系统重启后,System占比仅为12.5%.
说明:
网络内存仅为系统内核内存的一部分,除网络缓存外,系统内存还包含虚拟内存管理、文件系统、逻辑卷管理、设备驱动等等。

建议

网络内存使用高可能与系统中连接数过多有关,因为每个连接的收发缓存、控制块等都需要分配内存,系统网络协议栈处理也需要一定内存;比如将TCP收发缓存分别设置为1M,则一万个连接大约需要20GB网络内存。
网络内存使用高也可能与系统存在网络内存泄漏有关;这类问题通常需要联系厂商服务人员解决,必须时需要提供system dump等数据。

如果觉得我的文章对您有用,请点赞。您的支持将鼓励我继续创作!

1

添加新评论0 条评论

Ctrl+Enter 发表

作者其他文章

相关文章

相关问题

相关资料

X社区推广