问题:系统运行时间越长,会出现偶发重启的现象,通过查看系统可用内存,发现非常少,几乎内存被用光了。
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目录的空间,做了一个定时清理脚本,内存压力一下子就降下来了。