Как да открием изтичане на памет в Ubuntu



Опитайте Нашия Инструмент За Премахване На Проблемите

Има няколко причини изтичане на памет в Ubuntu, но за щастие е очевидно кога се случват. Кодът за бъги често е най-голямата причина, тъй като програмистите може да не са имали възможност да проверят дали паметта, която вече не е необходима, ще бъде освободена. Ако сте инсталирали нестабилни пакети или сте компилирали код от източник, може би по тази причина имате работа с изтичане на памет. Вероятно ще започнете да ги забелязвате, защото софтуерните пакети за приложения започват да се оплакват от липса на памет, когато имате инсталирана повече от достатъчно физическа RAM.



Ако се притеснявате за изтичане на памет, опитайте да въведете многократно безплатно в терминал. Ако изведнъж започнете да виждате как бързо се използва RAM, значи вече сте открили изтичане на памет. Ако получите грешка, която чете нещо като bash: Няма достатъчно памет, докато правите това и нямате нищо друго освен терминал или дори просто отворена виртуална конзола, тогава почти без съмнение имате работа с такъв. Някои изтичания на памет могат да бъдат малко по-фини, но Ubuntu и това са различни отделни функции и инструменти и пакети, които могат да ви помогнат да ги откриете.



Откриване на изтичане на памет в Ubuntu

Тъй като инструментите, използвани за откриване на изтичане на памет, се базират предимно на подканата на CLI, няма значение на коя версия на Ubuntu ги използвате. Те трябва да работят добре в Unity терминал в обикновения Ubuntu, от виртуална конзола в Ubuntu Server, от lxterm в Lubuntu, Konsole в Kubuntu или дори вътре в Xfce в Xubuntu. Опитайте да изпълните проста задача като sudo -s и въведете паролата си, за да започнете.



Това трябва да ви донесе коренна черупка, ако се изпълнява правилно, но може да причини грешка в паметта, ако работите с теч, който вече е отишъл твърде далеч. Ако наистина имате достъп до коренна черупка, опитайте да въведете echo 3> / proc / sys / m / drop_caches, натиснете клавиша enter и след това напишете exit. Опитайте отново да стартирате free или free -m, за да видите дали това е помогнало за освобождаването на паметта.

Някои програмисти твърдят, че няма смисъл да принуждавате ядрото да отпада кешовете си, тъй като те трябва да бъдат изчистени и по този начин да бъдат възстановени веднага щом е необходима допълнителна физическа памет. Въпреки това, докато силното промиване на тези кешове ще навреди на производителността на системата, имайте предвид, че това е просто тест. След като рестартирате системата, ядрото на Linux трябва отново да събере кешовете на паметта така, както са били на първо място.

Няколко души предложиха да добавите синхронизирането на линията; sudo echo 3> / proc / sys / vm / drop_caches към скрипт, който cron работи последователно, но това на първо място нарушава целта на кеширането на паметта. Свободната памет сама по себе си е просто неизползвана RAM и това означава, че данните трябва да се зареждат от много по-бавноелектромеханичен или NAND устройства за съхранение. Без значение колко бързи са тези устройства, те не са толкова бързи, колкото е RAM, което означава, че докато трябва да отстранявате изтичане на памет, всъщност не бива да се намесвате в кеш системата, след като я настроите на оптималната настройка.



Ако сте решили, че наистина имате постоянно изтичане на памет, което се случва периодично, докато използвате машината си и то не може да бъде стеснено конкретно, но все пак имате достъп до CLI, опитайте да изпълните командата top. Това трябва да ви даде списък на работещите процеси.

Ако Ubuntu ви даде необичайна грешка за top, вместо това опитайте да издадете busybox top, за да получите достъп до още по-опростена версия на тази програма. След като имате списък, погледнете% MEM или подобна колона, за да видите на кои приложения е присвоено най-много памет. Въпреки че можете да отбележите PID и да издадете команда за убиване на точния номер на PID, това просто ще принуди приложението да се затвори. Паметта, която те използват, все още може да не бъде освободена, след като направите това, въпреки че разбира се си струва да се изстреля.

Ако намерите приложение, което използва голямо количество памет, натиснете q, за да излезете и след това опитайте да убиете #### с PID номера от предишния екран. Системните процеси не трябва да се убиват по този начин, нито трябва да работи нещо, в което сте запазили нещата. Помислете за това подобно на убиването на нещо със списъка със задачи Ctrl + Alt + Del, който можете да използвате и за същия процес.

Когато намерите програма, с която това постоянно се случва, можете да я конфигурирате, за да предотвратите поведението в бъдеще. Всяка отделна програма, разбира се, ще се нуждае от различен ресурс, който е извън задачата само да открие изтичане на памет.

Ако не сте само приложения за отстраняване на неизправности, но също така всъщност работите с код, има няколко други ресурси, които имате. Ubuntu и неговите производни ви предлагат програмите membarrier, memusage и memusagestat C за програмиране.

Просто използвайте man membarrier, man memusage или man memusagestat, за да видите страниците на Ръководството на Linux Programmer за тези важни съчетания. Ако има надстройки в бъдещите версии на библиотеките, тъй като излизат нови версии на Ubuntu, промените винаги ще бъдат очертани тук.

Ако имате нужда от графично съдържание, тогава memusagestat дори предлага опцията за запазване на графично представяне на използването на паметта в PNG файл. Това го прави привлекателна функция и за авторите на помощни програми, тъй като може да се използва за създаване на приложения, които редовно проверяват за изтичане на памет.

Може също да пожелаете да инсталирате memprof, който е инструмент за профилиране на използването на паметта, за да ви помогне да откриете изтичане на памет. Той генерира профил относно това колко памет отделя всяка функция в програма, която пишете. Той може също да сканира съществуваща памет, за да намери блокове, които са били разпределени, но вече не съдържат истински препратки. Той прави това чрез предварително зареждане на библиотека, за да замени функциите за разпределение на паметта на стандартната библиотека C.

Ако планирате да използвате това, не забравяйте да премахнете реда за включване memprof от началото на вашия код, преди да го пуснете. Това се използва, за да сте сигурни, че нямате течове, но не трябва да се превръща в зависимост, ако опаковате кода си и го пуснете в хранилище.

4 минути четене