我是 Linux 菜鸟。我在 Ubuntu 11.04 服务器上有一个 256MB 的 VPS,当我运行“free -m”时,结果显示所有内存都在使用中(包括第二行:缓冲区/缓存)。我发现这很奇怪,因为我只有 5 个 Apache 进程在运行,每个进程占用大约 20MB。MYSQL 占用了 30MB。据我所知,根据“top”,我没有其他占用大量内存的进程在运行。
可能相关的设置:
PHP memory_limit = 32M
MYSQL key_buffer = 16M
Prefork MPM Maxclients = 10
因此,当我查看这些设置时,我自然而然地认为 maxclients 太高了,所以我尝试将其切换为 5。现在,不仅我的内存仍然显示为 100% 使用,而且我的网站加载速度要慢得多,尽管目前除了我自己之外没有任何流量。我不明白这一点。我以为单个 Apache 进程会处理在“KeepAliveTimeout”窗口内收到的来自客户端的所有请求,我已将其设置为 2 秒。使用我最初的 10 maxclients 配置,我的页面加载时间约为 0.3 毫秒,因此单个进程应该可以毫无问题地处理,对吗?
因此,接下来我将 maxclients 设置为极端级别 1。我的内存使用率仍为 100%,并且我的网站加载速度非常慢。我是个菜鸟,完全不知道该怎么做。根据我阅读过的许多有关基本服务器设置的教程,我应该可以了。
请帮助!
Edit:
total used free shared buffers cached
Mem: 256 256 0 0 0 0
-/+ buffers/cache: 256 0
Swap: 0 0 0
答案1
这是因为 Linux 使用大部分内存作为缓存,并根据需要将其中的部分返回给您运行的任何应用程序。
所以不要惊慌。你没问题。将 MaxClients 改回默认值。
编辑:看起来您正在 OpenVZ 上运行。请参阅下面的 David Schwartz 回复。
答案2
没有交换,这使得操作系统很难节省物理内存。基本上,它没有地方存放可能永远不会被访问但又无法证明永远不会被访问的数据。所以它别无选择,只能将其保存在 RAM 中。
例如,假设有一个服务在服务器启动时启动,但从未被访问过。它可能链接到一个被重新定位的库。该重新定位会弄脏内存中的代码页。在启动时,它可能会分配一些内存并修改其内容。使用交换,在服务长时间不运行后,或者当内存紧张时,这些页面可以从内存中移出并存储在交换中。(很可能永远不会被检索,但内核不能冒这个险——考虑像这样的服务ssh
!)
如果没有交换,内核就无法清除脏页,即使它们已经好几天没有被访问过。因此宝贵的物理内存就被无用的垃圾填满了。
更新:显然,这是 OpenVZ 的产物。有交换,您看到的内存数字毫无意义。您的性能问题可能是也可能不是由您控制的任何因素造成的。