在诊断台式机内存不足的问题时(详情见U&L),我注意到我的非缓存“内核动态内存”很大:
# smem -twk
Area Used Cache Noncache
firmware/hardware 0 0 0
kernel image 0 0 0
kernel dynamic memory 1.1G 369.3M 801.7M
userspace memory 2.0G 133.3M 1.9G
free memory 734.1M 734.1M 0
----------------------------------------------------------
3.9G 1.2G 2.7G
Run Code Online (Sandbox Code Playgroud)
在另外两个系统上,我检查了它是 150MiB(也是台式机,但有 8GiB 或 RAM)和 29MiB。远不及我台式机的 20%。
我怎样才能找出是什么让它这么大?
顺便说一句:我已经检查了smem源代码,它基本上是这样的(内存总量 - 用户空间 - 免费 - 缓存)。
/proc/meminfo:
# cat /proc/meminfo 内存总量:4051956 kB MemFree:508276 KB 缓冲区:35232 kB 缓存:651052 kB 交换缓存:121380 KB 活跃:1358008 kB 非活动:1351596 KB 活跃(匿名):1184616 kB 不活动(匿名):886904 …
经常用于检查进程是否正在运行的惯用语之一是使用kill -s 0 $pid.
我的问题是,它比使用[[ -e /proc/$pid ]]构造有什么好处吗?
我正在编写的脚本既针对 Linux 又针对 bash。
我运行相当定期从内存不足遭受桌面系统,这促使我去研究什么导致该问题摆在首位。
问题是,没有一个进程会占用内存,但系统并未将其显示为可用。更重要的是,系统确实进行了交换,因此看起来内存压力是真实的。令人费解的是,在我注销并再次退出后,使用情况恢复正常(使用了约 1GB),因此它看起来像是用户空间和内核之间的一些奇怪的交互,而不是内存泄漏。
简而言之:
free,不包括缓存/缓冲区:3173960 kB这给出了3173960-2413952-158968-75992 = 525048 kB未计入的内存使用量。
我缺少什么或不计算什么?
应用程序内存使用总和:
# smem -t | sed -n '1p;$p'
PID User Command Swap USS PSS RSS
108 6 244524 2413952 2461340 2648488
Run Code Online (Sandbox Code Playgroud)
报告的内存使用情况free:
# free -k
total used free shared buffers cached
Mem: 4051956 3449748 602208 0 26548 249240
-/+ buffers/cache: 3173960 877996
Swap: 4051952 242592 3809360
Run Code Online (Sandbox Code Playgroud)
一般内存统计:
# cat /proc/meminfo
MemTotal: 4051956 …Run Code Online (Sandbox Code Playgroud)