Linux下无法正确显示内存使用情况

Linux下无法正确显示内存使用情况

我买了 VPS,上面安装了 ubuntu。我安装了 apache 作为辅助角色(不是 prefork),还安装了 ruby​​ EE 1.8.7 和 mysql 5.x

现在,当我检查内存时,我发现机架使用了 18.6%(共 924 MB)(一定是我正在运行的 rails 应用程序)

当我执行 free -m 时,我得到以下结果:

             total       used       free     shared    buffers     cached
Mem:           924        602        322          0          0          0
-/+ buffers/cache:        602        322
Swap:            0          0          0

我的内存用在哪儿了?free -m 显示所有使用的内存都是我的缓存,没有其他的,这是怎么回事?到目前为止,我的网站还没有任何用户。

除了 rack 的 18.6% 和 mysql 的 2.6% 之外,AUX 没有显示任何有趣的内容。

一旦我关闭 Apache 实例,内存就会降至 150 MB。

已加载的 Apache 模块列表:

 core_module (static)
 log_config_module (static)
 logio_module (static)
 mpm_worker_module (static)
 http_module (static)
 so_module (static)
 alias_module (shared)
 auth_basic_module (shared)
 authn_file_module (shared)
 authz_default_module (shared)
 authz_groupfile_module (shared)
 authz_host_module (shared)
 authz_user_module (shared)
 autoindex_module (shared)
 cgid_module (shared)
 deflate_module (shared)
 dir_module (shared)
 env_module (shared)
 mime_module (shared)
 negotiation_module (shared)
 reqtimeout_module (shared)
 rewrite_module (shared)
 setenvif_module (shared)
 status_module (shared)
 passenger_module (shared)

这是猫的结果/proc/meminfo

MemTotal:       946344 kB
MemFree:        336624 kB
Buffers:             0 kB
Cached:              0 kB
SwapCached:          0 kB
Active:              0 kB
Inactive:            0 kB
HighTotal:           0 kB
HighFree:            0 kB
LowTotal:       946344 kB
LowFree:        336624 kB
SwapTotal:           0 kB
SwapFree:            0 kB
Dirty:               0 kB
Writeback:           0 kB
AnonPages:           0 kB
Mapped:              0 kB
Slab:                0 kB
PageTables:          0 kB
NFS_Unstable:        0 kB
Bounce:              0 kB
CommitLimit:         0 kB
Committed_AS:        0 kB
VmallocTotal:        0 kB
VmallocUsed:         0 kB
VmallocChunk:        0 kB
HugePages_Total:     0
HugePages_Free:      0
HugePages_Rsvd:      0
Hugepagesize:     2048 kB

答案1

您所看到的行为有几个原因。首先:

  • ps aux 的 % 基于常驻:

    %mem       %MEM    ratio of the process's resident set size  to the physical memory on the machine, expressed as a percentage. (alias pmem).
    
  • 在显示值时,free 的报告包括活动内存(ps 中的常驻/%MEM)以外的内容

要点是,当您查看空闲空间时,您会看到在显示总数时 VSZ 和其他分配被加在一起。当您查看 ps 中的 % 时,您只看到了拼图的一小部分。

为了验证这一点,你可以看看两件事,首先运行:

$ ps aux
USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
www      18442  0.0  0.0 519156 65460 ?        Sl   Sep08   1:47 httpd

您应该看到 VSZ 将比 RSS 大得多,并且如果您进行计算,则可能会得出更大的 % (如果包括在内)。

其次,您可以通过直接查看 /proc/meminfo 来检查实际使用的内存量:

# cat /proc/meminfo 
MemTotal:       99197880 kB
MemFree:        72697684 kB
Buffers:        13813488 kB
Cached:          4841820 kB
SwapCached:          196 kB
Active:          4662952 kB
...

您会注意到,免费的“已使用”列不仅仅是活动(大致是来自 ps 的 RSS)。

关于为什么会出现这种情况的实际解释实际上在几本书中都有介绍,如果你想入睡的话,这些书是非常好的书,但是你可以从几篇文章中获得一些基本的了解:

记忆信息: http://www.redhat.com/advice/tips/meminfo.html

ps/virtual 和 VSZ 解释: http://virtualthreads.blogspot.com/2006/02/understanding-memory-usage-on-linux.html

答案2

如果关闭 Apache 会释放 450mb(大约一半的内存),那么就开始查看 Apache。查看它在启动时加载的模块、任何相关环境以及响应请求所消耗的任何内存。您的应用程序中可能存在占用内存较多或内存泄漏的模块。还要查看启动时的工作程序数量和工作程序池大小。

相关内容