缓冲区/缓存溢出 Ubuntu 10.04 LTS Xen Rackspace

缓冲区/缓存溢出 Ubuntu 10.04 LTS Xen Rackspace

我在跑:

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

相关内容