我正在查看 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
如果我可以提供任何额外的信息来帮助回答这个问题,我会很乐意这样做。如果问题在某种程度上很奇怪,请告诉我我很乐意解决等问题。
显然,如果你正在积极交换,你有太多。交换使用并不意味着您正在积极交换。交换 I/O 意味着您正在主动交换。
但是,主动交换并不是过度使用应用程序内存对您造成伤害的唯一方式。应用程序正在使用的每一字节内存都是不能用作磁盘缓存的内存字节。如果您的应用程序与磁盘的接触不多,这无关紧要。但如果这样做,即使没有交换,您也会因为缓存命中率低而遭受非常差的性能。
首先要看的是有多少内存可用或用作缓存。如果那太低,那么你就有交换的风险。在本例中,大约为 400MB。所以你没有交换的风险。
第二件要看的事情是磁盘缓存是否适合您的应用程序。一个棘手的问题是是否将空闲内存计为磁盘缓存的一部分。在您的情况下,内存流失可能需要可用内存。也就是说,它不能用作磁盘缓存,因为随着应用程序内存使用量的增加和减少,缓存会不断受到挤压。所以你的磁盘缓存大约是 200MB。
这是否足够取决于您的应用程序如何使用磁盘。但如果不是这样,就会出现磁盘 I/O 过多和性能低下的问题。
您应该检查文件 /proc/meminfo。它包含您正在寻找的内容的详细答案。请记住,缓存和缓冲区本质上是空闲内存,缓存中的脏页除外。
当从磁盘读取文件时,它被缓存到内存中。系统中存在同一个文件的两个副本,一个在缓存中,另一个在磁盘中。因此,当需要回收内存时,清理缓存比清理 slab 内存或交换更容易。
在您的场景中,有一点交换。交换还不错,除非到了颠簸的地步。您似乎没有内存资源紧缩,如果您可以在系统使用率处于最高水平时捕获系统的 /proc/meminfo 输出和体系结构,那将会很好。
根据您的指示,我看到了一些交换的证据,但在快照中不是很高。我可能会停在您当前使用的设置上,然后退后一点。您真正想要避免的一件事是交换,这基本上表明内存耗尽。