Ниско използване на RAM + често разпределяне/отделяне кара Linux да разменя други програми [затворено]

програмата, върху която работя в момента, обработва голямо количество данни (>32GB). Поради "тръбопровода" обаче максимум около 600 MB присъстват в основната памет във всеки даден момент (проверих това, това работи по план).

Ако обаче програмата е приключила и аз се върна обратно към работното пространство с отворен Firefox, например (но също и други), отнема известно време, докато мога да я използвам отново (също така HDD е силно активен за известно време). Този факт ме кара да се чудя дали Linux (операционната система, която използвам) заменя други програми, докато моята програма работи и защо?

Имам инсталирани 4 GB RAM на моята машина и докато програмата ми е активна, тя никога не надвишава 2 GB използване.

Моята програма разпределя/освобождава само динамична памет само с два различни размера. 32 и 64 MB парчета. Написано е на C++ и аз използвам new и delete. Трябва ли Linux да не е достатъчно интелигентен, за да използва повторно тези блокове, след като ги освободя и оставя другата си памет недокосната?

Защо Linux изхвърля моите неща от паметта? Това някакъв друг ефект ли е, който не съм обмислил? Мога ли да заобиколя този проблем, без да пиша персонализирана система за управление на паметта?


person Lazarus535    schedule 16.03.2015    source източник
comment
Ако правите файлов I/O, операционната система ще се опита да кешира вашите файлови данни, а старите програмни данни са по-малко важни за поддържане в паметта, което вероятно е това, което виждате, а не нещо общо с разпределенията.   -  person Mats Petersson    schedule 17.03.2015
comment
Освен ако не сте претоварили new и delete, за да прескочите внедряването на диспечера на купчината на компилатора, диспечерът на купчината на компилатора е този, който контролира вътрешната работа на това как вашето приложение взаимодейства с операционната система спрямо. управление на паметта, а не директно new и delete.   -  person PaulMcKenzie    schedule 17.03.2015
comment
Благодаря и на двамата! @Mats Petersson: Да, правя много I/O файлове от HDD. Така че персонализиран мениджър на паметта (използвам повторно блоковете сам) няма да е от полза? Мога ли да деактивирам това поведение, като кажа на Linux, че не трябва да съхранява прочетените файлове в паметта?   -  person Lazarus535    schedule 17.03.2015
comment
@PaulMcKenzie: Думата, която бих използвал, е new и delete на библиотеката за изпълнение на C++, а не тази на компилатора. И най-вероятно библиотеката за изпълнение ще използва повторно блокове - ако не го направи, ще видите увеличение на използването на паметта!   -  person Mats Petersson    schedule 17.03.2015
comment
@Lazarus535: Има редица регулируеми параметри, които могат да бъдат конфигурирани в Linux. Не съм сигурен точно кои трябва да настроите, за да подобрите това, вероятно ще засегнете НЕЩО друго (напр. firefox също ще бъде по-бавен), така че не е просто да промените параметър X на 28 вместо 42. Ето нещо, което току-що намерих в гугъл за настройките на кеша, опитвайки се да постигнете ПРОТИВНОТО на това, което правите, той показва какви са някои от настройките, с връзки към обяснение. unix.stackexchange.com/questions/30286/   -  person Mats Petersson    schedule 17.03.2015
comment
Предлагам ви да започнете с команда vmstat 1, за да потвърдите вашите предположения. Обърнете внимание на si и so колони, които са свързани с размяна на четене/запис.   -  person myaut    schedule 17.03.2015
comment
Звучи сякаш някой трябва да научи за posix_fadvise.   -  person David Schwartz    schedule 17.03.2015


Отговори (2)


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

Можете да направите това директно с API на linux, но ви предлагам да използвате библиотека като Boost ASIO. Ако вашият софтуер е обвързан с I/O, трябва допълнително да използвате асинхронен I/O, за да подобрите производителността.

person Sophit    schedule 16.03.2015
comment
Без кеширане вашият софтуер може да работи по-бързо. Може също да работи по-бавно. - person Mooing Duck; 17.03.2015
comment
Все едно дори не си чел какво съм написал. - person Sophit; 17.03.2015
comment
Не, написахте, но само ако не е необходимо да презареждате същите данни по-късно. Без кеширане на файлове може да бъде и по-бавно при много други обичайни обстоятелства. - person Mooing Duck; 17.03.2015
comment
Той обработва › 32 GB данни последователно, използвайки 4 GB RAM. Кеширането би било по-бързо от некеширането в извънредния случай, когато той обработва всеки файл, докато се записва на диска, и само ако може да обработва файлове толкова бързо, колкото са записани. Ако беше вярно, все още щях да се съмнявам дали ще е вярно за бъдещите версии на софтуера. - person Sophit; 17.03.2015
comment
A използвам асинхронен I/O (собствена реализация, но съм доволен от нея:-D). Опитвам се да се придържам към стандартната библиотека с този проект, поради по-късните употреби, при които усилването може да не е лесно достъпно. Използвах boost::asio за друг проект (най-вече работа в мрежа). Така че boost::asio може да предостави независими от платформата флагове за деактивиране на кеширането по независим от платформата начин (важно)? В такъв случай ще обмисля смяна. Мерси. - person Lazarus535; 17.03.2015
comment
›32GB се отнася за входния файл. Така че само четене. Вероятно трябваше да го спомена. Записаният файл (резултат) е доста малък (под 5 MB). - person Lazarus535; 17.03.2015
comment
Винаги съм използвал и собствените си библиотеки. Предполагам, че asio има функцията, но може и да греша. Ако предпочитате, използвайте aio.h директно в linux, за да получите небуферирани асинхронни четения. - person Sophit; 17.03.2015
comment
По-късно програмата ще бъде мултиплатформена. Така че не мога да правя само Linux. И не искам да кодирам специфичен код за платформа :-D. Ще погледна boost...ще видя. - person Lazarus535; 17.03.2015
comment
Може да съм грешал, съдейки по документацията за ASIO, която току-що прегледах, а също и този въпрос. Съжалявам, че нямам друга библиотека, която да предложа. В противен случай оставате да пишете внедряване за всяка платформа. - person Sophit; 17.03.2015

Всички наскоро използвани страници причиняват изстискване на по-стари страници от кеша на диска. В резултат на това, когато се изпълнява друга програма, тя трябва да се върне обратно.

Това, което искате да направите, е да използвате posix_fadvise (или posix_madvise ако картографирате файла в паметта), за да извадите страници, които сте принудили ОС кеш, така че вашата програма да няма огромен кеш отпечатък. Това ще позволи на по-стари страници от други програми да останат в кеша.

person David Schwartz    schedule 17.03.2015
comment
В един момент използвах файлове с карта на паметта. Но ако има повече от един файл за четене паралелно (един индекс от файл един, последван от един индекс в друг файл), linux ще чете само 4K страници наведнъж за всеки файл, което основно осакатява I/O производителността (поне за мен го направи). Използвах файла с карта за усилване в по-ранна версия. За съжаление НЕ излага флага madvice (или подобен независим от платформата). И както споменахме: НЯМА код за специфична платформа. Иначе хубав отговор. Мерси. - person Lazarus535; 17.03.2015