51工具盒子

依楼听风雨
笑看云卷云舒,淡观潮起潮落

运行时间越长,Linux系统可用内存越小的问题分析

问题:系统运行时间越长,会出现偶发重启的现象,通过查看系统可用内存,发现非常少,几乎内存被用光了。

root@unode:/mnt/UDISK/app# free
             total       used       free     shared    buffers     cached
Mem:         59724      57500       2224      21740       1272      29044
-/+ buffers/cache:      27184      32540
Swap:            0          0          0
root@unode:/mnt/UDISK/app# ps

分析思路1:应用内存泄漏!

方法1、通过top和业务进入、退出,观察top内存情况,发现还是很稳定的。

root@unode:/proc# top
Mem: 51560K used, 8164K free, 17768K shrd, 100K buff, 25516K cached
CPU:   0% usr  20% sys   0% nic  80% idle   0% io   0% irq   0% sirq
Load average: 1.41 1.43 1.45 1/79 4312
  PID  PPID USER     STAT   VSZ %VSZ %CPU COMMAND
 1347  1261 root     S    18016  30%   7% /mnt/UDISK/app/unode_ipc -path /mnt/UDISK/app/unode_ipc.con
  894     1 root     S    13996  23%   7% /mnt/UDISK/app/BcView
 4312 21780 root     R     1156   2%   7% top
14383  1261 root     S    26924  45%   0% /mnt/UDISK/app/bas --config-file /mnt/UDISK/app/default.con

方法2、通过lsof |grep deleted 查看是否存在资源销毁但是进程还是占用文件句柄的情况:

root@unode:/proc# lsof | grep deleted
14383   /mnt/UDISK/app/bas (deleted)    /dev/null
14383   /mnt/UDISK/app/bas (deleted)    /dev/console
14383   /mnt/UDISK/app/bas (deleted)    /dev/console
14383   /mnt/UDISK/app/bas (deleted)    socket:[21391]
14383   /mnt/UDISK/app/bas (deleted)    /tmp/bms/log/info_20240205-165900.14383.log
14383   /mnt/UDISK/app/bas (deleted)    socket:[21392]
14383   /mnt/UDISK/app/bas (deleted)    /tmp/bc_fifo
14383   /mnt/UDISK/app/bas (deleted)    socket:[21595]
14383   /mnt/UDISK/app/bas (deleted)    anon_inode:[eventpoll]
14383   /mnt/UDISK/app/bas (deleted)    pipe:[21440]
14383   /mnt/UDISK/app/bas (deleted)    pipe:[21440]
14383   /mnt/UDISK/app/bas (deleted)    socket:[21430]
14383   /mnt/UDISK/app/bas (deleted)    socket:[21513]
14383   /mnt/UDISK/app/bas (deleted)    socket:[21484]
14383   /mnt/UDISK/app/bas (deleted)    socket:[21587]

确实存在socket和文件句柄没有释放的情况,根据业务排查,找到位置做了修复。

root@unode:/mnt/UDISK/app# lsof |grep deleted
9125    /mnt/UDISK/app/bas      /tmp/bms/log/info_20240206-082817.9125.log (deleted)
root@unode:/mnt/UDISK/app#

方法三:查看系统磁盘空间:

root@unode:/proc# df -hT
Filesystem           Type            Size      Used Available Use% Mounted on
/dev/root            squashfs       29.0M     29.0M         0 100% /rom
devtmpfs             devtmpfs       27.1M         0     27.1M   0% /dev
tmpfs                tmpfs          29.2M     17.4M     11.8M  60% /tmp
/dev/by-name/rootfs_data
                     ubifs          43.5M      3.4M     37.9M   8% /overlay
overlayfs:/overlay   overlay        43.5M      3.4M     37.9M   8% /
tmpfs                tmpfs          29.2M     32.0K     29.1M   0% /run
/dev/by-name/UDISK   ubifs         113.2M     48.3M     60.2M  44% /mnt/UDISK

发现/tmp目录消耗了60%以上的空间,怀疑是跟这个有关系,/tmp空间占用满了,之后导致系统出现重启。


尝试清除了部分日志文件,查看free,瞬间可用内存上来了:

root@unode:/mnt/UDISK/app# free
             total       used       free     shared    buffers     cached
Mem:         59724      36472      23252        704       1272       8012
-/+ buffers/cache:      27188      32536
Swap:            0          0          0
root@unode:/mnt/UDISK/app# ps

原来/tmp为内存文件系统,内存挂载为内存文件系统(tmpfs)。使用的物理空间不是磁盘,而是内存。如果往/tmp文件夹加入大量文件,也会造成系统内存不足。


系统内存被消耗光,原来跟/tmp分区使用占用过多所致,所以针对/tmp目录的空间,做了一个定时清理脚本,内存压力一下子就降下来了。


呱牛笔记





赞(0)
未经允许不得转载:工具盒子 » 运行时间越长,Linux系统可用内存越小的问题分析