пятница, 19 февраля 2010 г.

Как уменьшить расход памяти: метод шоковой терапии

Легко и быстро, сам того не ожидая, я уменьшил расход памяти почти в два раза. Предупреждаю сразу: я не знаю как это работает! Но это сработало. С вашей помощью хотелось бы разобраться.

Моя машинка имеет 1ГБ памяти. Недавно стал осваивать KDE4. Постепенно с ростом количества приложений памяти стало не хватать. Занято до 90%, плюс кеш. Система начала жутко тормозить. Из постоянно запущенного: nepomuk, akonadi, kontact, kopete, skype, choqok, kalarm, konsole, dolphin. Ничего из этого ни заменять, ни выбрасывать мне не хотелось.

Тут я вспомнил, что давно замечал некоторую странность... Один и тот же дистрибутив по-разному расходует память, в зависимости от ее объема. Перезагружаю машину, редактирую команду запуска в grub, добавляя параметр mem=512M, и загружаюсь с половиной памяти. Все загрузилось. И несмотря на то, что у меня нет swap, никаких ошибок не произошло. Система уместилась в отведенной ей памяти, израсходовав все те же 90%. Последним был запущен firefox, после чего все стало невыносимо тормозить. Перезагрузился снова. И - о чудо! Занято 55%, со всеми приложениями. А без входа в KDE - меньше 10%! (а было около 30%) Машина ожила и все летает.

А теперь - внимание! Вопрос: Что собственно произошло? Кто знает? Поделитесь соображениями, в идеале хотелось бы заставить всю систему быть более экономной, вовремя освобождать память, и впредь так не баловаться! :)

Кому это тоже помогло или не помогло - отпишитесь, интересно таки :)

21 комментарий:

  1. ты просто ограничил количество памяти видимое ядру. как я понял
    мне кажется стоило посмотреть, что занимает столько места. Обычно подгружаются куча библиотек, но они не занимают 90% памяти

    ОтветитьУдалить
  2. Ну да, ограничил, это понятно. Но расход-то после этого уменьшился, когда перезагрузился в нормальном режиме. Почему так? Такое ощущение, как буд-то ядро запоминает часто используемые библиотеки и заранее их подргужает.

    Смотреть-то смотрел, вот только ничего не увидел. Куча процессов, всем понемножку - ничего особенного, никто из толпы не выделялся.

    ОтветитьУдалить
  3. у меня тоже под 95%, но именно процессами кушается 60% остальное кэш
    free -o
    total used free shared buffers cached
    Mem: 1026292 993956 32336 0 25568 360204
    это нормальная работа с памятью

    можно кэш конечно сбрасывать,
    http://www.opennet.ru/tips/info/1455.shtml

    + я точно видел есть параметр, управляющий максимальным заполняемостью памяти

    ОтветитьУдалить
  4. Нет, речь не про кеш, а именно про то что процессы отъедает. Кеш у меня обычно забирает почти все остальное, но это только улучшает производительность, а не наоборот.

    ОтветитьУдалить
  5. в кде4 помимо этого запущен seamonkey где-то с 20 вкладками, gimp, все это хозяйство занимает 250 метров, правда, не дебиан.

    ОтветитьУдалить
  6. Блин, ну сколько раз повторять - память НЕ ВАША, ОНА СИСТЕМНАЯ!!!
    А то что те, о ком мы не говорим не умеют ее эффективно расходовать постоянно держа кучу памяти в состоянии Free - это их проблемы.
    Linux (да и любой UNIX) будет работать ВСЕГДА со всей доступной памятью. И это не баг - это фича. И прекратите мешать системе работать.

    ОтветитьУдалить
  7. Блин, ну как так? 250 метров!!.... Я тоже так хочу :) А какой у Вас дистрибутив?

    MinimumLaw, Вы, видимо, невнимательно прочитали. Еще раз объясняю. У меня сильно тормозит компьютер! Я не имею возможности запустить ни gimp, ни eclipse, потому что система перестает откликаться. Я даже с firefox не могу комфортно работать. А когда заставил систему экономнее расходовать память - все пошло как по маслу.

    Поэтому со всей ответственностью заявляю. Компьютер - мой! И память - моя! И если система не умеет эффективно работать с моей памятью, то я буду бить ее по рукам и учить, как это нужно делать! :)

    Я не против того, чтобы система расходовала всю имеющуюся память. Только в том случае, если она также умело будет особождать ее при первой надобности. Поэтому я хочу либо научить ее освобождать, либо, по крайней мере, заставить ее более экономно относить к памяти. Либо еще что-то, что мне посоветуют - не знаю... В общем, томроза меня не устраивают! И все тут :)

    ОтветитьУдалить
  8. Попробуйте всё же использовать swap.
    У меня на ноуте 4 гига оперативки, а вот как она расходуется:
    Mem: 4052016k total, 3786400k used, 265616k free, 155032k buffers
    Swap: 4000176k total, 193852k used, 3806324k free, 1514228k cached
    Из тяжёлых приложений KDE4, FF(с FireBug), Chromium (с кучей вкладок), Netbeans, Amarok.

    Само-собой система не выключается, а только ставится в ждущий режим (перегружается только при обновлении ядра). Поэтому в только что загруженной системе расход будет совсем другой. Вы видите, что система под кеш юзает 1.5 гига? И при этом 190М выкинуто в свап. А потому, что эти либы(которые в свапе) нигде, кроме как загрузки. не используются

    ОтветитьУдалить
  9. Я бы добавил swap с удовольствием. Только у меня не винт, а SSD. Поговаривают, swap убивает карточку за несколько месяцев.

    ОтветитьУдалить
  10. Поставил KDE-4.4, сначала потреблялось много памяти - при двух залогиненных пользователях, kopete и firefox

    через некоторое время потребление памяти уменьшилось. само.

    например плазма сначала жрала почти 100 мегов, потом 25

    поробуйте ка переместить куданибудь все настройки или добавить нового пользователя и при этом запустить KDE4.4 с 512 мегами памяти

    ОтветитьУдалить
  11. Моя версия такова. Операвтивная память используется совместно операционной системой и видеокартой. Последняя использует свою часть в качестве видеопамяти и отрезает ее себе без участия ОС. В свою очередь ОС в силу каких-то причин (видеодрайвер?) не понимает этого и использует всю память в своих целях, оставляя для видеокарты слишком мало, что и вызывает тормоза. Уменьшив количество памяти, которое видит ОС, ты тем самым даешь больше свободы видеокарте и тормоза пропадают.
    Это, конечно, не объясняет всех изменений, но другой версии у меня нет :)

    ОтветитьУдалить
  12. наскреб на коленках ...

    ps aux --sort rss | awk '{s += $6}{if($6 > 1024) print $1"\t\t"$6"\t\t"$11} END {print "Total use memory:" s" byte"}' | less

    А там и смотрите кто вас так сильно зажимает. Имхо, нездоровая ситуевина какая та у Вас ...

    ОтветитьУдалить
  13. Сейчас память опять стала куда-то уходить. Предложенная Вами команда выводит примерно следующее:

    artem 3452 kdeinit4:
    artem 3520 /usr/lib/kde4/libexec/kpackagekitsmarticon
    artem 3540 /usr/bin/akonadi_vcard_resource
    artem 3568 /usr/bin/akonadi_vcard_resource
    root 3604 kdeinit4:
    artem 3672 kdeinit4:
    artem 3676 /usr/bin/akonadi_ical_resource
    artem 3688 /usr/bin/akonadi_ical_resource
    root 3688 kdeinit4:
    artem 3696 /usr/bin/akonadi_ical_resource
    artem 3976 /usr/bin/nepomukservicestub
    artem 4028 kdeinit4:
    artem 4284 akonadiserver
    artem 4560 kdeinit4:
    artem 4632 kdeinit4:
    artem 4716 /usr/bin/nepomukservicestub
    artem 4816 kdeinit4:
    artem 4904 kdeinit4:
    artem 5368 kdeinit4:
    artem 5560 kdeinit4:
    artem 6092 /usr/bin/korgac
    artem 6244 kdeinit4:
    artem 6384 kdeinit4:
    artem 6388 /usr/bin/nepomukservicestub
    artem 7200 kdeinit4:
    artem 7792 kdeinit4:
    artem 7868 kdeinit4:
    artem 7868 kdeinit4:
    artem 7868 kdeinit4:
    artem 7868 kdeinit4:
    artem 7868 kdeinit4:
    artem 7868 kdeinit4:
    artem 7868 kdeinit4:
    artem 7872 kdeinit4:
    artem 7872 kdeinit4:
    artem 7876 kdeinit4:
    artem 7892 kdeinit4:
    artem 7896 kdeinit4:
    artem 7900 kdeinit4:
    artem 8056 /usr/bin/knetworkmanager
    artem 8068 kdeinit4:
    artem 10376 kdeinit4:
    artem 10784 /usr/bin/choqok
    artem 11892 python
    artem 12768 kdeinit4:
    artem 14552 kwin
    mysql 14608 /usr/sbin/mysqld
    artem 15076 python
    artem 18044 /usr/bin/kalarm
    artem 20000 kdeinit4:
    artem 20112 /usr/sbin/mysqld-akonadi
    artem 20488 /bin/bash
    artem 24464 krunner
    artem 27160 /usr/bin/dolphin
    artem 27668 /usr/lib/virtuoso/virtuoso-t
    artem 32008 /usr/bin/knotify4
    artem 40556 kdeinit4:
    root 42680 /usr/bin/X
    artem 44464 skype
    artem 55436 /usr/bin/kopete
    artem 56120 /usr/bin/kontact
    artem 101780 /usr/lib/firefox-3.5.8/firefox
    Total use memory:1035728 byte

    ОтветитьУдалить
  14. Походу это kdeinit4 поедает всю память.

    $ ps aux --sort rss | grep kdeinit4 | awk '{s += $6}END {print "Total use memory:" s" byte"}'
    Total use memory:298544 byte

    Но пока не нашел никакой информации об этом.

    ОтветитьУдалить
  15. После перезапуска - еще лучше:

    $ ps aux --sort rss | grep kdeinit4 | awk '{s += $6}END {print "Total use memory:" s" byte"}'
    Total use memory:583016 byte

    Хотя, общая загрузка памяти меньше...
    Это какие-то мифические числа. Все не то.

    ОтветитьУдалить
  16. Здравствуйте, Артем! Сталкивался как-то с похожей ситуацией под Gnome. Проблема была c NetworkManager, данная утилита очень сильно отъедала память. Мониторинг проводил визуально, через top с сортировкой по использованию памяти (^+M). Еще слышал, что top и ps не показывают реальную картину выделенной памяти на приложение, а зачастую завышают цифру, суммируя совместно используемые библиотеки приложениями. Для получения точных результатов рекомендуют использовать exmap. Думаю вам должен помочь top или atop. ;)

    ОтветитьУдалить
  17. Спасибо. Я сейчас подозреваю nepomuk и/или akonadi. Первый отключил, без второго, к сожалению, не работает kmail. Память пока утекает.

    ОтветитьУдалить
  18. Если SWAP не подключен, то приложение которое злоупотребляет ресурсами, при недостатке памяти будет отстрелено ядром, в syslog или message будет внесена информация от kernal о злоупотребляющем процессе. Отстрел процесса может продолжаться довольно долго от 1-3 ч. при этом система будет отвечать только на ping, если есть время - поэкспериментируйте. У меня такая картина наблюдалась на продакшен серверах.

    ОтветитьУдалить
  19. besso@maiden:~$ sysctl vm.swappiness
    vm.swappiness = 60
    а у тебя?

    ОтветитьУдалить
  20. $ sysctl vm.swappiness
    vm.swappiness = 10

    Но мне кажется, это не имеет значения.

    ОтветитьУдалить
    Ответы
    1. XD что называется лучше поздно чем никогда. Значение этого параметра указывает на то,что при загрузке памяти на 10 все что добавляется уходит в своп,а так как его нету-глюк

      Удалить