我在跑:
Ubuntu 10.04 LTS Server AMD64 in a 512MB XEN paravirtualized environment.
lighttpd v1.4.26
PHP v5.3.8
MySQL v5.1.41-3ubuntu12
问题是:
我首先使用“256MB 帐户”,但这是谎言,因为使用 free -m 时,它显示为 245MB。我发现,在启动并运行系统后,内存开始慢慢消失,后来我才知道这是磁盘到内存缓存/缓冲区,但它仍然让我感到紧张,因为它看起来像是内存泄漏。果然,当它达到最大内存时,服务器崩溃了。我想可能是我的代码有问题,或者我使用的是新 PHP 的错误版本。所以我将云大小从 256 更改为 512,这也是谎言,因为它报告为 496MB,然后让它运行。一周后,内存再次填满,服务器崩溃了。
作为参考,我没有使用 drupal 或 php-nuke 或任何预捆绑或臃肿的东西。我尝试强制从最高 PHP v5.3.2 LTS 版本升级到 5.3.8,我的 swappiness 设置为默认值 60。
以下是我现在的记忆:
total used free shared buffers cached
Mem: 496 187 308 0 32 65
-/+ buffers/cache: 89 406
Swap: 1023 0 1023
该网站几乎始终保持在 89MB 的水平,但缓冲区和缓存不断增加。我的解决方法是使用 创建每日 cron echo 3 > /proc/sys/vm/drop_caches
。这已经持续了 3 周,但我担心一旦该网站成为主流,这种黑客方法就会失败。我在这里想问你们这些比我更了解这种情况的人,我下一步该怎么做?
我非常愿意获取您所需的任何数据来帮助诊断这个问题。
我个人认为 XEN 与 Ubuntu 不兼容,因为我的猜测是 XEN 说有 512MB 内存可用,但实际只有 496MB,或者 XEN 说有 16GB 内存可用,因为它对 VM 的分配不正确。不知道如何确认这一点。
答案1
为什么要删除缓冲区和缓存?可用内存是浪费的内存 - 所有现代操作系统(包括 Linux)都会积极地在 RAM 中缓存目录路径、常用文件等内容,因为与硬盘相比,访问 RAM 的速度非常快。
如果某个应用程序突然需要 RAM,则缓存的 RAM 将立即为该应用程序释放。这是一个非常快的操作,不会对性能造成明显的影响。
因此在 Linux 中您实际上是使用 来计算您的可用 RAM total - (free + buffers + cached)
。
答案2
我的直觉是对的!看来我选择的预建 PV 映像没有正确创建 Linux 可以识别和使用的交换分区。因此,在文件缓存填满所有内存后,系统将进入缓存,要么表现得好像有 0MB 交换,要么陷入某种缓存/交换循环中并冻结。
使用 fdisk -l
以下是我研究过的不同文件系统的示例。(PV 代表半虚拟化,HVM 代表完全虚拟化,在 XEN 环境中)
通过 CDROM-ISO 进行自定义/干净的 HVM 安装:
Disk /dev/sda: 16.1 GB, 16106127360 bytes
255 heads, 63 sectors/track, 1958 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x0001d37d
Device Boot Start End Blocks Id System
/dev/sda1 * 1 1871 15021056 83 Linux
/dev/sda2 1871 1958 704513 5 Extended
/dev/sda5 1871 1958 704512 82 Linux swap / Solaris
预建 PV/HVM:
Disk /dev/sda: 16.1 GB, 16106127360 bytes
255 heads, 63 sectors/track, 1958 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x00084eb7
Device Boot Start End Blocks Id System
/dev/sda1 * 1 13 96256 83 Linux
Partition 1 does not end on cylinder boundary.
/dev/sda2 13 75 499712 82 Linux swap / Solaris
Partition 2 does not end on cylinder boundary.
/dev/sda3 75 1958 15130643 83 Linux
失败的 PV:
Disk /dev/sda1: 20.4 GB, 20401094656 bytes
255 heads, 63 sectors/track, 2480 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x00000000
Disk /dev/sda1 doesn't contain a valid partition table
Disk /dev/sda2: 1073 MB, 1073741824 bytes
255 heads, 63 sectors/track, 130 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x00000000
Disk /dev/sda2 doesn't contain a valid partition table