我有一个装有 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
真正的问题是由于交换文件太大而需要重新启动,对吗?
据我所知,当内核内存不足时,它有两种选择:
- 换出
- 消耗一些“缓存”(当然,它一直在囤积缓存数据,希望再次请求缓存数据)
你是否尝试过通过玩交换性?
将其设置为较低的值(20?)可能会帮助您改善情况。默认值为 60(倾向于交换)。
再说一次,您是管理员,我是普通用户,也许您已经尝试过了。
答案3
内存可用空间减少是正常的,因为其中一部分用于缓冲区/缓存。您的交换区有所有可用空间。所以我希望您仍然不会受到内存短缺的影响。
从缓冲区/缓存输出来看,206M 可供应用程序免费使用。
您还可以从中获得近似值
cat /proc/[进程 ID]/maps
(或者)
pmap [进程 ID]
pmap -x [进程 ID]