0. Cel
Komfortowe używanie systemu Linux na maszynach ograniczonych w pamięć oraz/lub bez swap-a, także na zwykłych desktopach.
1. Sprzęt testowy:
CPU: AMD K6-II 500MHz
RAM: 192 MiB
swap: 487.6 MiB
kernel: Linux Flame 2.6.18.8-flame #2 PREEMPT Sat Nov 24 23:56:42 CET 2007 i586 k6-2 i386 GNU/Linux
OS: Slackware Linux 11.0
2. Testy
Skorzystałem z instrukcji na stronie: http://www.win.tue.nl/~aeb/linux/lk/lk-9.html
Znajdują się tam trzy programy testowe:
Program 1, alokujący pamięć, lecz jej nie używający:
Kod: Zaznacz cały
#include <stdio.h>
#include <stdlib.h>
int main (void) {
int n = 0;
while (1) {
if (malloc(1<<20) == NULL) {
printf("malloc failure after %d MiB\n", n);
return 0;
}
printf ("got %d MiB\n", ++n);
}
}
Kod: Zaznacz cały
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int main (void) {
int n = 0;
char *p;
while (1) {
if (malloc(1<<20) == NULL) {
printf("malloc failure after %d MiB\n", n);
return 0;
}
memset (p, 0, (1<<20));
printf ("got %d MiB\n", ++n);
}
}
Kod: Zaznacz cały
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define N 10000
int main (void) {
int i, n = 0;
char *pp[N];
for (n = 0; n < N; n++) {
pp[n] = malloc(1<<20);
if (pp[n] == NULL)
break;
}
printf("malloc failure after %d MiB\n", n);
for (i = 0; i < n; i++) {
memset (pp[i], 0, (1<<20));
printf("%d\n", i+1);
}
return 0;
}
Kod: Zaznacz cały
got 3056 MiB
malloc failure after 3056 MiB
program2 kończy tak:
Kod: Zaznacz cały
got 166 MiB
Unicestwiony
Flame kernel: Out of memory: Killed process 2526 (program2).[/code]Out-Of-Memory-killer "zajął się" aplikacją, która dostała za dużo pamięci...
program3:
Kod: Zaznacz cały
malloc failure after 3056 MiB
1
2
[...]
153
Unicestwiony
Mnie osobiście kojarzy się to ze sprzedarzą gruntu: ludzie kupują działki, których nie ma. Wszystko jest OK do czasu, gdy wszyscy tam pojadą i zacznie brakować ziemi. Wtedy do akcji wkracza były właściciel ze strzelbą i odstrzeliwuje tych, którzy mu się nie podobają, żeby inni mieli tyle, ile kupili :>
3. Humanizacja zachowania
Zawartość pliku:
Kod: Zaznacz cały
/proc/sys/vm/overcommit_memory
Kod: Zaznacz cały
0: heurystyczny overcommit (domyślnie)
1: zawsze robi overcommit, nigdy nie sprawdza (jeszcze gorzej niż 0)
2: zawsze sprawdza, nigdy nie robi overcommitu
program1code][...]
got 540 MiB
malloc failure after 540 MiB[/code]
program2code][...]
got 540 MiB
malloc failure after 540 MiB[/code]
program3code]malloc failure after 540 MiB
1
2
[...]
540[/code]
Lepiej. Jednak po wyłączeniu swap-a każdy program dostaje 69 MiB RAMu, mimo że free pokazuje 157 MiB. Wzór na dostępną pamięć wirtualną to:
Kod: Zaznacz cały
pamięć = (SS + RAM*(r/100))
Kod: Zaznacz cały
SS: rozmiar swap-u
RAM: rozmiar RAMu
r: zawartość pliku /proc/sys/vm/overcommit_ratio
Kod: Zaznacz cały
echo 100 > /proc/sys/vm/overcommit_ratio
4. Konkluzja
Nie jestem pewien czy wpisanie wartości 100 to dobry pomysł, może lepiej zostawić parę MiB kernelowi. Teraz wpisałem 90 na swoim desktopie (RAM: 768 MiB, swap: 972 MiB).
Tekst był pisany na gorąco, w miarę testów i uwag postaram się go uzupełnić i poprawić błędy.
Mam nadzieję, że będzie to pomocne, zapraszam do testów
--
Zobacz też:
http://rudd-o.com/archives/2007/10/02/t ... -fix-that/
Źródła:
http://www.win.tue.nl/~aeb/linux/lk/lk-9.html
http://man.cx/proc(5)/pl
Opowiadanie: Kirył Bułyczow - Są wolne miejsca