Linux系统奇事【free显示内存95%但是top却看不到谁用】

事情的起因是公司产品在做稳定性测试时发现系统空闲内存一直在减少,但使用top等命令查看时又找不到内存占用高的程序。

系统占用内存持续上涨:

 普罗米修的统计:

 命令查看系统内存:

 使用top和ps命令也没有查到有占用内存高的程序,但是发现有个vp-video的进程数量很多。

使用命令查看进程数:

ps -aux | grep vp-video | wc

发现这个进程有九百多个,但每个进程所占内存极少,大概5M左右,全部加起来也不过5~6G的内存占用,距离15G的内存占用还差的很远。

使用命令查看链接状态:

netstat -anput | sort -k 2 -r | head -n 50

这次有了重大发现,有些vp-video进程接收队列产生了数据包堆积,如图:

 每个进程的接收队列大概堆积了50M的数据,这样的进程有197个,算下来差不多就是10个G了。

Recv-Q 中的数据还处于内核态,所以不会被top等工具统计到。

本以为已经找到了原因,由开发的同事把数据积压的问题解决了就可以了。没想到经过多方排查之后,问题好像又指向了系统内核当中。

同事在排查问题时发现,并不是程序处理能力不够,而是某些vp-video进程会出现一种假死状态。就是程序本身已经不再进行业务处理了,但是与之对应的网络端口还没有被关闭。这就导致了上游的数据发送程序一直能够将数据包发送到该进程的Recv-Q中,也就出现了之前看到的现象。

vp-video进程只有在收到父进程发送的kill 15信号后才会结束任务并退出,子进程信号处理函数中的log日志里也确实没有收到kill 15信号的记录。难道linux系统会存在信号丢失的问题?

通过gdb跟踪到已经处于假死状态的进程,打印出栈信息,发现程序进到了kill 15的信号处理函数,但卡死在了__lll_lock_wait_private()中。

__lll_lock_wait_private又是在malloc()时调用的,现在问题明确了,malloc是不可重入函数, 如果重入了可能会死锁。通过栈信息可以看到,在进入信号处理之前,程序的业务处理逻辑正在malloc,中断处理函数中也调用了malloc函数,这就出现了malloc的重入,从而导致进程死锁。

解决方法:删除信号处理函数中的malloc调用,设置退出标记后便返回,业务处理流程中判断退出标记,执行相应的退出流程。

最后总结:

1 Recv-Q堆积会占用系统内存,这部分内存用top查不出来,需要用netstat查看。

2 malloc是不可重入函数, 如果重入了可能会死锁。所以信号处理函数里面不能调用malloc。

3 malloc的调用有可能是间接地或者说是隐式的。所以信号处理函数应该尽可能简单, 比如只设置一个flag, 然后让其它处理流程根据这个flag来做其它事情。

《本杰明·巴顿奇事》(英文名:The Curious Case of Benjamin Button)是一部由美国作家F. Scott Fitzgerald所写的短篇小说,于1921年首次发表。该小说以一名男子本杰明·巴顿的成长故事为主线,他与常人截然不同,因为他在出生时就逆向老化。随着时间的推移,他的年龄逐渐变小,而精神和心智却逐渐成熟。本杰明的奇特命运使得他在与父母、亲人、朋友以及爱人之间经历了许多不同寻常的经历和情感波折。 故事中,本杰明从逆风启动。这种逆风的启动意味着他从小便面临了与他人不同的困境和挑战。年轻的时候,他与一般人的认知相左,经历了孤独、排斥、被认为是怪物的困扰。然而,他也透过逆转的生长方式,逐渐学会了看淡这些外界的评判,展现出内在的坚韧和乐观。 正是因为本杰明独特的遭遇,他与周围世界的联系不断变化,他发现自己对于生命和时间的理解与常人截然不同。尽管他在与家人、朋友和爱人之间面临了许多分离和心灵上的矛盾,但他也通过这些经历逐渐获得了智慧和宽容。 本杰明的故事启发了人们对于生命、时间和人生意义的思考。它让我们反思人性的多样性和人与人之间的理解与包容。虽然本杰明掌握的是逆向生命规律,但他所经历的情感和人性的起伏与常人无异。逆风启动并没有让他在生命的旅程中丧失希望和勇气,相反地,他在逆境中逐渐展现出自己的独特魅力。 综上所述,本杰明在《本杰明·巴顿奇事》中面临了逆风启动的境况。他的成长之路充满了困难和挑战,但他通过坚韧、乐观和对生命的理解,逐渐发现自己具有独特的价值和意义。这个故事鼓励我们面对逆境时坚持希望,勇敢地面对任何困难,以不同的视角看待生命和时间的流逝。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

高晓伟_Steven

相逢即是有缘,动力源于金钱。

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值