我正在查看 Rails 应用程序的内存使用情况(它通过 Resque 使用后台进程),并且由于“多少个工作者太多”这个问题的常见答案是“测试并查看”,我运行了一些内存命令,想知道是否有人可以帮助确定内存使用量是否已经足够高,或者我仍然可以添加一些额外的工作者。
所以(这都是在最大负载下):
$ free -t -m
total used free shared buffers cached
Mem: 1756 1532 223 0 12 229
-/+ buffers/cache: 1291 464
Swap: 895 10 885
Total: 2652 1543 1108
$ vmstat
procs -----------memory---------- ---swap-- -----io---- -system-- ----cpu----
r b swpd free buff cache si so bi bo in cs us sy id wa
0 0 10588 156172 13400 326476 1 6 4 0 5 4 1 0 99 0
如果我可以提供任何额外的信息来帮助回答这个问题,我很乐意这样做。如果问题在某种程度上很奇怪,请告诉我,我很乐意修复等等。
答案1
显然,如果你正在积极交换,那么你就有太多了。交换用法并不意味着您正在主动交换。交换 I/O 意味着您正在主动交换。
但是,主动交换并不是应用程序内存使用过多会对您造成损害的唯一原因。应用程序主动使用的每个内存字节都是不能用作磁盘缓存的一个内存字节。如果您的应用程序不经常接触磁盘,那么这不会有什么问题。但是如果接触磁盘,即使没有交换,由于缓存命中率低,您的性能也会非常差。
首先要查看有多少内存是空闲的或被用作缓存的。如果内存太少,则存在交换风险。在本例中,大约是 400MB。因此不存在交换风险。
第二件要考虑的事情是磁盘缓存是否适合您的应用程序。一个棘手的问题是是否将可用内存计入磁盘缓存的一部分。就您而言,可用内存可能需要用于内存流失。也就是说,它不能用作磁盘缓存,因为随着应用程序内存使用量的增加和减少,缓存会不断受到挤压。因此您的磁盘缓存大约为 200MB。
这是否足够取决于您的应用程序如何使用磁盘。但如果不够,则会导致过多的磁盘 I/O 和糟糕的性能。
答案2
您应该检查文件 /proc/meminfo。它包含您要查找的内容的详细答案。请记住,缓存和缓冲区本质上是可用内存,除非缓存中有脏页。
当文件从磁盘读取时,它会被缓存到内存中。系统中存在同一个文件的两个副本,一个在缓存中,另一个在磁盘中。因此,当需要回收内存时,清理缓存比清理 slab 内存或交换区更容易。
在您的场景中,有少量交换。除非出现系统抖动的情况,否则交换并不坏。您似乎没有内存资源紧缺的情况,如果您能在系统使用率达到最高水平时捕获 /proc/meminfo 输出和系统架构,那就太好了。
答案3
从您指出的情况来看,我看到了一点交换迹象,但在快照中不是很高。我可能会停在您当前使用的设置上,然后稍微后退一点。您真正想要避免的一件事是交换,这基本上表明内存耗尽。