检测 Linux 机器上的内存使用来源

检测 Linux 机器上的内存使用来源

我有一个装有 256mb RAM 的 Linux 玩具盒,运行的是 Ubuntu 10.04.1 LTS。以下是输出free -m

             total       used       free     shared    buffers     cached
Mem:           245        122        122          0         19         64
-/+ buffers/cache:         38        206
Swap:          511          0        511

如果我没看错的话,122mb 已被使用,其中只有 84mb 是磁盘缓存。以下是我运行的所有进程,按内存使用情况排序(ps -eo pmem,pcpu,rss,vsize,args | sort -k 1 -r):

%MEM %CPU   RSS    VSZ COMMAND
 5.0  0.0 12648 633140 node /home/node/main/sites.js
 1.5  0.0  3884 251736 /usr/sbin/console-kit-daemon --no-daemon
 1.3  0.0  3328  77108 sshd: apeace [priv]
 0.9  0.0  2344  19624 -bash
 0.7  0.0  1776  23620 /sbin/init
 0.6  0.0  1624  77108 sshd: apeace@pts/0
 0.6  0.0  1544   9940 redis-server /etc/redis/redis.conf
 0.6  0.0  1524  25848 /usr/sbin/ntpd -p /var/run/ntpd.pid -g -u 103:105
 0.5  0.0  1324 119880 rsyslogd -c4
 0.4  0.0  1084  49308 /usr/sbin/sshd
 0.4  0.0  1028  44376 /usr/sbin/exim4 -bd -q30m
 0.3  0.0   904   6876 ps -eo pmem,pcpu,rss,vsize,args
 0.3  0.0   888  21124 cron
 0.3  0.0   868  23472 dbus-daemon --system --fork
 0.2  0.0   732  19624 -bash
 0.2  0.0   628   6128 /sbin/getty -8 38400 tty1
 0.2  0.0   628  16952 upstart-udev-bridge --daemon
 0.2  0.0   564  16800 udevd --daemon
 0.2  0.0   552  16796 udevd --daemon
 0.2  0.0   548  16796 udevd --daemon
 0.0  0.0     0      0 [xenwatch]
 0.0  0.0     0      0 [xenbus]
 0.0  0.0     0      0 [sync_supers]
 0.0  0.0     0      0 [netns]
 0.0  0.0     0      0 [migration/3]
 0.0  0.0     0      0 [migration/2]
 0.0  0.0     0      0 [migration/1]
 0.0  0.0     0      0 [migration/0]
 0.0  0.0     0      0 [kthreadd]
 0.0  0.0     0      0 [kswapd0]
 0.0  0.0     0      0 [kstriped]
 0.0  0.0     0      0 [ksoftirqd/3]
 0.0  0.0     0      0 [ksoftirqd/2]
 0.0  0.0     0      0 [ksoftirqd/1]
 0.0  0.0     0      0 [ksoftirqd/0]
 0.0  0.0     0      0 [ksnapd]
 0.0  0.0     0      0 [kseriod]
 0.0  0.0     0      0 [kjournald]
 0.0  0.0     0      0 [khvcd]
 0.0  0.0     0      0 [khelper]
 0.0  0.0     0      0 [kblockd/3]
 0.0  0.0     0      0 [kblockd/2]
 0.0  0.0     0      0 [kblockd/1]
 0.0  0.0     0      0 [kblockd/0]
 0.0  0.0     0      0 [flush-202:1]
 0.0  0.0     0      0 [events/3]
 0.0  0.0     0      0 [events/2]
 0.0  0.0     0      0 [events/1]
 0.0  0.0     0      0 [events/0]
 0.0  0.0     0      0 [crypto/3]
 0.0  0.0     0      0 [crypto/2]
 0.0  0.0     0      0 [crypto/1]
 0.0  0.0     0      0 [crypto/0]
 0.0  0.0     0      0 [cpuset]
 0.0  0.0     0      0 [bdi-default]
 0.0  0.0     0      0 [async/mgr]
 0.0  0.0     0      0 [aio/3]
 0.0  0.0     0      0 [aio/2]
 0.0  0.0     0      0 [aio/1]
 0.0  0.0     0      0 [aio/0]

现在,我知道这ps不是查看进程内存使用情况的最佳方式,但这是因为它倾向于报告更多的比实际使用的内存要多...这意味着无论你怎么看,我的所有进程加起来都不应该使用接近 122mb 的内存,即使你考虑到磁盘缓存。

此外,内存使用量一直在增长。我不得不每周重启一次服务器,因为一旦 256mb 内存满了,它就会开始交换,而这不仅仅是磁盘缓存。难道我不应该有办法找到罪魁祸首吗?!

我是服务器管理的新手,所以如果我忽略了一些明显的问题,请向我指出。

为了达到更好的效果,输出cat /proc/meminfo

MemTotal:         251140 kB
MemFree:          124604 kB
Buffers:           20536 kB
Cached:            66136 kB
SwapCached:            0 kB
Active:            65004 kB
Inactive:          37576 kB
Active(anon):      15932 kB
Inactive(anon):      164 kB
Active(file):      49072 kB
Inactive(file):    37412 kB
Unevictable:           0 kB
Mlocked:               0 kB
SwapTotal:        524284 kB
SwapFree:         524284 kB
Dirty:                 8 kB
Writeback:             0 kB
AnonPages:         15916 kB
Mapped:            10668 kB
Shmem:               188 kB
Slab:              18604 kB
SReclaimable:      10088 kB
SUnreclaim:         8516 kB
KernelStack:         536 kB
PageTables:         1444 kB
NFS_Unstable:          0 kB
Bounce:                0 kB
WritebackTmp:          0 kB
CommitLimit:      649852 kB
Committed_AS:      64224 kB
VmallocTotal:   34359738367 kB
VmallocUsed:         752 kB
VmallocChunk:   34359737600 kB
DirectMap4k:      262144 kB
DirectMap2M:           0 kB

编辑:我一开始误解了 的意思free -m。但即便如此:重要的是,如果我不重新启动服务器,我的操作系统最终会开始使用交换内存,而磁盘缓存则不会这样做。那么我在哪里可以查看使用了所有这些内存的内容?

答案1

正如其他人所解释的那样,没有什么现在占用大量内存。ps当您实际遇到问题时,请尝试运行该命令。

最有可能的是 Node.js、Redis 或其他服务配置得不太好,随着流量的增加,会占用更多 RAM,或者在 Slashdotted 时突然占用过多 RAM。但无法说清楚到底出了什么问题之后当一切顺利的时候现在

答案2

真正的问题是由于交换文件太大而需要重新启动,对吗?

据我所知,当内核内存不足时,它有两种选择:

  1. 换出
  2. 消耗一些“缓存”(当然,它一直在囤积缓存数据,希望再次请求缓存数据)

你是否尝试过通过玩交换性

将其设置为较低的值(20?)可能会帮助您改善情况。默认值为 60(倾向于交换)。

再说一次,您是管理员,我是普通用户,也许您已经尝试过了。

答案3

内存可用空间减少是正常的,因为其中一部分用于缓冲区/缓存。您的交换区有所有可用空间。所以我希望您仍然不会受到内存短缺的影响。

从缓冲区/缓存输出来看,206M 可供应用程序免费使用。

您还可以从中获得近似值

cat /proc/[进程 ID]/maps

(或者)

pmap [进程 ID]

pmap -x [进程 ID]

相关内容