کانفیگ shared server و مطالب مرتبط

در اوراکل، 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 درخواست‌ها را مدیریت می‌کند. نحوه عملکرد به این صورت است:

  1. ارسال درخواست‌ها به Dispatcher: وقتی کاربران (کلاینت‌ها) اتصال برقرار می‌کنند، درخواست‌ها به Dispatcher فرستاده می‌شوند، نه مستقیماً به پردازش‌های Shared Server. Dispatcherها مسئول مدیریت و توزیع این درخواست‌ها هستند و از Queue برای ذخیره و صف‌بندی درخواست‌ها استفاده می‌کنند.

  2. قرارگیری درخواست‌ها در Request Queue: Dispatcher درخواست هر کاربر را به Request Queue اضافه می‌کند. این Queue به عنوان یک فضای موقت برای نگه‌داری درخواست‌ها عمل می‌کند تا زمانی که یک پردازش Shared Server در دسترس باشد.

  3. دریافت درخواست توسط Shared Server: پردازش‌های Shared Server به نوبت، درخواست‌ها را از Request Queue دریافت می‌کنند و آنها را پردازش می‌کنند.

  4. ارسال پاسخ به 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 کردن نشست

  1. پیدا کردن 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

  1. بهینه‌سازی کد SQL: جلوگیری از تکرار کدهای SQL مشابه کمک می‌کند که Mutex Waits کاهش یابد.

  2. افزایش سایز Shared Pool: افزایش سایز Shared Pool فضای بیشتری برای Library Cache فراهم می‌کند.

  3. مدیریت پلان‌های SQL (SQL Plan Management): مدیریت پلان‌ها می‌تواند Mutex Waits را کاهش دهد.

  4. استفاده از 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 است.