Назад | Перейти на главную страницу

Переполнение буфера / кеша 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

Проблема в следующем:

Сначала я начал с «учетной записи 256 МБ», которая является ложью, поскольку она регистрируется как 245 МБ с использованием параметра free -m. Я обнаружил, что после того, как я запустил систему, память начала медленно исчезать, что, как я позже узнал, было диском в кеш памяти / буфер, но это все равно заставило меня нервничать, так как это выглядело как утечка памяти. Конечно же, когда он достиг максимального объема памяти, сервер упал. Я подумал, что, возможно, что-то не так с моим кодом или что я использую версию нового PHP с ошибками. Поэтому я изменил размер своего облака с 256 на 512, что также является ложью, поскольку оно составляет 496 МБ, и пусть это работает. Через неделю память снова заполнилась и сервер упал.

Для справки, я не использую drupal или php-nuke или что-нибудь предварительно связанное или раздутое. Я попытался выполнить принудительное обновление с максимальной версии PHP v5.3.2 LTS до версии 5.3.8. Для моей подкачки установлено значение по умолчанию 60.

вот моя память, как она сидит сейчас:

        total   used    free    shared  buffers cached
Mem:    496     187     308     0       32      65
-/+     buffers/cache:  89      406
Swap:   1023    0       1023

Сайт почти всегда остается на уровне 89 МБ, но буферы и кэш продолжают расти. мой обходной путь - я создал ежедневный cron с echo 3 > /proc/sys/vm/drop_caches. Это работает уже 3 недели, но меня беспокоит, что, когда сайт станет популярным, этот метод взлома не сработает. Я здесь, чтобы спросить вас, ребята, которые знают об этом сценарии гораздо больше, чем я, что мне делать дальше?

Я полностью готов получить любые данные, которые помогут вам диагностировать это.

Мое личное предчувствие - несовместимость с XEN и Ubuntu, поскольку я предполагаю, что XEN говорит, что есть реальные 512 МБ памяти для использования, когда ее всего 496, или что XEN говорит, что есть 16 ГБ памяти для использования в качестве неправильного пропорционального распределения виртуальной машины. Не знаю, как это подтвердить.

Моя догадка сбылась! Похоже, что предварительно созданный образ PV, который я выбрал, не создал должным образом раздел подкачки, который Linux мог бы идентифицировать и использовать. Таким образом, после того, как файловый кеш заполнил всю память, система перешла в кеш, и либо она действовала так, как будто было 0 МБ подкачки, либо запаниковала и зависла, что-то вроде цикла кеширования / подкачки.

ИСПОЛЬЗУЙТЕ fdisk -l

вот примеры различных файловых систем, которые я исследовал. (PV означает паравиртуализированный, HVM означает полностью виртуализированный в среде XEN)

Пользовательская / чистая установка HVM через CDROM-ISO:

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

Зачем вам отказываться от буферов и кешей? Свободная память - это потраченная впустую память - все современные операционные системы, включая Linux, активно кэшируют такие вещи, как пути к каталогам, активно используемые файлы и т. Д., В ОЗУ, поскольку доступ к ОЗУ безумно быстр по сравнению с жестким диском.

Если какому-либо приложению внезапно потребуется оперативная память, кэшированная оперативная память будет немедленно освобождена для этого приложения. Это очень быстрая операция, не вызывающая заметного снижения производительности.

Итак, в Linux вы фактически рассчитываете свою свободную оперативную память с помощью total - (free + buffers + cached).