在实际询问之前,首先要明确一点:是的,我知道磁盘缓存,但不,这不是我的情况:)抱歉,对于这个开场白:)
我正在使用 CentOS 5。系统中的每个应用程序都在大量交换,系统非常慢。当我这样做时free -m
,我得到了以下结果:
total used free shared buffers cached
Mem: 3952 3929 22 0 1 18
-/+ buffers/cache: 3909 42
Swap: 16383 46 16337
所以,我实际上只有 42 Mb 可用!据我所知,-/+ buffers/cache
实际上不包括磁盘缓存,所以我确实只有 42 Mb,对吗?我想我可能是错的,所以我尝试关闭磁盘缓存,但没有任何效果 - 图片保持不变。
因此,我决定找出谁在使用我的所有 RAM,并top
为此使用了它们。但是,显然,它报告说没有进程在使用我的 RAM。我的 top 中唯一的进程是 MySQL,但它使用了 0.1% 的 RAM 和 400Mb 的交换空间。当我尝试运行其他服务或应用程序时,情况相同 - 全部进入交换空间,top
显示 MEM 未被使用(任何进程最多为 0.1%)。
top - 15:09:00 up 2:09, 2 users, load average: 0.02, 0.16, 0.11
Tasks: 112 total, 1 running, 111 sleeping, 0 stopped, 0 zombie
Cpu(s): 0.0%us, 0.0%sy, 0.0%ni,100.0%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st
Mem: 4046868k total, 4001368k used, 45500k free, 748k buffers
Swap: 16777208k total, 68840k used, 16708368k free, 16632k cached
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ SWAP COMMAND
3214 ntp 15 0 23412 5044 3916 S 0.0 0.1 0:00.00 17m ntpd
2319 root 5 -10 12648 4460 3184 S 0.0 0.1 0:00.00 8188 iscsid
2168 root RT 0 22120 3692 2848 S 0.0 0.1 0:00.00 17m multipathd
5113 mysql 18 0 474m 2356 856 S 0.0 0.1 0:00.11 472m mysqld
4106 root 34 19 251m 1944 1360 S 0.0 0.0 0:00.11 249m yum-updatesd
4109 root 15 0 90152 1904 1772 S 0.0 0.0 0:00.18 86m sshd
5175 root 15 0 90156 1896 1772 S 0.0 0.0 0:00.02 86m sshd
重启没有用,顺便说一下非常速度很慢,这在我通常情况下是不会在该机器(4 核、4GB RAM、RAID1)上运行的。
因此,我很确定这不是磁盘缓存,谁在使用 RAM,因为通常应该减少它并让其他进程使用 RAM,而不是去交换。
所以,最后的问题是——是否有人知道如何找出哪个进程实际上如此大量地使用内存?
答案1
在 Linux 上,top
您可以按下<
键将输出显示排序向左移动。默认情况下,它是按 排序的,%CPU
因此,如果您按下 键 4 次,您将按VIRT
虚拟内存大小 排序,从而得到答案。
另一种方法是:
ps -e -o pid,vsz,comm= | sort -n -k 2
应该给你按进程虚拟大小排序的输出。
以下是完整版本:
ps --everyone --format=pid,vsz,comm= | sort --numeric-sort --key=2
答案2
以兆字节为单位显示进程内存和进程路径。
ps aux | awk '{print $6/1024 " MB\t\t" $11}' | sort -n
答案3
附注:服务器上出现了同样的症状,但仍然显示内存耗尽。最后找到的是一台 sysctl.conf,它来自一个有 32 GB RAM 的机器,并且为数据库设置了大页面,配置为 12000。这个机器只有 2 GB RAM,所以它将所有可用 RAM 分配给大页面(只有 960 个)。将大页面设置为 10(因为反正没有使用大页面),释放了所有内存。
快速检查 /proc/meminfo 来查找 HugePages_ 设置可以很好地开始解决至少一个意外的内存占用问题。
答案4
就我而言,问题在于服务器是vmw_balloon
启用了模块的 VMware 虚拟服务器:
$ lsmod | grep vmw_balloon
vmw_balloon 20480 0
vmw_vmci 65536 2 vmw_vsock_vmci_transport,vmw_balloon
跑步:
$ vmware-toolbox-cmd stat balloon
5189 MB
因此,主机实际上回收了大约 5 GB 的内存。因此,尽管我的虚拟机“正式”拥有 8 GB 的内存,但实际上却少得多:
$ free
total used free shared buff/cache available
Mem: 8174716 5609592 53200 27480 2511924 2458432
Swap: 8386556 6740 8379816