ব্যবহারকারীর সংযোগের সংখ্যা


24

এসকিউএল সার্ভার ২০১২ স্ট্যান্ডার্ড সংস্করণে, আমি জানি যে ব্যবহারকারীর সংযোগগুলির সর্বাধিক সংখ্যা 32,767। আমি যদি এই সংখ্যার দিকে যাচ্ছি তবে ডিবিএ হিসাবে আমার কী করা উচিত?

বর্তমানে 30,000 ব্যবহারকারীর সংযোগ রয়েছে এবং এই সংখ্যাটি বৃদ্ধি পাওয়ার আশা করা হচ্ছে।

এখানে চিত্র বর্ণনা লিখুন


5
এগুলি যদি কোনও অ্যাপ থেকে হয় তবে অ্যাপটি শেষ হয়ে গেলে এটির সংযোগটি বন্ধ করে দেওয়া উচিত। সংযোগটি ছেড়ে দেওয়া এই
সীমাটিকে

উত্তর:


31

সংযোগ সর্বোচ্চ সংখ্যক SQL সার্ভার সংস্করণগুলি জুড়ে এবং সংস্করণ 32.767 হয়।

এসকিউএল সার্ভারের বর্তমানে কতগুলি সংযোগ রয়েছে তা দেখে আপনি তা নির্ধারণ করতে পারেন:

SELECT ConnectionStatus = CASE WHEN dec.most_recent_sql_handle = 0x0 
        THEN 'Unused' 
        ELSE 'Used' 
        END
    , CASE WHEN des.status = 'Sleeping' 
        THEN 'sleeping' 
        ELSE 'Not Sleeping' 
        END
    , ConnectionCount = COUNT(1)
FROM sys.dm_exec_connections dec
    INNER JOIN sys.dm_exec_sessions des ON dec.session_id = des.session_id
GROUP BY CASE WHEN des.status = 'Sleeping' 
        THEN 'sleeping' 
        ELSE 'Not Sleeping' 
        END
    , CASE WHEN dec.most_recent_sql_handle = 0x0 
        THEN 'Unused' 
        ELSE 'Used' 
        END;

যদি উপরের ক্যোয়ারী থেকে ব্যবহৃত এবং অব্যবহৃত সংযোগগুলির মধ্যে অনুপাতটি সম্পর্কিত হয় তবে সম্ভবত সংযোগ পুলিংটি সার্ভারের সাথে সংযুক্ত ক্লায়েন্ট অ্যাপ্লিকেশনগুলির দ্বারা সক্ষম হয়েছে এবং সেই সংযোগগুলি কার্যকরভাবে ব্যবহার করা হচ্ছে না। আপনি বিকাশকারীদের সংযোগ পুলের আকার সীমাবদ্ধ করতে এই অ্যাপ্লিকেশনগুলির জন্য সংযোগের স্ট্রিংটি সংশোধন করতে এবং তারা সঠিকভাবে সংযোগগুলি নিষ্পত্তি করছে কিনা তা নিশ্চিত করতে চাইতে পারেন। যদি সংযোগগুলি সঠিকভাবে নিষ্পত্তি না করা হয় তবে ক্লায়েন্টের অ্যাপ্লিকেশন চলমানক্ষণ সেগুলি খোলা থাকবে।

যদি আপনি বিশেষত উদ্বিগ্ন বোধ করছেন এবং সাম্প্রতিক সময়ে কিছু সম্পাদন করেনি এমন সমস্ত সংযোগগুলি থেকে মুক্তি পাওয়ার প্রয়োজন রয়েছে (তারা বর্তমানে কার্যত সম্পাদন করছেন তা নির্বিশেষে ) আপনি নিম্নলিখিত কোডটি চালাতে পারেন যা সেশনগুলির একটি তালিকা তৈরি করবে যা হত্যা করা যেতে পারে। কমান্ডগুলি প্রকৃতপক্ষে চালানোর জন্য আপনার উত্পন্ন কমান্ডগুলি একটি নতুন এসএসএমএস উইন্ডোতে অনুলিপি করে আটকানো দরকার। আমিও আপ-টু-ডেট আপনার সারসংকলন থাকার পরামর্শ চাই ধরো যদি

DECLARE @cmd NVARCHAR(MAX);
SET @cmd = '';
SELECT @cmd = @cmd + 
    CASE WHEN @cmd = '' THEN '' ELSE CHAR(13) + CHAR(10) END 
    + 'KILL ' + CONVERT(VARCHAR(MAX), dec.session_id) + ';'
FROM sys.dm_exec_connections dec
WHERE dec.most_recent_sql_handle = 0x0;

PRINT @cmd;

একাধিক এসকিউএল সার্ভার নোড জুড়ে ডেটা ভাগ করে 32,767 এর বাইরে সংযোগের সংখ্যা রৈখিকভাবে স্কেল করা সম্ভব। তবে আমার মতে সংযোগের সংখ্যার সীমা নির্ধারণের উপায় হিসাবে শারডিং ব্যবহার করা একটি মাকড়সা মেরে পরমাণু বোমা ব্যবহার করার মতো। এটা তোলে করবে মাকড়সা বধ করে, কিন্তু আপনি শুধু পারে দিনের শেষে বড় সমস্যা আছে। এটি একটি পরমাণু বোমা তৈরি করা খুব সুন্দর রঞ্জক উল্লেখ না করা, সঠিকভাবে শারডিং বাস্তবায়ন উল্লেখ না করে।


1
কেন আমরা "killable" চিহ্নিত করা আপনি ব্যাখ্যা করতে পারেন সেশন sys.dm_exec_ মধ্যে most_recent_sql_handle ব্যবহার করে সংযোগ বদলে ব্যবহার করে, বলুন, sys.dm_exec_ মধ্যে অবস্থা এবং last_request_start_time এবং is_user_process দ্বারা সেশন ? এটি একটি বিজোড় পছন্দ বলে মনে হচ্ছে।
মাইক শেরিল 'ক্যাট

এটি একটি দুর্দান্ত বিষয়, @ মাইক - সেই সময় আমি সংযোগ পুলিংয়ের মাধ্যমে খোলা এবং যেগুলি কখনও ব্যবহার করা হয়নি সেগুলি সম্পর্কে খাঁটি ভাবছিলাম। বাছাইপর্বে যোগ করা ভাল ধারণা হবে is_user_processএবং last_request_start_timeকিছুটা সাম্প্রতিকতম সেশনগুলি বাদ দিতে অবশ্যই আঘাত লাগবে না । কীভাবে সাম্প্রতিক? আরেকটি ভাল প্রশ্ন।
ম্যাক্স ভার্নন

সর্বশেষ_আপনি_স্টার্ট_টাইমটি সম্ভবত নতুনের চেয়ে পুরানো হওয়া উচিত। আমি মনে করি একটি নিরাপদে "কিলযোগ্য" ব্যবহারকারীর সেশনটি ঘুমিয়ে আছে এবং কয়েক দিনের জন্য তার অনুরোধ নেই। আমার ধারণা, আমাদের অ্যাপ্লিকেশন প্রোগ্রামাররা নিজের পরে পরিষ্কার করার ক্ষেত্রে কতটা ভাল সময় তার উপর নির্ভর করে কাট অফের সময়।
মাইক শেরিল 'ক্যাট রিকল'

12

আমি অতীতে সংযোগ পুলিংয়ের সাথে অদ্ভুত আচরণ করতে পেরেছি এবং আপনার পরিস্থিতি সেই পরিস্থিতিতে একটির সাথে খুব ভালভাবে সাজিয়েছে। যদি আপনার অ্যাপ্লিকেশনটিতে সংযোগ পুলিং ব্যবহার করা হয় (এবং এটি এখনও অনুমান করা হয় যে আপনি এই বিষয়টি নিশ্চিত না করেন বা অস্বীকার না করেন) তবে আপনার অনেক সংযোগ খোলা থাকবে। এটি নকশা দ্বারা।

সংযোগ পুলিংয়ের উদ্দেশ্য একটি ডাটাবেস সংযোগ তৈরির ওভারহেড হ্রাস করা। আসুন, উদাহরণস্বরূপ, 3 এর একটি সংযোগ পুলটি গ্রহণ করুন যতদূর আমি জীবনকালকে বলতে পারি যে এটি একটি শীতল সংযোগ পুলের ক্যাশে থেকে শুরু করে:

  1. অ্যাপ্লিকেশন ব্যবহারকারী এ ডাটাবেসের সাথে সংযোগ চেয়েছেন
  2. সংযোগ পুল ডাটাবেসে সংযোগ থ্রেড 1 শুরু করে
  3. অ্যাপ্লিকেশন ব্যবহারকারী বি ডাটাবেসের সাথে সংযোগ চেয়েছেন
  4. সংযোগ পুল ডাটাবেসে সংযোগ থ্রেড 2 শুরু করে
  5. অ্যাপ্লিকেশন ব্যবহারকারী এ তাদের সংযোগ বন্ধ করে ... সংযোগ পুলে
  6. অ্যাপ্লিকেশন ব্যবহারকারী সি ডাটাবেসের সাথে সংযোগ চেয়েছেন
  7. sp_reset_connectionথ্রেড 1 এ সংযোগ পুল সমস্যা
  8. সংযোগ পুল অ্যাপ্লিকেশন ব্যবহারকারী সি কে থ্রেড 1 বরাদ্দ করে

এটি একটি ওভারসিম্প্লিফিকেশন, তবে মূল বিষয়গুলির মধ্যে রয়েছে:

  • সংযোগ পুল থ্রেড পুল এবং ডাটাবেসের মধ্যে সংযোগটি খোলা থাকবে যতক্ষণ না ডাটাবেস বা সংযোগ পুলটি জোর করে সংযোগটি বন্ধ করে দেয়
  • সেই থ্রেডটি অন্য ব্যবহারকারীর দ্বারা পুনরায় ব্যবহার না করা হওয়া অবধি শেষ সেশনের সম্পাদনের প্রসঙ্গের সাথে সংযোগটি উন্মুক্ত থাকে, যার সময়ে সময়ে sp_reset_connectionবলা হয়।

এখানে আমি এই সিদ্ধান্তে আসতে ব্যবহার করেছি এমন রেফারেন্স উপাদান material

এসকিউএল সার্ভার ডিবিএর জন্য সংযোগ পুলিং

অনাথ লেনদেনের ক্ষেত্রে

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.