问题:系统运行时间越长,会出现偶发重启的现象,通过查看系统可用内存,发现非常少,几乎内存被用光了。
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目录的空间,做了一个定时清理脚本,内存压力一下子就降下来了。
-------------------广告线---------------
项目、合作,欢迎勾搭,邮箱:promall@qq.com
本文为呱牛笔记原创文章,转载无需和我联系,但请注明来自呱牛笔记 ,it3q.com