- lensv
- Medlem ●
- Norrköping
Jag skulle vilja fråga om det finns något sätt att frigöra inaktivt minne i OSX (förutom att starta om datorn)? Mer än hälften av min dators fysiska arbetsminne blir snabbt upptaget av inaktiva "processer" och detta tvingar OS att rel. snart börja swappa till disk (eftersom allt ledigt minne har ätits upp).
När man startar en ny process används ledigt minne, men eftersom allt minne inte används så ofta blir en del inaktivt. Det minnet kan också användas, men det som finns där kan då flyttas ner någon minneshierarki till en långsammare nivå som t. ex. disk. Minnet tillhör fortfarande processen och kan fortfarande användas, därför ligger det kvar så högt som möjligt i minneshierarkin till dess det får ge plats för något annat. Minnet frigörs antingen när processen lämnar ifrån sig minne eller när processen avslutas. Om du absolut vill frigöra visst minne får du avsluta processen, men det är generellt inget som du behöver hålla på med.
Inaktivt och aktivt minne är i princip samma sak, bara att det var en stund sedan det inaktiva minnet användes. Det är alltså inte att likställa med minne som skulle kunna bli ledigt bara sådär. Inaktivt minne tillhör en process och om det förstörs så är det högst troligt att den processen kraschar.
Det är faktiskt helt fel att en process skulle använda både ledigt och inaktivt minne när den startar. Ska det inaktiva minnet från en annan process användas så måste det först swappas ut till hårddisken.
Exempel: En process startar, den behöver 100MB minne. OS X kollar då om det finns 100MB ledigt minne, om det gör det så används 100MB av det lediga minnet. Skulle det däremot inte finnas 100MB ledigt minne så fortsätter OS X och kollar hur mycket inaktivt minne det finns. Säg att vi på det här viset hittar 60MB ledigt och 40MB inaktivt minne som vi vill använda. OS X måste då först spara undan de 40MB inaktivt minne som den vill använda, detta minne används av en annan process. Detta görs genom att flytta dessa 40MB till hårddisken, detta tar tid och leder till kass prestanda.
När processen först har startat så är alla 100MB aktivt minne. Efter en stund däremot så kommer en del av det med stor sannolikhet bli inaktivt, eftersom det inte använts på ett tag. Det betyder inte att det aldrig kommer att behövas i framtiden, så vi måste fortfarande hålla reda på det
Inaktivt minne är inte som de flesta verkar tro, minne som inte används alls. Det är minne som inte använts på ett tag men som kan komma att behövas i framtiden.
Det beror på strukturen i programmen. Det finns massor med kod för att hantera undantag och felsituationer. Denna kod körs sällan eller inte alls men måste ändå finnas där.
Det är faktiskt helt fel att en process skulle använda både ledigt och inaktivt minne när den startar. Ska det inaktiva minnet från en annan process användas så måste det först swappas ut till hårddisken.
Nu måste jag protestera.
Då en process startar kan den använda både ledigt, inaktivt och aktivt minne från andra processer. Det beror på att en stor del av minnet i en process är delat mellan olika processer. De flesta program använder t.ex. frameworks som är gemensamma för många processer.
Detta är en anledning till att inaktivt minne är bra. Det kan innehålla t.ex. delar av ett framework som ingen process alls råkar använda just nu. Men om en process skulle starta som behöver detta framework så ligger delar i minnet redan inlästa. Man sparar då disktrafik. Det hade INTE varit till någon fördel att "rensa" detta minne för att göra det "ledigt".
Om aktivt minne eller inaktivt minne behöver användas ("steal") från någon annan process till ett nytt ändamål är det alls inte säkert att det måste skrivas ut på swapfilen först. Det måste endast ske om detta minnesblock är uppdaterat ("dirty"). Om minnesblocket t.ex. innehåller programkod eller ett framework så behövs inte detta eftersom innehållet ju redan ligger på disk (programfilen). I detta fall kan man använda detta minne i princip lika snabbt som man kan allokera ledigt minne. Och ingen extra disk-access behövs.
Det finns alltså ingen anledning till att "frigöra minne" som tråden handlar om. Det går att åstadkomma, men resultatet blir i så fall att datorn går mycket segare.
Detta är en anledning till att inaktivt minne är bra. Det kan innehålla t.ex. delar av ett framework som ingen process alls råkar använda just nu. Men om en process skulle starta som behöver detta framework så ligger delar i minnet redan inlästa. Man sparar då disktrafik. Det hade INTE varit till någon fördel att "rensa" detta minne för att göra det "ledigt".
Visst. Det finns specialfallet med delat minne men det är inte relevant för diskussionen. Varför? För att operativsystemet inte särbehandlar det. Har det använts nyligen är det aktivt, har det inte använts nyligen så är det inaktivt.
Om aktivt minne eller inaktivt minne behöver användas ("steal") från någon annan process till ett nytt ändamål är det alls inte säkert att det måste skrivas ut på swapfilen först. Det måste endast ske om detta minnesblock är uppdaterat ("dirty"). Om minnesblocket t.ex. innehåller programkod eller ett framework så behövs inte detta eftersom innehållet ju redan ligger på disk (programfilen). I detta fall kan man använda detta minne i princip lika snabbt som man kan allokera ledigt minne. Och ingen extra disk-access behövs.
Visst, det kan vara så att OS X sedan tidigare har kvar en page i swapfilen, om så är fallet och den inte ändrats i RAM så kan man strunta i att skriva ut den.
Att förlita sig på att programfilen ska finnas kvar är inte helt klokt, har visserligen inte tillräckligt med programmeringserfarenhet av OS X för att kunna säga något säkert. Generellt kan man säga att en process innehåller programkoden, data och filhandtag. Man ska alltså inte behöva förlita sig på att den exekverbara filen ska finnas kvar när man en gång startat processen. För frameworks låter ditt resonemang extremt kontraproduktivt. Förstår dock ditt resonemang med att man skulle kunna spara in skrivningen till disk, läsningen blir du däremot inte av med.
EDIT: Man kan se bevis som stödjer detta resonemang om man jämför antalet page ins med page outs i Aktivitetskontroll.
Det finns alltså ingen anledning till att "frigöra minne" som tråden handlar om. Det går att åstadkomma, men resultatet blir i så fall att datorn går mycket segare.
Här håller jag med dig helt, kanske av lite andra orsaker än dig. Det finns ingen poäng med att frigöra minne, minneshanteringen bygger på att det finns inaktivt minne som är förstahandsval när man behöver få plats med något annat.
Det är roligt att folk är intresserade av virtuell minneshantering. För mer information kan jag rekommendera att läsa denna bok (så att man kan förklara så riktigt som möjligt):
Visst. Det finns specialfallet med delat minne men det är inte relevant för diskussionen. Varför? För att operativsystemet inte särbehandlar det. Har det använts nyligen är det aktivt, har det inte använts nyligen så är det inaktivt.
Det är riktigt att OS X inte specialbehandlar delat minne för att avgöra om det skall vara aktivt eller inaktivt. Däremot är hantering av delat minne centralt för förståelsen av VM. OS X försöker ha så mycket delat som möjligt för att spara fysiskt RAM. Det är en viktig orsak till att OS X inte friställer minne då en process är klar med det, eftersom innehållet kan vara intressant för andra processer.
Visst, det kan vara så att OS X sedan tidigare har kvar en page i swapfilen, om så är fallet och den inte ändrats i RAM så kan man strunta i att skriva ut den.
Att förlita sig på att programfilen ska finnas kvar är inte helt klokt, har visserligen inte tillräckligt med programmeringserfarenhet av OS X för att kunna säga något säkert.
Men nu är det så. OS X, Linux och alla moderna UNIX gör normalt paging direkt mot filer som innehåller programkod ("text").
Gå in i terminalen och gör $ man vmmap
Med detta kommando kan du titta på minneskartan för en process och se vad den har mappat in. Du kommer att upptäcka att programkoden i OS X är mappad med COW (Copy-on-write, googla på det!).
Och programfilen kan inte försvinna då filen är inmappad av någon process. Skulle du ta bort filen så försvinner endast entryt i directoryfilen. inoden finns fortfarande kvar tills den inte är refererad längre.
Generellt kan man säga att en process innehåller programkoden, data och filhandtag. Man ska alltså inte behöva förlita sig på att den exekverbara filen ska finnas kvar när man en gång startat processen. För frameworks låter ditt resonemang extremt kontraproduktivt.
Varför är det kontraproduktivt?
Förstår dock ditt resonemang med att man skulle kunna spara in skrivningen till disk, läsningen blir du däremot inte av med.
Huruvida en process som behöver mer minne måste läsa detta från disk (från programfil eller swapfil) beror helt på orsaken till att mer fysiskt minne behövs. I många fall kräver processen nytt rent minne (malloc(), eller mer stack space). I dessa fall allokeras nollställt minne och ingen diskläsning behövs.
Alltså, en process som gjort malloc() och behöver mer minne kan generera en pagefault som stjäler inaktivt minne och använder det som utnollat minne i den nya processen utan att en enda disk I/O behöver göras. Detta går i princip lika fort som om processen hade kunnat använda ledigt minne.
Okej, hur ser jag vilka processer det är som slukar just inaktivt minne?
Inaktivt och aktivt minne är i princip samma sak, bara att det var en stund sedan det inaktiva minnet användes. Det är alltså inte att likställa med minne som skulle kunna bli ledigt bara sådär. Inaktivt minne tillhör en process och om det förstörs så är det högst troligt att den processen kraschar.
Det här kommer upp ibland. Jag har just kollat i Amit Singhs bok.
Den stora skillnaden mellan aktivt och inaktivt minne är att inaktivt minne inte finns inmappat (resident) i adressrymden i någon process (någon pmap). Däremot kan minnet mycket väl finnas i den virtuella adressrymden i en process.
Det som händer är att en process försöker accessa en sida i sin virtuella adressrymd som inte är inmappad. Då får man en page fault. Systemet kollar då om sidan man eftersöker redan finns i minnet (t.ex. i inaktivt minne, men även i aktivt minne (hos en annan process)). Om så är fallet får man en soft fault och behöver endast manipulera processens pagetabell för att kunna fortsätta. Page faulten löses alltså utan diskaktivitet.
Detta är en anledning till att den inaktiva listan finns. Systemet tar ibland sidor från aktivt minne (stjäl sidor från levande processer), mappar ur dem och lägger i den inaktiva kön. Om det visar sig att processen faktiskt använder detta minne kommer det strax att pagefaultas tillbaka. Detta är ett sätt att begränsa mängden RAM en process använder till dess Working Set och att trimma bort minne som inte används (då det börjar tryta om minne i systemet).
Det har alltid funnits program som säger sig snabba upp datorn genom att frigöra minne. Jag har inte riktigt förstått hur det skulle fungera för oanvänt minne är ju onödigt minne. Till och med Microsoft har ju förstått det där med minneshantering och förbättrat den rejält i och med Vista.
Mitt tips är att låta OS X själv sköta minneshanteringen. Annars kan du ju köpa ett sådant där onödigt FreeMEM program typ, http://www.macupdate.com/info.php/id/24279/ifreemem
Det har alltid funnits program som säger sig snabba upp datorn genom att frigöra minne. Jag har inte riktigt förstått hur det skulle fungera för oanvänt minne är ju onödigt minne. Till och med Microsoft har ju förstått det där med minneshantering och förbättrat den rejält i och med Vista.
Mitt tips är att låta OS X själv sköta minneshanteringen. Annars kan du ju köpa ett sådant där onödigt FreeMEM program typ, Download iFreeMem for Mac - Maximize free memory for better application performance. MacUpdate Mac System Software Downloads
Alltså, denna typ av program är helt befängt! Behöver man betala för programmet du länkade till??
Jag har ett gratis för den som vill sabba sitt minnesinnehåll och skaffa ledigt minne:
http://www.99.se/mac-os-x/109180-ledigt-minne-ts.html#post780072
Alltså, denna typ av program är helt befängt! Behöver man betala för programmet du länkade till??
Jag har ett gratis för den som vill sabba sitt minnesinnehåll och skaffa ledigt minne:
http://www.99.se/mac-os-x/109180-ledigt-minne-ts.html#post780072
Jao, 160 spänn!
I alla lägen så verkar inte datorn släppa till inaktivt minne. Vår server (MacPro med 10.4 server) gjorde slut på aktivt minne och då gick kapaciteten ner trots att det fanns inaktivt minne ledigt. Det enda som hjälpte var att starta om den sen gick det några veckor igen. Uppdaterade med ytterligare minne plus att jag skerv in ett kommado i Termnalen som gjorde att kernel task inte kunde låsa upp mer än en viss mängd minne. Det var just Kernel task som låste upp massor med minne.
Nu några uppdateringar senare har detta problem försvunnit helt.
Det pågår snabba utveckling på hårdvarusidan.
Minne är billiga. Flesta kunder köper bärbara Mac med max minne 4 GB !
När jag kollar hur OSX hanterar om man har max minne 4 GB.
Då är det mycket ledigt fysisk minne och OSX envisas lägga en hel del på hårddisk (virtuellt minne) som inaktiv o.s.v.
Hårdvaru utveckling gått så snabb att OSX plötsligt blir gammal att hantera minnena. Att använda virtuellt minne är ett sätt kringgå om man har lite minne. Idag när många vill ha snabb system, så ska OSX INTE hantera virtuellt minne. Det borde finnas inställning att stänga av virtuella minnehanteringen, jag lovar att det blir snabb system ! Gamla system 9:an kunde man stänga av virtuellt minne eller ej. Liksom Windows XP...
Men 4 GB minne kanske inte räcker till om man stänger av virtuella minneshanteringen. Men Mac Pro kan ha 32 GB minne och kommande Macar med mer än 4 GB minne...
Då ser ni hur framtiden ser ut....
Problemet som jag ser det är att den delen av minnet som är inaktivt inte tycks vara speciellt dynamisk. Ett exempel...
Man kör VMware Fusion och har ett antal gäst-OS igång. Stänger man av några av dem stängs även ett par processer, men huvudapplikationen tycks fortsätta att reservera samma mängd minne som tidigare (om det nu är denna som är boven).
Det här tycker jag är bekymmersamt eftersom ett sådant program slukar duktigt med minnesresurser... Jag hade hellre sett att detta inaktiva minne blev ledigt när de virtuella maskinerna stängdes av.
Mac OS X har en något modernare minneshantering än Mac OS 9. Virtuellt minne är inte enbart ett sätt att utöka minneshierarkin till att även innehålla disk, även om det ofta kommer som en direkt följd av det.
Om man har tillräckligt med fysiskt minne får man en god balans där bara aktivt minne ligger i det fysiska minnet och inaktivt ligger någon annanstans. Skulle fysiskt minne bli ledigt finns det dock ingen poäng med att flytta inaktivt minne till det fysiska minnet. Det skulle bara slösa processorcykler att skyffla data fram och tillbaka.
Precis som det redan sagt så är inte virtuellt minne likställt med 'hårddisken används istället för RAM'.
Man kan kolla lite på hur ens Mac använder minnet för tillfället på följande vis.
1) Öppna terminalen (det är ingen fara, den bits inte!)
2) Kör kommandot
top
3) Titta på resultatet som i början ser ut så ungefär så här, det fortsätter med processer (allt uppdateras varje sekund eller så):
Processes: 52 total, 2 running, 50 sleeping... 232 threads 10:48:51 Load Avg: 0.30, 0.42, 0.52 CPU usage: 21.36% user, 7.77% sys, 70.87% idle SharedLibs: num = 2, resident = 92M code, 0 data, 5624K linkedit. MemRegions: num = 7892, resident = 348M + 22M private, 202M shared. PhysMem: 170M wired, 833M active, 260M inactive, 1278M used, 770M free. VM: 4543M + 130M 75076(2) pageins, 0(0) pageouts
Det jag tänkte tipsa om ligger på sista raden. Det står 75076(2) pageins vilket betyder att det har gjorts 75076 pageins, alltså har det 75076 gånger flyttats data från disk till RAM (och nu handlar det inte om att du sparat en textfil eller sånt utan nu gäller det det minneshantering). Detta gjordes 2 gånger under den senaste sekunden. Sen står det också 0(0) pageouts vilket betyder samma sak fast för det omvända, hur många gånger data flyttats från RAM till disk. Här kan vi uttyda att min dator inte flyttat ut något från RAM till disk senaste sekunden (och inte sedan den startades upp senaste gången heller).
Om det inom parenteserna skulle stå siffror runt 20-50 eller så så har man lite problem och skulle behöva mer RAM i sin Mac.
Virtuellt minne har två nackdelar.
Första är att om hårddisk börjar får fel eller hårddisk blir nästan fullt, då skadas data och system. Pga virtuellt minne påverkas. Ibland varnas inte om det uppstår skador förrän långt senare !
Andre är den sänker snabbheten. Jag minns man kunde skapa RAM-Disk under system 9 o äldre. O fan vad snabbt det blir !
Snart kommer SSD hårddiskar alltmer !!
Men jag förstår att det finns fördelar med virtuellt minne
Nej, virtuellt minne i OS X handlar inte om att kunna utnyttja mer minne än man har RAM. Detta kanske var sant i system 9, men nu kör vi OS X och ger virtuellt minne helt andra fördelar.
Virtuellt minne har två nackdelar.
Första är att om hårddisk börjar får fel eller hårddisk blir nästan fullt, då skadas data och system. Pga virtuellt minne påverkas. Ibland varnas inte om det uppstår skador förrän långt senare !
Om en hårddisk börjar få fel får du troligtvis varningar. Eftersom moderna hårddiskar har checksummor. Om din systemdisk börjar bli full får du också varningar. Inget data går förlorat här.
Du kan väl inte mena att det skulle vara en fördel att kunna köra systemet på en trasig hårddisk om man bara kunde stänga av virtuell minneshantering? Du skulle ju fortfarande kunna få fel då du startar ett nytt program som ska läsas in i minnet. Är hårddisken instabil ska den väl bytas genast? Hur menar du?
Jag vill nog påstå att den höjer hastigheten. Eftersom minnet utnyttjas effektivare. Eftersom minnet inte kan bli fragmenterat och alla processer kan få full kontroll över sin adressrymd. Eftersom minnet används till de processer och data som snurrar och inte ligger och skräpar i inaktiva processer. Eftersom man kan dela minne, program, bibliotek och frameworks mellan flera processer. Eftersom UBC (Unified Buffer Cache) gör att även filer som används ofta cachas i minnet.
Jag minns man kunde skapa RAM-Disk under system 9 o äldre. O fan vad snabbt det blir !
Då blir du nog glad över att du får ungefär samma effekter jämt i OS X genom UBC (på grund av att OS X använder virtuellt minne). Filer som används ofta cachas i RAM.
Här kommer ett övningsexempel i Terminalen för den som orkar
Skapa först en fil på cirka 100MB som innehåller slumpvisa bokstäver. Vi skapar den på /tmp/x för att slippa råka få med den i en TM-backup. Kommandot tar lite tid att köra.
LANG="" tr -cd "A-Za-z\n" </dev/random | dd bs=2048 count=65536 2>/dev/null > /tmp/x
Slå på aktivitetshanteraren och titta på hårddiskaktiviteten. Sök efter ditt namn i slump-filen:
time grep --color sven /tmp/x
Se i Aktivitetshanteraren hur data läses in från hårddisken. time-kommandot visar hur lång tid (real) operationen tog.
Kör nu om samma kommando igen (tryck upp-pil och return). Se så fort det gick! Se hur inget läses från hårddisken i Aktivitetshanteraren! Hela filen ligger nu i RAM (inaktiva sidor).
Titta nu på Systemminne i Aktivitetshanteraren. Notara hur mycket minne du har Ledigt respektive Inaktivt (nere till vänster). Ta nu bort filen:
rm /tmp/x
Tjoff! Se hur mängden ledigt minne nu steg cirka 100MB och inaktivt minne sjönk med 100MB.
Men om vi inte hade tagit bort filen utan istället startat ett program som behövt massor av minne, vad hade hänt då? Jo, det inaktiva minne som innehöll /tmp/x är ju inte "dirty" dvs minnet måste inte skrivas ut till disk (och absolut inte till någon swapfil) om det behövs till något annat. Det nya programmet hade alltså lika gärna kunnat ta inaktivt minne som användes till att cacha /tmp/x som ledigt minne. Det hade INTE varit någon speciell fördel att "friställa" inaktivt minne i detta fall. Däremot så föredrar man att först använda ledigt minne eftersom innehållet är TOTALT ointressant till skillnad från inaktivt minne som KAN komma att användas senare.
Det som hände var nog att en (eller flera?) av filerna i papperskorgen låg cachade i inaktivt minne. Då du tömmer papperskorgen så försvinner filen på riktigt och denna cache blir oanvändbar. Minnet blir "fritt", precis som i mitt terminalexempel ovan (#21).
Varför tårar? Jag har ju försökt förklara att inaktivt minne inte är "upptaget" utan lika tillgängligt som "ledigt" minne.
Du har inte gått miste om minne om du har mycket inaktivt minne. Det är BÄTTRE med inaktivt minne än ledigt minne.