SQL Anywhere のスレッドモデルを理解するには、スレッドと要求処理の基本用語と概念を理解することが必要です。
要求 要求は、クエリや SQL 文などの作業単位で、接続を介してデータベースサーバーに送信されます。要求の存続期間は、要求がデータベースによって最初に受信されてから、結果の最後が返されてカーソルが閉じられるまで、または要求がキャンセルされるまでの間を指します。
タスク タスクは、データベースサーバー内で実行されるアクティビティの単位です。また、データベースサーバーによってスケジュールされる最小の作業単位でもあります。ユーザー要求は、それぞれ、データベースサーバー内で少なくとも 1 つのタスクになります。クエリ内並列処理が関連する場合は、複数のタスクになることもあります。データベースサーバーは、ユーザー要求だけでなく、内部タスクを実行するために自身のタスクをスケジュールすることもできます。たとえば、データベースクリーナーの実行やタイマーの処理などがこれに該当します。同時に実行できるアクティブなタスクの最大数は、カーネル内のワーカープールのサイズによって異なります。ユーザー要求タスクがデータベースサーバーに届き、そのタスクにワーカーが割り当てられると、ActiveReq サーバープロパティの値が 1 増えます。要求が完了すると、ActiveReq サーバープロパティの値は 1 減ります。ただし、ユーザー要求タスクを実行するために使用できるワーカーがない場合、そのタスクは実行のためにキューイングされ、UnschReq サーバープロパティの値が 1 増えます。ワーカーが使用可能になり、タスクが実行のためにデキューされると、UnschReq サーバープロパティの値が 1 減り、ActiveReq プロパティの値が 1 増えます。UnschReq サーバープロパティとActiveReq サーバープロパティを参照してください。
ワーカー ワーカーは、データベースサーバーカーネル内で実行されている「制御用のスレッド」を抽象化したものです。Windows と Linux では、ワーカーは「ファイバー」と呼ばれる軽量スレッドを使用して実装されます。その他のプラットフォームでは、オペレーティングシステムスレッドを使用して実装されます。ワーカーは、データベースサーバーのカーネルによって割り当てられたタスクを実行します。データベースサーバーは、サイズが可変のワーカープールを利用してサーバーの負荷を処理します。プールのサイズは、データベースサーバーのマルチプログラミングレベルに対応します。
パーソナルサーバーと Windows Mobile 上のネットワークサーバーには、固定サイズのプールがあります。これらのサーバーでは、サーバーの起動時に作成されるワーカーの数を -gn オプションで制御します。他のすべてのネットワークサーバーでは、-gnh オプションで指定された数のワーカーがデータベースサーバーによって作成されます。ただし、タスクに対してサービスを提供できるのは、サーバーのマルチプログラミングレベルで指定された数のワーカーのみです。デフォルトでは、ワーカープールのサイズは、データベースサーバーの負荷の変化に応じてカーネルによって動的にチューニングされ、-gnl オプションと -gnh オプションでそれぞれ指定された下限と上限の間で上下します。マルチプログラミングレベルのデータベースサーバー設定を参照してください。
タスクは、先入れ先出し (FIFO) 方式でワーカーに割り当てられます。各タスクの優先度は、そのタスクを生成した接続に基づいて設定されます。タスクが実行のためにワーカーに割り当てられると、カーネルのスケジューラーはタスクの優先度を考慮して CPU 時間をそのワーカーに割り付けます。タスクの実行中、ロックを待機したり、I/O 処理の完了を待機したりするなどの理由でタスクのブロックが必要になった場合でも、ワーカーはそのタスクに関連付けられたままです。タスクが完了した後にのみ、ワーカーは他のタスクを実行するために使用できるようになります。
スレッド スレッド、つまり実行スレッドは、オペレーティングシステムを構築するもので、単一プロセス内での同時実行を可能にします。データベースサーバーを含め、オペレーティングシステムの各プロセスは、少なくとも 1 つのスレッドによって実行されます。複数のスレッドによって実行されることもあります。スレッドは、オペレーティングシステムによってアプリケーション外部でスケジュールされ、最終的にアプリケーション実行のすべてはスレッドによって行われます。Windows と Linux では、データベースサーバーは決められた数のスレッドを作成します。つまり、CPU コアごとに 1 つのオペレーティングシステムスレッドを作成し、この数は -gtc オプションで制御されます。その他のプラットフォームでは、作成されるオペレーティングシステムスレッドの数はワーカープールのサイズと同じであり、ワーカープールサイズの制御に使用されるのと同じメカニズムで制御されます。-gtc dbeng12/dbsrv12 サーバーオプションと-gn dbsrv12 サーバーオプションを参照してください。
スレッドの数は、データベースへの接続の数とは関係ありません。データベースサーバーは、スレッドを特定の接続専用に割り当てません。代わりに、タスクは、実行のためにデータベースサーバーに届くと、サーバースレッドの固定サイズのプールからスレッドが動的に割り当てられます。タスクがスレッドに割り当てられると、スレッドはタスクが完了するかキャンセルされるまでタスクを処理します。
UNIX でのワーカー
Windows と Linux でのワーカー
スレッド動作
マルチプログラミングレベルのデータベースサーバー設定
![]() |
DocCommentXchange で意見交換できます
|
Copyright © 2012, iAnywhere Solutions, Inc. - SQL Anywhere 12.0.1 |