![除了缓存之外,Linux 内核还使用大量内存做什么?](https://linux22.com/image/62816/%E9%99%A4%E4%BA%86%E7%BC%93%E5%AD%98%E4%B9%8B%E5%A4%96%EF%BC%8CLinux%20%E5%86%85%E6%A0%B8%E8%BF%98%E4%BD%BF%E7%94%A8%E5%A4%A7%E9%87%8F%E5%86%85%E5%AD%98%E5%81%9A%E4%BB%80%E4%B9%88%EF%BC%9F.png)
我的电脑感觉非常缓慢。根据free
,我只剩下大约 200M RAM,并且必须换出超过 1GB 的内存。我知道使用内存进行缓存是件好事,但这看起来我的 RAM 确实不足。
root@desktop:/proc free -h
total used free shared buff/cache available
Mem: 3.9G 3.4G 132M 44M 378M 213M
Swap: 8.0G 1.2G 6.7G
smem -tk
报告称应用程序最多使用 2GiB(RSS 列)。smem -wk
占所有已使用的内存。显然内核使用 1.8GiB 不是为了缓存:
root@desktop:/proc smem -wk
Area Used Cache Noncache
firmware/hardware 0 0 0
kernel image 0 0 0
kernel dynamic memory 1.9G 74.3M 1.8G
userspace memory 1.8G 250.9M 1.6G
free memory 173.9M 173.9M 0
这种行为是否是预期的?如果是,内核需要这么多内存来完成什么任务?
答案1
你也可以尝试这个:
使用萨尔报告一段时间内的上下文切换和 irq 使用情况。 Sar 是一个很棒但闻所未闻的系统监控工具。运行一天,然后使用各种报告来查找异常情况。
脚步:
安装 sysstat 软件包。设置 cron 作业(检查/etc/cron.d/
是否存在这样的文件),如下所示:
* * * * * root /usr/lib64/sa/sa1 -S XALL 10 6
这将创建大量数据-- 每天大约 300 MB。它将拍摄系统统计信息的快照每 6 秒。 (您可以通过将“10 6”更改为“2 30”将频率降低到每分钟两次)
如果更改捕获频率,则应删除当天的文件/var/log/sa/sa$(date +%d)
- 否则报告可能会损坏。
好的,捕获数据后,尝试这些(提示:始终通过管道less
):
sar -q
获取平均负载和运行队列大小。如果这些时间较低,则查看 IO 等待时间:
sar -P ALL
如果您没有看到 %iowait 中的跳跃或 %idle 中的低谷,那么请检查上下文切换:
saw -w
在大部分空闲的系统上,每秒 500 次上下文切换是很正常的。
您可以通过指定活动文件、给出开始时间和结束时间(分别为-s <hh:mm:ss>
和-e <hh:mm:sss>
)以及可选的间隔时间-i <secs>
(必须大于由 cron 作业设置的捕获分辨率)来限制 sar 报告。
例子:
sar -f /var/log/sa/sa$(date +%d -d yesterday) -s 09:15:00 -e 12:15:00 -i 600
从昨天的 9:15 到 12:15 之间,每隔 10 分钟就会为您提供 CPU 的摘要信息。
还有更多...更多。您可以man sar
获取该信息。
答案2
我不知道你为什么编辑free -h
缺少该-/+ buffers/cache
行的输出命令 - 这很重要。无论如何我们可以继续。
只要“Free”列(在 Mem: 行上)>0,RAM 就不会真正不足,因为这是绝对未使用的内存。众所周知,Linux 会使用它可以获得的所有 RAM(作为缓存,希望获得更好的性能)。
交换部分并没有说出全部真相:将大量代码+数据交换到磁盘是很常见的,因为它只运行一次并且有一段时间没有使用。 Linux 的另一部分显示了它对 RAM 的性能的贪婪:它迅速踢掉了可能不重要的东西(同样,性能方面)。它是可调的(sysctl vm.swappiness),但大多数发行版默认为“毫不犹豫地交换”。
确认您的假设(由于缺乏可用 RAM 而缓慢)的重要因素是当前是否正在换入或换出到磁盘。大多数时候,很容易将迟缓与计算机上疯狂闪烁的磁盘联系起来。否则,运行top
并查看交换数据随时间的演变。更简单的是,vmstat 1
直接打印每秒的交换IO数据(swap si/so)。