タイトル: サーバープロセス
SEOタイトル: Oracle サーバープロセス 完全ガイド(専用 / 共有 / クライアント接続 / PGA / バックグラウンドプロセスとの違い)
| この記事の要点 |
|
サーバープロセスとは
Oracle Database には大きく 2 種類のプロセスがあります。バックグラウンドプロセス(DBWn / LGWR / SMON 等、DB 全体の保守を行う)と、サーバープロセス(個々のクライアント要求を処理する)です。サーバープロセスはユーザーセッションごとに SQL を受け取り、解析し、実行し、結果を返す役割を担います。
サーバープロセスの仕事
- クライアント(アプリケーション / sqlplus)から SQL を受信
- パース(構文解析・最適化)— ライブラリキャッシュ参照
- 必要なデータブロックをバッファキャッシュへロード(無ければデータファイルから物理読み込み)
- 実行— 結果セットを構築
- クライアントへ結果を返却
- INSERT/UPDATE/DELETE では REDO エントリを REDO バッファへ書き込み
サーバープロセスはデータファイルを直接書き込まないのがポイント。書き込みは DBWn(DB Writer)、REDO の永続化は LGWR(Log Writer)といったバックグラウンドプロセスが担当します。
接続モード: 専用サーバーと共有サーバー
| 項目 | 専用サーバー(Dedicated) | 共有サーバー(Shared / MTS) |
|---|---|---|
| 対応関係 | クライアント 1 : プロセス 1 | 多 : 少(プール) |
| 仲介 | 無し(直結) | ディスパッチャ + リクエストキュー |
| PGA 配置 | サーバープロセス内 | SGA の Large Pool 内(UGA) |
| 応答速度 | 高速・安定 | キュー待ちが発生しうる |
| リソース効率 | 接続数に比例して増える | 同時接続数が多い OLTP に有利 |
| 典型用途 | 長時間バッチ / 業務 | 大量の短時間 OLTP |
専用サーバーの流れ
クライアントが接続要求 → リスナー(Listener)が新しいサーバープロセスを起動 → 以後そのクライアント専用に SQL を処理。切断時にプロセスも終了。
共有サーバーの流れ
クライアントが接続要求 → リスナーが空いているディスパッチャへ振り分け → ディスパッチャがリクエストをキューへ → 共有サーバープロセスがキューから取り出して処理 → レスポンスをキュー経由で返却。
関連メモリ構造(PGA / UGA)
| 領域 | 内容 | 専用サーバーでの場所 | 共有サーバーでの場所 |
|---|---|---|---|
| PGA | セッション固有の作業領域(ソート / ハッシュ等) | サーバープロセス内 | サーバープロセス内 |
| UGA | セッション変数 / カーソル状態 | PGA 内 | SGA の Large Pool 内 |
| SGA | バッファキャッシュ / 共有プール / REDO バッファ等 | 共有 | 共有 |
確認コマンド
-- セッション一覧(サーバープロセス含む)
SELECT s.sid, s.serial#, s.username, s.machine,
s.program, s.server, s.status, p.spid AS os_pid
FROM v$session s
JOIN v$process p ON p.addr = s.paddr
WHERE s.username IS NOT NULL;
-- 接続モード(DEDICATED / SHARED)
SELECT username, server, count(*)
FROM v$session
WHERE username IS NOT NULL
GROUP BY username, server;
-- PGA 使用状況
SELECT name, value/1024/1024 AS mb
FROM v$pgastat
WHERE name IN ('total PGA allocated','total PGA inuse','maximum PGA allocated');
OS から見たサーバープロセス
Linux/Unix では oracle または ora_* のような名前で見えます。v$process.spid が OS の PID と対応するため、性能トラブル時は top / ps と突き合わせて特定します。
# 専用サーバーのプロセス
$ ps -ef | grep oracle | grep LOCAL
oracle 12345 1 0 10:00 ? 00:00:01 oracleORCL (LOCAL=NO)
関連トラブルと対処
| 症状 | 原因 / 対処 |
|---|---|
| ORA-12500 / ORA-12520(プロセス起動失敗) | OS の nproc 上限 / Oracle の processes 上限超過。拡張する |
| ORA-04030(PGA メモリ不足) | 大きなソートや CLOB 処理で PGA 不足。pga_aggregate_target 増、SQL チューニング |
| セッションが切れない | アプリのコネクションリーク。プール設定見直し / SQLNET.EXPIRE_TIME |
| 共有サーバーで遅い | ディスパッチャ / 共有サーバープロセス不足。dispatchers / shared_servers 増 |
専用と共有を切り替える
-- 現在の設定を確認(init.ora / spfile)
SHOW PARAMETER dispatchers;
SHOW PARAMETER shared_servers;
-- 共有サーバーを有効化(例: TCP のディスパッチャを 4 個、共有サーバーを 8 個)
ALTER SYSTEM SET dispatchers='(PROTOCOL=TCP)(DISPATCHERS=4)' SCOPE=BOTH;
ALTER SYSTEM SET shared_servers=8 SCOPE=BOTH;
-- クライアント側の接続文字列でも明示できる
-- (SERVER=DEDICATED) / (SERVER=SHARED)
専用サーバーがデフォルトで、明示的に共有サーバーを設定しない限りクライアント接続は常に専用です。短い OLTP が数千〜数万セッション飛んでくるシステムでは共有サーバーが効きますが、解析用 / 集計用のセッションは専用のままにします。
ライフサイクル
- クライアントがネットワーク経由でリスナーに接続要求
- リスナーがサーバープロセスをfork / spawn(専用)または既存ディスパッチャに振る(共有)
- 認証成功後、サーバープロセスがクライアントと直接通信開始
- クライアントから
EXIT/ コネクション断 → サーバープロセス終了 / プールに戻る
関連
- プロセス — 親カテゴリ
- バックグラウンドプロセス — DBWn / LGWR / SMON など
- PGA — プログラム・グローバル領域
- SGA — システム・グローバル領域
- リスナー / tnsnames.ora — クライアント接続