Linux 系统下 used 内存被那个进程占用了?
关于 used 下的内存使用情况分析
1, 来由
开发同事反应本机没有做什么, 内存就占用了 11G, 也不知道是什么进程占用了, 为此我展开了 used 内存占用的分析, 上数据图# free -m
total used free shared buffers cached
Mem:32111113162079401571396
-/+ buffers/cache:976222348
Swap:8047647983
2, 原因分析
针对此问题, 我及时查看哪个进程占用# ps aux | head -1; ps aux| sort -rnk 4 | head -10
USER PID%CPU%MEM VSZ RSS TTY STAT START TIME COMMAND
zabbix228660.00.0782441836?SJan180:27/usr/sbin/zabbix_agentd:listener#3 [waiting for connection]
zabbix228650.00.0782441856?SJan180:27/usr/sbin/zabbix_agentd:listener#2 [waiting for connection]
zabbix228640.00.0782441852?SJan180:27/usr/sbin/zabbix_agentd:listener#1 [waiting for connection]
zabbix228630.00.0781201924?SJan180:59/usr/sbin/zabbix_agentd:collector[idle1sec]
zabbix228610.00.078120768?SJan180:00/usr/sbin/zabbix_agentd-c/etc/zabbix/zabbix_agentd.conf
USER PID%CPU%MEM VSZ RSS TTY STAT START TIME COMMAND
rtkit28550.00.0168452844?SNl20204:55/usr/libexec/rtkit-daemon
rpcuser22120.00.023344740?Ss20200:00rpc.statd
rpc20920.00.018972604?Ss20200:16rpcbind
root990.00.000?S20200:00[kintegrityd/9]
但是没有找到问题点, 继续
查看 / proc/meminfo 文件时# cat /proc/meminfo 未启动 java 时 启动 java 后
MemTotal:32882392kB32882392kB
MemFree:11152484kB9941460kB
Buffers:174520kB175588kB
Cached:1485864kB1508656kB
SwapCached:5100kB5092kB
Active:10906000kB12098640kB
Inactive:845964kB859936kB
Active(anon):10088872kB11271860kB
Inactive(anon):4448kB4448kB
Active(file):817128kB826780kB
Inactive(file):841516kB855488kB
Unevictable:0kB
Mlocked:0kB
SwapTotal:8241144kB8241144kB
SwapFree:8174820kB8174828kB
Dirty:980kB1472kB
Writeback:0kB
AnonPages:10090488kB11275588kB
Mapped:35960kB35964kB
Shmem:1600kB1600kB
Slab:9708836kB9709656kB
SReclaimable:8982448kB8982488kB
SUnreclaim:726388kB727168kB
KernelStack:5592kB5888kB
PageTables:34344kB36660kB
NFS_Unstable:0kB
Bounce:0kB
WritebackTmp:0kB
CommitLimit:24682340kB24682340kB
Committed_AS:21549588kB21577332kB
VmallocTotal:34359738367kB34359738367kB
VmallocUsed:200220kB200220kB
VmallocChunk:34341972664kB34341972664kB
HardwareCorrupted:0kB
AnonHugePages:9539584kB10670080kB
HugePages_Total:0
HugePages_Free:0
HugePages_Rsvd:0
HugePages_Surp:0
Hugepagesize:2048kB2048kB
DirectMap4k:10240kB10240kB
DirectMap2M:33544192kB33544192kB
3, 在网络上找原因
自己分析不出问题点, 网络上有很多人说 slab 来分配内存, 但是我想知道 slab 中内存包括那些内容, 很少的知识点, 怎么办?
我找到一个工具, Linux-fincore
下载 Linux-fincore 工具:
#wget https://codeload.github.com/waleedmazhar/linux-ftools/zip/master
安装步骤如下:#cd /opt
#unzip -d Linux-ftools-master.zip
#cd Linux-ftools-master
#./configure --prefix=/usr/local/Linux-ftools #请确保安装 gcc 依赖包, 无错误进行下一步
#make
#make install
添加环境变量:#mv /usr/local/ftools/bin/*/usr/local/bin/
#Linux-fincore --pages=false --summarize --only-cached * ![操作命令](https://img2020.cnblogs.com/blog/1612349/202101/1612349-20210121214904457-1764740405.png) 由于图片出不来, 我直接贴上去吧
'''# linux-fincore --pages=false --summarize --only-cached *
filename size total_pages min_cached page cached_pages cached_size cached_perc
Could not mmap file: linux-ftools-master: No such device
netapp.txt 891,161 218 0 218 892,928 100.00
total cached size: 892,928'''
为了更好抓取内存中进程, 我这边添加个脚本 + 定时任务来完成, 提供开发需要的资料,
脚本为:# cat fincore.sh
#!/bin/bash
./etc/init.d/functions
PATH=/usr/lib64/qt-3.3/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/usr/java/jdk1.8.0_131/bin:/usr/java/jdk1.8.0_131/lib:/root/bin
echo $PATH
if[!-f/usr/local/bin/Linux-fincore];then
echo"you haven't install linux-fincore."
exit1
fi
ps-e-o pid,rss|sort-rnk2|head-10|awk'{print $1}'>/tmp/cache.pid
if[-f/tmp/cache.log];then
echo"the cache.files is exist,removing now"
rm-f/tmp/cache.log
fi
whileread line
do
lsof-p $line2>/dev/null|awk'{print $9}'>>/tmp/cache.log
done>/tmp/cache.fincore
fi
done
Linux-fincore-s`cat /tmp/cache.fincore`
rm-f/tmp/cache.{pid,log,fincore}
测试一下脚本使用#/bin/bash fincore.sh> 2.log
# 查看日志中分析的数据
/usr/lib64/qt-3.3/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/usr/java/jdk1.8.0_131/bin:/usr/java/jdk1.8.0_131/lib:/root/bin
filename size total_pages min_cached page cached_pages cached_size cached_perc
------------------------------------------------------------------------
/weaver/jdk1.8.0_131/bin/java7,7342014,09650.00
/lib64/libuuid.so.1.3.018,93650520,480100.00
/usr/lib64/libstdc++.so.6.0.13989,8402420109446,46445.04
/usr/lib64/libsapjco3.so5,407,6991,32105002,048,00037.85
/weaver/ecology/-INF/lib/ehcache-2.8.3.jar5,637,5641,37704541,859,58432.97
这边我只保留部分数据,
这时, 脚本已启作用了, 现在只需要添加定时任务让它自动运行并输出日志给到系统了, 方便他们及时查看.
来源: http://www.bubuko.com/infodetail-3718791.html