PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : swap voll führt zum absturz



boba
14.05.09, 07:50
Hallo,

ich habe desöfteren das Problem das der Kernel meldet das kein swap mehr frei ist, dann fängt das system an meine porzesse zu killen und die machine ist nicht mehr erreichbar,
da hilft dann nur noch ein reboot.
Wie kann man verhindern das die machine durch sowas blockiert wird?



Node 0 HighMem per-cpu: empty
Free pages: 41616kB (0kB HighMem)
Active:1016029 inactive:990644 dirty:0 writeback:0 unstable:0 free:10404 slab:5862 mapped-file:1019 mapped-anon:1999628 pagetables:11993 Node 0 DMA free:11044kB min:12kB low:12kB high:16kB active:0kB inactive:0kB present:10696kB pages_scanned:0 all_unreclaimable? yes
lowmem_reserve[]: 0 3254 8052 8052
Node 0 DMA32 free:23816kB min:4636kB low:5792kB high:6952kB active:1652760kB inactive:1618328kB present:3333032kB pages_scanned:5942590 all_unreclaimable? yes
lowmem_reserve[]: 0 0 4797 4797
Node 0 Normal free:6756kB min:6836kB low:8544kB high:10252kB active:2411832kB inactive:2343988kB present:4912640kB pages_scanned:12797285 all_unreclaimable? yes
lowmem_reserve[]: 0 0 0 0
Node 0 HighMem free:0kB min:128kB low:128kB high:128kB active:0kB inactive:0kB present:0kB pages_scanned:0 all_unreclaimable? no
lowmem_reserve[]: 0 0 0 0
Node 0 DMA: 1*4kB 4*8kB 2*16kB 7*32kB 6*64kB 1*128kB 0*256kB 0*512kB 2*1024kB 0*2048kB 2*4096kB = 11044kB Node 0 DMA32: 0*4kB 1*8kB 2*16kB 3*32kB 0*64kB 1*128kB 0*256kB 0*512kB 1*1024kB 1*2048kB 5*4096kB = 23816kB Node 0 Normal: 45*4kB 0*8kB 1*16kB 1*32kB 0*64kB 1*128kB 1*256kB 2*512kB 1*1024kB 0*2048kB 1*4096kB = 6756kB Node 0 HighMem: empty
8767 pagecache pages
Swap cache: add 513085, delete 513085, find 21335/21466, race 0+2 Free swap = 0kB Total swap = 2048276kB
Free swap: 0kB
2293760 pages of RAM
249353 reserved pages
54662 pages shared
0 pages swap cached
Out of memory: Killed process 32183 (httpd).




danke

-b

marce
14.05.09, 08:00
entweder
- dafür sorgen, daß die einzelnen Prozesse weniger Speicher benötigen,
- unnötige Anwendungen beenden

oder einfach
- mehr SWAP zur Verfügung stellen

Wuppi109
14.05.09, 08:04
moin,

lass mal top laufen und schaue welcher Prozess / Programm Dir langsam den Speicher /Swap zumüllt.

Wann tritt das Problem eigentlich auf?

Gruß Wuppi

PS: Mehr swap hilft nicht wenn ein Programmfehler vorliegt und der den Speicher zulaufen läßt...hatte ich auch mal unter bestimmten Bedingungen.

boba
14.05.09, 08:23
Hallo,

ich habe da schwer den apache in verdacht.
Wenn ich merke das der swap volläuft kann ich durch einen httpd restart den swap wieder leeren.

marce
14.05.09, 08:24
dann solltest Du die Fehler in der Webanwendung finden und beseitigen...

Alex_K
14.05.09, 09:16
Alternativ kann es auch ein Problem mit der Apache Konfiguration sein. Bei vServern mit wenig Speicher tritt das Problem häufig auf. Erlaubt die Apache Config mehr parallele Prozesse als dein Server verträgt, kann es bei ausreichenden hohen Benutzerzahlen dazu kommen dass die Apache Prozesse zuviel Speicher benötigen.

boba
15.05.09, 07:39
Hallo,
wie müsste den die httpd.conf dann aussehen um die prozesse zu limitieren?

Ich habe diese settings gefunden, in den Vhost configs steht dazu im moment nichts,
es sind 5 Vhost auf der maschine.


# prefork MPM
# StartServers: number of server processes to start
# MinSpareServers: minimum number of server processes which are kept spare
# MaxSpareServers: maximum number of server processes which are kept spare
# ServerLimit: maximum value for MaxClients for the lifetime of the server
# MaxClients: maximum number of server processes allowed to start
# MaxRequestsPerChild: maximum number of requests a server process serves
<IfModule prefork.c>
StartServers 8
MinSpareServers 5
MaxSpareServers 20
ServerLimit 256
MaxClients 256
MaxRequestsPerChild 4000
</IfModule>

# worker MPM
# StartServers: initial number of server processes to start
# MaxClients: maximum number of simultaneous client connections
# MinSpareThreads: minimum number of worker threads which are kept spare
# MaxSpareThreads: maximum number of worker threads which are kept spare
# ThreadsPerChild: constant number of worker threads in each server process
# MaxRequestsPerChild: maximum number of requests a server process serves
<IfModule worker.c>
StartServers 2
MaxClients 150
MinSpareThreads 25
MaxSpareThreads 75
ThreadsPerChild 25
MaxRequestsPerChild 0
</IfModule>



thx

marce
15.05.09, 07:42
Sorry, es ist ehrlich gesagt Blödsinn an einer Stelle was drehen zu wollen, ohne zu wissen, ob es überhaupt daran liegt.

-> mach erst mal eine ordentliche Problemanalyse.

boba
18.05.09, 16:38
mmh, kann man den system nicht verbieten abzustürzen nur weil der swap voll ist?
Komisches Verhalten von Linux.
ich hab das swap mal verdreifacht, ist trotzdem abgestürzt.
Das es am apache liegt ist klar, aber eine genauere analyse ist noch am laufen.

Kann man sich den inhalt des swap eigentlich anschauen?

tribad
18.05.09, 19:23
Das der Linux-Kernel Prozesse killt wenn garkein Speicher mehr verfügbar ist, ist normal.

Es gibt da im Kernel so ein kleines unscheinbares Modul

linux/mm/oom_kill.c

Es ist gut dokumentiert. Wen es also interessiert, wie die Prozesse ausgewählt werden, die zu killen sind, kann da nachschauen.

mamue
19.05.09, 07:52
Man kann sich einen etwas besseren Überblick über das aktuelle Geschehen im RAM verschaffen, wenn man top laufen lässt, dort die Taste 'f' (fields) und 'S' drückt. Die Werte sind mit großer Vorsicht zu genießen, aber man bekommt meist einen guten Überblick darüber, wann die Werte steigen und vielleicht auch bei welchen Aktionen. Wenn Du dabei vielleicht mit wget mal den Webserver stresst, könnte vielleicht klar werden, welche Seiten/Scripte für das Mißverhalten verantwortlich sind.
Prinzipiell gibt es unter Linux auch die Möglichkeit Begrenzungen (limits) für Benutzer (wwwrun) festzulegen, was den Speicherverbrauch anbelangt.

HTH
mamue

Edit: Ach ja, ich habe "meinem" Linux übrigens das Abstürzen prinzipiell verboten - ist auch nie wieder vorgekommen ;-)
Was soll so ein OS denn Deiner Ansicht nach machen, wenn der Speicher so ganz und gar alle ist und ein Programm trotzdem fortlaufend versucht, mehr davon zu bekommen? Damit bekommt man jedes nicht speziell gehärtete OS platt.