mardi 10 juillet 2012

mysql : ERROR 1135 (00000): Can't create a new thread (errno 11)


RTFEM (read the fair error message) ! : Tu n'as pas assez de ram !
Euh si, plein ;

Tu es limité par /etc/security/limits.conf , fais ulimit -a en user mysql pour voir, 
c'est évident, suivant, ah la la je suis trop fort...
ulimit -a ..... : ouh la la t'as tout mis au maximum ?! et ça marche pas ?, attend, on teste ...


le server mysql est bien lancé, je me connecte : 
mysql -u root --host=127.0.0.1 --port=3306 --protocol=tcp
ah ben ça marche ! 
attends, regarde je mets ça dans un shell
echo "mysql -u root --protocol=tcp" > toto
sh totoERROR 1135 (00000): Can't create a new thread (errno 11); if you are not out of available memory, you can consult the manual for a possible OS-dependent bug 
Hein?
oui, ou bien comme ça
shshmysql -u root -p  --protocol=tcp 
ERROR 1135 (00000): Can't create a new thread...
ou alors comme ça, j'ouvre une autre fenêtre, je fais sh;sh;, oui oui ok 
et dans la première fenêtre
mysql -u root -p  --protocol=tcp
ERROR 1135 (00000): Can't create a new thread...
Euh, attends, je strace ...
j'ai déjà fais, regarde ya le message, rien d'intéressant

setsockopt(3, SOL_IP, IP_TOS, [8], 4)   = 0
setsockopt(3, SOL_TCP, TCP_NODELAY, [1], 4) = 0
setsockopt(3, SOL_SOCKET, SO_KEEPALIVE, [1], 4) = 0
read(3, "\213\0\0\0\377o\4Can't create a new thread (errno 11); if you are not out of available memory, you can consult the manual for a possible OS-dependent bug", 16384) = 143
shutdown(3, 2 /* send and receive */)   = 0close(3)                                = 0
fstat(1, {st_mode=S_IFCHR|0620, st_rdev=makedev(136, 0), ...}) = 0
mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x2aaaaacb7000
write(2, "ERROR 1135 (HY000): ", 20ERROR 1135 (HY000): )    = 20
write(2, "Can't create a new thread (errno 11); if you are not out of available memory, you can consult the manual for a possible OS-dependent bug", 136Can't create a new thread (errno 11); if you are not out of available memory, you can consult the manual for a possible OS-dependent bug) = 136

Euh, telnet ?
Telnet 127.0.0.1 3306
ERROR 1135 (00000): Can't create a new thread
autre user ? ça marche
autre port , 80 ? ça marche 
Curiouser and Curiouser (L.Carroll)

Les logs de mysql ? rien de spécial ...

[... après plusieurs jours de réflexions  après quelques minutes ... ]

Faisons un strace sur le serveur ? ok 
ah ben oui, l'erreur apparait . 
une petite minute. une petite minute! une petite minute !? Bob tu peux me prendre une glace au chocolat ?!

C'est le serveur qui envoie le message ! Il est lancé en mysql ? avec un sudo !!
et le sudo lui donne les droits et limites de root, qui est ici très limité dans limits.conf .....

Il suffit donc de modifier le script de lancement pour y attribuer les limites de mysql

# use ulimits from original user

for ulimcmd in $(grep ^$GSCRIPT_SYSUSER /etc/security/limits.conf|sed \
  -e 's/core/-c/'      -e 's/data/-d/'         -e 's/nice/-e/'        \
  -e 's/fsize/-f/'     -e 's/sigpending/-i/'   -e 's/memlock/-l/'     \
  -e 's/rss/-m/'       -e 's/nofile/-n/'       -e 's/pipe/-p/'        \
  -e 's/msqqueue/-q/'  -e 's/rtprio/-r/'       -e 's/stack/-s/'       \
  -e 's/cpu/-t/'       -e 's/nproc/-u/'        \
  -e 's/\t/ /g' -e 's/  */ /g' |sort -r|sed \
  -e 's/^.* soft *//' -e 's/^.* hard *//' -e 's/ /_/g' );do
  ulimit $(echo $ulimcmd|sed -e 's/_/ /g')
done
Beurk. Bah

Short, for english nofrench stuck techies:
"ERROR 1135 (00000): Can't create a new thread" is a message from mysqld, displayed in mysql or telnet ;  Tricky if you run mysqld from a sudo command line and by this way you would inherit [poor] limits from the root user and not the [expected] mysql user. To fix it, you will have to adjust ulimit live in mysqld  sudoed launching script.

Aucun commentaire: