Can't create a new thread (errno 11)

提供:MySQL Practice Wiki

移動: 案内, 検索

目次

エラー概要

MySQLエラー番号 1135
SQLSTATE HY000
エラー名 ER_CANT_CREATE_THREAD
メッセージ Message: Can't create a new thread (errno %d); if you are not out of available memory, you can consult the manual for a possible OS-dependent bug.
障害部位 mysqld
該当バージョン any
エラーの原因 以下を参照。
対策 以下を参照。
備考 nada

原因

java.sql.SQLExceptionやmysql CLIから返されるエラー。MySQLは新しい接続を受け付ける際、その接続を処理するための専用のスレッドを作成するが、そこではpthread_create()関数が使用される。pthread_create()が失敗するとこのエラーが起きる。pthread_create()が失敗してしまう要因は2つ。(詳しくはman pthread_createを参照。)

  1. 何らかのリソースが不足している。
  2. カーネルが適切に設定されていない。

リソースが不足している場合

リソースとはほとんどの場合がメモリである。メモリ不足により新たなスレッドに対するスタックの割り当て等に失敗すると、このpthread_createが失敗する。その際、EAGAINが返されることが多い。

スレッド数が上限に達した

OSが作成できるスレッド数には上限がある。スレッドを管理するための構造体に割り当てるメモリが必要であったり、ユーザーがスレッドを無闇に作りすぎるのを防止するためだ。しかし、MySQLは接続ごとにスレッドを必要とするため、システムのデフォルトでは容易に上限に達してしまう。MySQLが新たな接続を受け付けるようにするためには、カーネルパラメーター等を調整してやる必要がある。システムが使用できるスレッド数を増やすには、以下のようにする必要がある。

Linux (2.6、2.4系)
以下のいずれかの方法にてthreads-maxカーネルパラメータを調節する。
  • /etc/sysctl.confにてkernel.threads-maxを設定。
  • /proc/sys/kernel/threads-maxに対して値を書き込む。
Windows
UNIX互換のpthread_create()を実装しているが、裏でCreateThread Win32 APIを呼び出しているのでそちらの上限を受ける。Windowsはデフォルトでは1MBという巨大なスタックをスレッドに割り当てるため、2GBメモリの制限がある場合には2048までのスレッドしか作成することが出来ない。MySQLではスレッドのスタックサイズがデフォルトでは192KBなので、それよりは多少多くのスレッドを作成できるものと思われる。
Solaris
スレッド数自体に制限はないが、スレッドを処理するLWPの最大数に制限される。LWPの最大数はそのスタック領域はsegkpに作成される。そのため、segkpを使い果たしたときがLWPの最大数となる。segkpのサイズを大きくするには/etc/systemにおいてsegkpsizeを設定すれば良い。
HP-UX
以下の2つのカーネルパラメータを設定する必要がある。
これらはプロセスの上限値を規定するものであるが、HP-UXでは恐らくスレッドがプロセスのように(まるでNPTLのない古いLinuxのようだが)実装されているのだろう。
FreeBSD
以下の2つのカーネルパラメータを設定する。
kern.threads.max_groups_per_proc
kern.threads.max_threads_per_proc
さらに必要に応じてスタックの上限サイズを調整する。
kern.maxssiz
kern.dflssiz