در اوراکل، Shared Server این امکان را فراهم میکند که چندین کاربر بتوانند از یک server process استفاده کنند، به جای این که هر کاربر یک server process داشته باشد. این تنظیم به خصوص در سیستمهایی با تعداد زیاد کاربران یا محیطهایی با نیاز بالا به مقیاسپذیری منابع کاربرد دارد. Shared Server منابع سیستم را بهینهتر استفاده کرده و به کاهش بار سرور کمک میکند. با این حال، در صورت وجود Application Serverهایی که از Connection Pool استفاده میکنند، ممکن است به این تنظیم احتیاجی نداشته باشید و اینکار رو به عهده connection pool بگذارید.
گامهای پیکربندی Shared Server
۱. تنظیم پارامترهای اصلی
-
SHARED_SERVERS: این پارامتر تعیین میکند که چند Shared Server Process از ابتدا فعال باشند. مقدار این پارامتر باید با توجه به بار سیستم و تعداد کاربران تنظیم شود.
SQL> show parameter shared_server
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
max_shared_servers integer
shared_server_sessions integer
shared_servers integer 1
SQL> ALTER SYSTEM SET SHARED_SERVERS=5 SCOPE=BOTH;
System altered.
SQL> show parameter shared_server
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
max_shared_servers integer
shared_server_sessions integer
shared_servers integer 5
DISPATCHERS: این پارامتر تعداد پردازشهای Dispatcher را که وظیفه مدیریت درخواستها را دارند، مشخص میکند. این پردازشها درخواستهای کاربران را به پردازشهای Shared Server ارسال میکنند.
SQL> show parameter dispatchers
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
dispatchers string (PROTOCOL=TCP) (SERVICE=orclXD
B)
max_dispatchers integer
SQL> ALTER SYSTEM SET DISPATCHERS='(PROTOCOL=TCP)(DISPATCHERS=2)' SCOPE=BOTH;
System altered.
SQL> show parameter dispatchers
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
dispatchers string (PROTOCOL=TCP)(DISPATCHERS=2)
max_dispatchers integer
۲. تنظیم پارامترهای حداکثری
-
MAX_SHARED_SERVERS: حداکثر تعداد Shared Server Processes که میتوانند در سیستم اجرا شوند.
SQL> ALTER SYSTEM SET MAX_SHARED_SERVERS=20 SCOPE=BOTH;
System altered.
SHARED_SERVER_SESSIONS: حداکثر تعداد session هایی که میتوانند از Shared Server استفاده کنند.
SQL> ALTER SYSTEM SET SHARED_SERVER_SESSIONS=200 SCOPE=BOTH;
System altered.
نحوه عملکرد Shared Server، Dispatcher و Queue
Shared Server به کمک پردازشهای Dispatcher و Queue درخواستها را مدیریت میکند. نحوه عملکرد به این صورت است:
-
ارسال درخواستها به Dispatcher: وقتی کاربران (کلاینتها) اتصال برقرار میکنند، درخواستها به Dispatcher فرستاده میشوند، نه مستقیماً به پردازشهای Shared Server. Dispatcherها مسئول مدیریت و توزیع این درخواستها هستند و از Queue برای ذخیره و صفبندی درخواستها استفاده میکنند.
-
قرارگیری درخواستها در Request Queue: Dispatcher درخواست هر کاربر را به Request Queue اضافه میکند. این Queue به عنوان یک فضای موقت برای نگهداری درخواستها عمل میکند تا زمانی که یک پردازش Shared Server در دسترس باشد.
-
دریافت درخواست توسط Shared Server: پردازشهای Shared Server به نوبت، درخواستها را از Request Queue دریافت میکنند و آنها را پردازش میکنند.
-
ارسال پاسخ به Dispatcher: پس از پردازش، پاسخ به Response Queue برمیگردد و Dispatcher پاسخ را از این Queue برداشته و به کاربر ارسال میکند.
نکته: Dispatcher و Shared Server فرآیندهای غیرمستقیم برای درخواستها و پاسخها ایجاد میکنند که کارایی منابع را بهبود میبخشد.
اتصال به صورت Shared از طریق کلاینتها
برای اتصال کلاینتهایی مثل SQL*Plus و SQL Developer به Shared Server، باید تنظیمات TNS را در فایل tnsnames.ora پیکربندی کنید:
مثال از TNS به صورت Shared
ORCL =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = oracle9-19)(PORT = 1521))
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = orcl)
)
)
orcl_shared =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = oracle9-19)(PORT = 1521))
(CONNECT_DATA =
(SERVER = SHARED)
(SERVICE_NAME = orcl)
)
)
کانکشن بالا بصورت dedicated و در کانکشنی که با نام orcl_shared آورده شده، بصورت shared متصل خواهد شد. دو کانکشن همزمان با کاربر c##vahid به دیتابیس برقرار میکنیم که تفاوت این دو را ببینیم:
SQL> select sid, serial#, username , server , status from v$session where username='C##VAHID';
SID SERIAL# USERNAME SERVER STATUS
---------- ---------- ------------------------------ --------- --------
2 56203 C##VAHID DEDICATED INACTIVE
26 37433 C##VAHID NONE INACTIVE
همانطور که می بینیم نوع SERVER بصورت NONE نمایش داده شده است که نمایانگر SHARED هست.
غیرفعال کردن Shared Server
اگر نیاز به غیر فعال کردن Shared Server داشتید، میتوانید مقدار SHARED_SERVERS را به ۰ تغییر دهید. این کار باعث میشود تمام پردازشهای Shared Server خاموش شده و اتصالات به Dedicated تغییر پیدا کنند.
ALTER SYSTEM SET SHARED_SERVERS = 0 SCOPE=BOTH;
نحوه Kill کردن نشست در Shared Server
در Shared Server، چون نشستها با پردازشهای مشترک سروکار دارند، نمیتوان به راحتی از دستور مستقیم KILL SESSION
استفاده کرد. به همین دلیل، باید نشستها را ابتدا mark for kill کرد.
مراحل Kill کردن نشست
-
پیدا کردن SID و SERIAL#:
SELECT SID, SERIAL#, SERVER, STATUS, USERNAME
FROM V$SESSION
WHERE SERVER IN ('SHARED','NONE') AND USERNAME = 'C##VAHID';
که نتیجه می شود:
SID SERIAL# USERNAME SERVER STATUS
---------- ---------- ------------------------------ --------- --------
2 56203 C##VAHID DEDICATED INACTIVE
26 37433 C##VAHID NONE INACTIVE
SQL> ALTER SYSTEM KILL SESSION '26,37433' IMMEDIATE;
نکته: در صورتی که هنوز مشکل برقرار باشد، بررسی Dispatcher نیز ضروری است. با بستن پردازش Dispatcher، نشستهای متصل به آن نیز قطع میشوند، اما این کار باید با احتیاط انجام شود.
مشکلات احتمالی Library Cache Mutex در Shared Server
در حالت Shared Server، به دلیل اشتراک منابع، امکان بروز مشکلاتی در Library Cache و Mutexes وجود دارد.
Library Cache و Mutexes چیست؟
Library Cache بخشی از Shared Pool است که برای ذخیره کدهای SQL و پلانهای اجرایی استفاده میشود. Mutexes قفلهایی (LOCK) سبک هستند که برای جلوگیری از دسترسی همزمان به Library Cache استفاده میشوند.
مشکل Library Cache Mutex در Shared Server
به دلیل دسترسی همزمان کاربران به Library Cache در Shared Server، ممکن است Mutex Waits رخ دهد. این اتفاق میتواند به قفل شدن و انتظار کاربران برای دسترسی به Library Cache منجر شود، که بر کارایی سیستم تاثیر منفی میگذارد. مشکل معمولاً به صورت Library Cache Mutex Waits در گزارشهای AWR یا Statspack نمایان میشود.
راهکارهای کاهش مشکل Mutex
-
بهینهسازی کد SQL: جلوگیری از تکرار کدهای SQL مشابه کمک میکند که Mutex Waits کاهش یابد.
-
افزایش سایز Shared Pool: افزایش سایز Shared Pool فضای بیشتری برای Library Cache فراهم میکند.
-
مدیریت پلانهای SQL (SQL Plan Management): مدیریت پلانها میتواند Mutex Waits را کاهش دهد.
-
استفاده از Dedicated Server برای کاربران خاص: برای کاهش Mutex Waits، میتوانید به کاربران خاص یا اتصالهای طولانیمدت Dedicated Server اختصاص دهید.
نکات مهم برای Application Serverها و Connection Pool
بسیاری از Application Serverها از Connection Pooling استفاده میکنند که میتواند با Shared Server تداخل داشته باشد. چند نکته کلیدی:
-
طول عمر اتصالات: Shared Server برای نشستهای کوتاهمدت مناسب است، اما Connection Pool اتصالات را طولانیمدت نگه میدارد. این تفاوت میتواند منجر به تاخیر در صفبندی درخواستها شود.
-
Connection Affinity: در Connection Pool، ممکن است یک اتصال برای نشست خاصی حفظ شود، در حالی که در Shared Server، نشستها بین کاربران به اشتراک گذاشته میشوند و این عدم تطابق میتواند به کاهش کارایی منجر شود.
جمعبندی
این مقاله شما را با پیکربندی Shared Server، مانیتورینگ نشستها، مشکلات Mutex در Library Cache و راهکارهای مدیریت و بهینهسازی آنها آشنا کرد. Shared Server ابزاری کارآمد برای مدیریت بهتر منابع در محیطهای چندکاربره است، اما نیازمند تنظیمات دقیق برای هماهنگی با Connection Pool و جلوگیری از مشکلات Mutex است.