вторник, 15 июня 2010 г.

Укрощение ureadahead

Обнаружил совершенно дурацкий эффект в Ubuntu 10.04. При том, что минимальный заявленый объем оперативной памяти 128MiB, в виртуалке с 256MiB RAM на стадии загрузки регулярно срабатывал oom-killer.

Jun  9 16:51:43 ... kernel: [ 4.550302] kthreadd invoked oom-killer: gfp_mask=0xd0, order=1, oom_adj=0
Jun  9 16:51:43 ... kernel: [ 4.551806] kthreadd cpuset=/ mems_allowed=0
Jun  9 16:51:43 ... kernel: [ 4.555073] Pid: 2, comm: kthreadd Not tainted 2.6.32-22-generic-pae #36-Ubuntu
Jun  9 16:51:43 ... kernel: [ 4.557401] Call Trace:
Jun  9 16:51:43 ... kernel: [ 4.558500]  [] oom_kill_process+0xa4/0x2b0

Чаще всего, oom-killer выносил plymouthd или ureadahead, но иногда под горячую руку попадал hal и udev. Самое смешное, что после завершения загрузки объем занятой памяти составляет 40-60MiB, так что нехватка памяти при загрузке выглядит, как минимум, странно.

Выяснилось, что проблема не нова и достает не только меня (491943). Виноват ureadahead. Видимо, разработчик очень буквально понял документацию. При запуске программа выставляет размер буфера debugfs в 128MiB (точно как в примере из документации). Те самые 128MiB, что указаны в минимальных системных требованиях. Убедиться в этом можно посмотрев содержимое файла /sys/kernel/debug/tracing/buffer_size_kb, после срабатывания oom-killer.

Значение зашито в код, так что единственый способ заткнуть проблему, пеерсобрать ureadahead из исходников.

sudo apt-get build-dep ureadahead
apt-get source ureadahead
# В файле src/trac.c следует найти строку buffer_size_kb и заменить значение
# 128000 на какое-то поменьше (я ограничился 16384).
# После можно собрать пакет и установить его
debian/rules build
fakeroot debian/rules binary
sudo dpkg --install ../ureadahead_0.100.0-4.1_i386.deb

Понятно, что на полноценное решение это не тянет, но как залепуха вполне сгодится.

P.S.Похоже проблему таки добьют в Ubuntu 10.10, также исправление должно войти в Ubuntu 10.04.2. Всего на решение LP#491943 понадобилось около 9 месяцев.

Комментариев нет:

Отправить комментарий