Out of Memory: Killed process 13368 (mysqld)

Out of Memory: Killed process 13368 (mysqld)

am 19.09.2006 16:20:26 von Yaya Diawara

Hallo,

Mein mysql server restartet ab und zu.

Im log befindet sich folgende meldung:

mysqld restarted
Dann folgen eine menge checktables.
Im log des servers befinden sich folgende Meldungen:

Sep 19 08:23:47 wvj1 kernel: lowmem_reserve[]: 0 0 0
Sep 19 08:23:47 wvj1 kernel: Node 0 DMA: 0*4kB 0*8kB 0*16kB 0*32kB 0*64kB
1*128kB 0*256kB 1*512kB 0*1024kB 0*2048kB 2*4096kB = 8832kB
Sep 19 08:23:47 wvj1 kernel: Node 0 Normal: 63*4kB 0*8kB 1*16kB 67*32kB
2*64kB 1*128kB 1*256kB 1*512kB 1*1024kB 0*2048kB 1*4096kB = 8556kB
Sep 19 08:23:47 wvj1 kernel: Node 0 HighMem: empty
Sep 19 08:23:47 wvj1 kernel: Swap cache: add 56827414, delete 56718738, find
11006468/18769409, race 1+3541
Sep 19 08:23:47 wvj1 kernel: Free swap: 0kB
Sep 19 08:23:47 wvj1 kernel: 4390912 pages of RAM
Sep 19 08:23:47 wvj1 kernel: 288345 reserved pages
Sep 19 08:23:47 wvj1 kernel: 61553 pages shared
Sep 19 08:23:47 wvj1 kernel: 108641 pages swap cached
Sep 19 08:23:47 wvj1 kernel: Out of Memory: Killed process 13368 (mysqld).

Sep 19 08:23:47 Servername kernel: Out of Memory: Killed process 13368
(mysqld)

Der Server hat 16G RAM
OS ist Suse 9.2 Enterprise

Danke imVoraus.


Yaya.

Re: Out of Memory: Killed process 13368 (mysqld)

am 19.09.2006 21:12:29 von Philipp Taprogge

Hi!

Und was ist nun deine Frage?

Bis denne,

Phil

Re: Out of Memory: Killed process 13368 (mysqld)

am 19.09.2006 22:44:33 von Kris

Yaya Diawara wrote:
> Der Server hat 16G RAM

Die nutzen Dir auf einer 32 Bit Möhre nicht so viel.

Kris

Re: Out of Memory: Killed process 13368 (mysqld)

am 19.09.2006 22:50:51 von Sven Paulus

Kristian Köhntopp wrote:
>> Der Server hat 16G RAM
> Die nutzen Dir auf einer 32 Bit Möhre nicht so viel.

Warum nicht? Mit PAE und z.B. noch ein paar memcacheds a 2GB mit
drauf? Und noch ein wenig Plattencache?

Wird sich aber sicherlich nicht rechnen, fuer eine Anwendung, bei der
man obige Konstellation nutzen koennte, duerften 4 Sub-4GB-Kisten
interessanter und performanter sein.

Die Frage ist aber eigentlich, was der Originalposter fuer eine
my.cnf hat, dass mysql an diese Grenze stoesst.

Re: Out of Memory: Killed process 13368 (mysqld)

am 20.09.2006 00:23:54 von Axel Schwenke

"Yaya Diawara" wrote:

> Mein mysql server restartet ab und zu.

Nicht wirklich. Dein Kernel meint hin und wieder, deinen MySQL Server
abschießen zu müssen.

> Sep 19 08:23:47 wvj1 kernel: lowmem_reserve[]: 0 0 0
> Sep 19 08:23:47 wvj1 kernel: Node 0 DMA: 0*4kB 0*8kB 0*16kB 0*32kB 0*64kB
> 1*128kB 0*256kB 1*512kB 0*1024kB 0*2048kB 2*4096kB = 8832kB
> Sep 19 08:23:47 wvj1 kernel: Node 0 Normal: 63*4kB 0*8kB 1*16kB 67*32kB
> 2*64kB 1*128kB 1*256kB 1*512kB 1*1024kB 0*2048kB 1*4096kB = 8556kB
> Sep 19 08:23:47 wvj1 kernel: Node 0 HighMem: empty
> Sep 19 08:23:47 wvj1 kernel: Swap cache: add 56827414, delete 56718738, find
> 11006468/18769409, race 1+3541
> Sep 19 08:23:47 wvj1 kernel: Free swap: 0kB
> Sep 19 08:23:47 wvj1 kernel: 4390912 pages of RAM
> Sep 19 08:23:47 wvj1 kernel: 288345 reserved pages
> Sep 19 08:23:47 wvj1 kernel: 61553 pages shared
> Sep 19 08:23:47 wvj1 kernel: 108641 pages swap cached
> Sep 19 08:23:47 wvj1 kernel: Out of Memory: Killed process 13368 (mysqld).

Und zwar genau hier. Finde raus, warum
a) der Speicher knapp wird und
b) ausgerechnet mysqld dran glauben muß

> Danke imVoraus.

Wofür? Wolltest du eigentlich was fragen?


XL

Re: Out of Memory: Killed process 13368 (mysqld)

am 20.09.2006 00:25:51 von Axel Schwenke

Kristian =?UTF-8?B?S8O2aG50b3Bw?= wrote:
> Yaya Diawara wrote:
>> Der Server hat 16G RAM
>
> Die nutzen Dir auf einer 32 Bit Möhre nicht so viel.

Deine Kristallkugel muß besser sein als meine. SuSE Linux 9.2 gibts
auch für x86_64. Und sein Kernel meldet 4 Mio Pages RAM. Paßt also.


XL

Re: Out of Memory: Killed process 13368 (mysqld)

am 20.09.2006 14:23:44 von Yaya Diawara

Danke Axel fuer die Antwort obwohl ich die Frage vergessen habe :),
Mein Server ist eine Dell 2900 mit 16Gb RAM.
Es ist ein Server der dedicated ist fuer Mysql.
Es gibt perl Skripte, die Abfragen and den server senden.
Was ich nicht verstehe is dass ich einen zweiten Server mit der selben
Datenbank,OS aber weniger speicher (6G) habe, der aber nie den ganzen
Speicher frisst, oder zumindest wird mysqld nicht als Opfer ausgewaehlt wenn
der speicher knapp wird.
Kann mann irgendwie vermeiden dass ausgerechnet mysqld gekillt wird wenn es
eng wird mit dem Speicher ?

Danke .

Yaya.



"Axel Schwenke" wrote in message
news:qlqpee.477.ln@xl.homelinux.org...
> "Yaya Diawara" wrote:
>
>> Mein mysql server restartet ab und zu.
>
> Nicht wirklich. Dein Kernel meint hin und wieder, deinen MySQL Server
> abschießen zu müssen.
>
>> Sep 19 08:23:47 wvj1 kernel: lowmem_reserve[]: 0 0 0
>> Sep 19 08:23:47 wvj1 kernel: Node 0 DMA: 0*4kB 0*8kB 0*16kB 0*32kB 0*64kB
>> 1*128kB 0*256kB 1*512kB 0*1024kB 0*2048kB 2*4096kB = 8832kB
>> Sep 19 08:23:47 wvj1 kernel: Node 0 Normal: 63*4kB 0*8kB 1*16kB 67*32kB
>> 2*64kB 1*128kB 1*256kB 1*512kB 1*1024kB 0*2048kB 1*4096kB = 8556kB
>> Sep 19 08:23:47 wvj1 kernel: Node 0 HighMem: empty
>> Sep 19 08:23:47 wvj1 kernel: Swap cache: add 56827414, delete 56718738,
>> find
>> 11006468/18769409, race 1+3541
>> Sep 19 08:23:47 wvj1 kernel: Free swap: 0kB
>> Sep 19 08:23:47 wvj1 kernel: 4390912 pages of RAM
>> Sep 19 08:23:47 wvj1 kernel: 288345 reserved pages
>> Sep 19 08:23:47 wvj1 kernel: 61553 pages shared
>> Sep 19 08:23:47 wvj1 kernel: 108641 pages swap cached
>> Sep 19 08:23:47 wvj1 kernel: Out of Memory: Killed process 13368
>> (mysqld).
>
> Und zwar genau hier. Finde raus, warum
> a) der Speicher knapp wird und
> b) ausgerechnet mysqld dran glauben muß
>
>> Danke imVoraus.
>
> Wofür? Wolltest du eigentlich was fragen?
>
>
> XL

Re: Out of Memory: Killed process 13368 (mysqld)

am 20.09.2006 15:43:28 von Axel Schwenke

"Yaya Diawara" wrote:

> Danke Axel fuer die Antwort obwohl ich die Frage vergessen habe :),

:-)

> Mein Server ist eine Dell 2900 mit 16Gb RAM.

Fettes Eisen. Nur leider mit Intel-Schnecken-CPUs statt AMD-Rennern...

> Was ich nicht verstehe is dass ich einen zweiten Server mit der selben
> Datenbank,OS aber weniger speicher (6G) habe, der aber nie den ganzen
> Speicher frisst, oder zumindest wird mysqld nicht als Opfer ausgewaehlt wenn
> der speicher knapp wird.
> Kann mann irgendwie vermeiden dass ausgerechnet mysqld gekillt wird wenn es
> eng wird mit dem Speicher ?

Wenn du irgendwie Performance aus dem System holen willst, solltest du
vermeiden, daß das RAM knapp wird. Wenn du es schaffst, daß dir auf
einer MySQL-only Maschine der Speicher ausgeht, dann hast du mit
Sicherheit etwas falsch konfiguriert.

Linux schießt Prozesse nur bei *wirklichem* Notstand ab. D.h. es müssen
RAM und Swap *komplett* vergeben sein. Eine mögliche Strategie wäre,
ordentlich Swap zu spendieren. Dann wird das System zwar irgendwann mal
unerträglich langsam (wenn es swapt) - aber es bleibt wenigstens stabil.
"Ordentlich Swap" heißt hier mindestens soviel Swap wie RAM. Eher mehr.

Ein weiterer Ansatzpunkt wäre, Linux' Memory-Overcommit abzuschalten.
Defaultmäßig gibt Linux nämlich mehr virtuellen Speicher an Prozesse,
als es eigentlich hat. Wenn wirklich nur MySQL auf der Maschine laufen
soll, kannst du OC abschalten (echo 2 >/proc/sys/vm/overcommit_memory).
Im MySQL-Server teilen sich ohnehin alle Threads einen Adreßraum.

Schließlich kann man Prozesse auch davor schützen, bei OOM gekillt zu
werden. Eine Google Suche nach "linux out of memory kill" führte mich
zu http://linux-mm.org/OOM_Killer. Wenn aber, wie zu vermuten ist, dein
mysqld tatsächlich den meisten Speicher frißt, nützt es wenig, andere
Prozesse zu opfern. Damit zögerst du den Knall nur hinaus.


XL

Re: Out of Memory: Killed process 13368 (mysqld)

am 20.09.2006 15:47:00 von Sven Paulus

Yaya Diawara wrote:
> Was ich nicht verstehe is dass ich einen zweiten Server mit der selben
> Datenbank,OS aber weniger speicher (6G) habe, der aber nie den ganzen
> Speicher frisst, oder zumindest wird mysqld nicht als Opfer ausgewaehlt wenn
> der speicher knapp wird.

Dann zeig doch mal die my.cnfs von den beiden Kisten, vielleicht ist
ja da irgendwas voellig daneben konfiguriert, dass den mysqld massiv
Memory ziehen laesst und deswegen gekillt wird.

Re: Out of Memory: Killed process 13368 (mysqld)

am 21.09.2006 15:55:54 von Axel Schwenke

"Yaya Diawara" wrote:
>
> Hier sind die beiden config files im attachement.

Örks. Da das Textfiles sind, hättest du sie problemlos als Text
anhängen können.

> Vielleicht sind einige werte im config file zu gross gesetzt.

Allerdings. Besonders bulk_insert_buffer_size haut richtig rein (dieser
Buffer wird *per Thread* alloziert).

Ich habe mal ein kleines Skript geschrieben, das ausgehend von einer
my.cnf den maximalen Speicherbedarf eines MySQL-Servers berechnet.
Hier die Ergebnisse:

$./mysql-memory-usage Server_6G_my_cnf.txt
/usr/local/mysql/5.0.24/libexec/mysqld will use at most:
3.1 GB for global stuff
90.2 MB per thread
47.1 GB total (with 500 active threads)
and additionally:
128.0 MB while recovering MyISAM tables
256.0 MB for each HEAP table
64.0 MB for each temporary table

$./mysql-memory-usage Server_16G_my_cnf.txt
/usr/local/mysql/5.0.24/libexec/mysqld will use at most:
2.2 GB for global stuff
90.2 MB per thread
28.6 GB total (with 300 active threads)
and additionally:
128.0 MB while recovering MyISAM tables
256.0 MB for each HEAP table
64.0 MB for each temporary table

Beide sind deutlich über dem Limit, was vor allem am hohen
(konfigurierten) Speicherverbrauch pro Thread liegt. Bei beiden
Servern sind also Probleme zu erwarten - wenn sie denn die maximal
erlaubte Anzahl Connections bekommen.

Mein Tip für die Konfiguration von MySQL: zu Beginn erst mal nur
die offensichtlichen Limits setzen:

max_connections
table_cache
key_buffer_size
query_cache_size
innodb_buffer_pool_size (wenn InnoDB verwendet)

Alle anderen Settings nur anfassen, wenn man entweder *genau* weiß,
was man tut oder wenn eine Messung am laufenden Server zeigt, daß
der derzeitige Wert nicht paßt.


Daumenwerte (für eine dedizierte MySQL-Machine):

key_buffer_size: idealerweise ~ Summe aller .MYI Files. Jedoch nicht
größer als 50% vom RAM.

table_cache: max_connections * (2..5)

query_cache_size: 5-20% vom RAM. Mit kleinen Werten anfangen und nur
erhöhen wenn a) der Cache was bringt und b) es Hinweise gibt, daß der
Cache zu klein ist.

innodb_buffer_pool_size: wenn nur InnoDB-Tabellen sind, bis 80% vom RAM.

max_connections: hier nicht übertreiben. Das ist ein Multiplikator!


XL

Re: Out of Memory: Killed process 13368 (mysqld)

am 21.09.2006 16:07:46 von Axel Schwenke

Axel Schwenke wrote:
>
> Ich habe mal ein kleines Skript geschrieben, das ausgehend von einer
> my.cnf den maximalen Speicherbedarf eines MySQL-Servers berechnet.

Zum Download hier: http://forge.mysql.com/snippets/view.php?id=44


XL

Re: Out of Memory: Killed process 13368 (mysqld)

am 21.09.2006 17:06:31 von Sven Paulus

Axel Schwenke wrote:
> Daumenwerte (für eine dedizierte MySQL-Machine):
> key_buffer_size: idealerweise ~ Summe aller .MYI Files. Jedoch nicht
> größer als 50% vom RAM.

Du solltest noch dazu sagen, dass bei einer 32bit-Linux-Kiste das
"vom RAM" max. 3GB entspricht, denn mehr Speicher kann ein einzelner
Prozess (und das ist der mysqld ja) nicht allozieren.

Wobei man natuerlich dann, wenn die Kiste deutlich mehr als diese 3GB
zur Verfuegung hat, mit den MySQL-Parametern auch etwas grosszuegiger
agieren kann (also z.B. oben nicht 50% sondern 70% annehmen etc.), da
ja die Buffercaches ausserhalb von diesem angenommenen maximalen
Speicher von 3GB liegen.

Re: Out of Memory: Killed process 13368 (mysqld)

am 21.09.2006 18:06:19 von Axel Schwenke

Sven Paulus wrote:
> Axel Schwenke wrote:
>> Daumenwerte (für eine dedizierte MySQL-Machine):
>> key_buffer_size: idealerweise ~ Summe aller .MYI Files. Jedoch nicht
>> größer als 50% vom RAM.
>
> Du solltest noch dazu sagen, dass bei einer 32bit-Linux-Kiste das
> "vom RAM" max. 3GB entspricht, denn mehr Speicher kann ein einzelner
> Prozess (und das ist der mysqld ja) nicht allozieren.

Sobald man 4GB RAM oder mehr hat, ist eine 32-Bit Maschine sowieso
Unsinn. Da braucht man IMHO nicht drüber zu diskutieren.

> Wobei man natuerlich dann, wenn die Kiste deutlich mehr als diese 3GB
> zur Verfuegung hat, mit den MySQL-Parametern auch etwas grosszuegiger
> agieren kann (also z.B. oben nicht 50% sondern 70% annehmen etc.), da
> ja die Buffercaches ausserhalb von diesem angenommenen maximalen
> Speicher von 3GB liegen.

Laut Manual gibt es ohnehin ein Limit von 4GB (was ich aber ehrlich
gesagt nicht glaube, wahrscheinlich stimmt das nur für 32-Bit
Umgebungen). Allerdings kann man seit neuestem auch mehrere Key-Caches
haben [1].

Die 50% sind allerdings unabhängig von der Größe des RAMs. Die MyISAM
Engine cached ja ausschließlich Indexe, das Cachen der Datenfiles
obliegt dem Betriebssystem. Typischerweise hat man aber deutlich mehr
Daten als Indexe. Wenn man zuviel RAM für den key_buffer verbrät, muß
der Server dann darauf warten, daß Daten aus den .MYD Files von der
Platte kommen bzw. auf die Platte geschrieben sind.

Man sollte den key_buffer genauso wie den query_cache interaktiv opti-
mieren. Man fängt mit einem sinnvollen Startwert an und checkt, ob die
Cache-Performance gut genug ist. So ab 99.9% Cache Hitrate bringt es
nichts, mit weiterem RAM nach dem Key-Cache zu werfen.


[1] http://dev.mysql.com/doc/refman/5.0/en/multiple-key-caches.h tml


XL