пятница, 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. Анонимный2 июля 2013 г., 2:14

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

      Удалить