বুদ্ধিমান বাফার পুলের আকারটি মূল্যায়নের জন্য একটি নির্বিচার পদ্ধতি কী?


29

আমি max server memory (mb)সেটিংসটি উপযুক্ত কিনা তা বোঝার জন্য একটি বুদ্ধিমান উপায় নিয়ে আসার চেষ্টা করছি (হয় নিম্নতর, বা উচ্চতর হওয়া উচিত, বা যেমন হয় তেমন থাকুন)। আমি সচেতন যে max server memory (mb)অপারেটিং সিস্টেমের জন্য নিজেই ঘর ছাড়ার জন্য সর্বদা যথেষ্ট কম হওয়া উচিত etc.

আমি যে পরিবেশটির দিকে নজর দিচ্ছি তার বেশ কয়েকটি শতাধিক সার্ভার রয়েছে; আমার একটি নির্ভরযোগ্য সূত্রের প্রয়োজন যা আমি নির্ধারণ করতে ব্যবহার করতে পারি যে বাফার পুলের বর্তমান আকারটি উপযুক্ত কিনা যেহেতু প্রতিটি সার্ভারে বরাদ্দের জন্য প্রতি জিবি র‍্যাম রক্ষিত হয়। পুরো পরিবেশটি ভার্চুয়ালাইজড এবং কোনও ভিএমকে বরাদ্দ করা "শারীরিক" র‌্যাম সহজেই উপরে বা নীচে পরিবর্তন করা যেতে পারে।

আমার কাছে একটি বিশেষ এসকিউএল সার্ভার ইনস্ট্যান্স রয়েছে যা আমি এখন 1,100,052 সেকেন্ডের একটি পিএলই দিয়ে দেখছি যা 12.7 দিনের সমান হয় (সার্ভারটি শেষ হওয়ার পরিমাণ)। সার্ভারটির 2560MB (2.5GB) সর্বাধিক সার্ভার মেমরি সেটিংস রয়েছে, যার মধ্যে কেবল 1380MB (1.3 গিগাবাইট) আসলে প্রতিশ্রুতিবদ্ধ।

আমি বেশ কয়েকটি আইটেম পড়েছি যার মধ্যে একটি জোনাথন কেহিয়াস ( পোস্ট ) এবং অন্যটি পল র্যান্ডাল ( পোস্ট ), এবং আরও বেশ কয়েকটি দ্বারা রয়েছে। জোনাথন খুব কম হওয়ায় 4 জিবি বাফার পুলের 300 প্রতি নীচের পিএলইয়ের জন্য পর্যবেক্ষণের পক্ষে । উপরের এসকিউএল সার্ভার ইনস্ট্যান্সের জন্য, 300 * (2.5 / 4) = 187300 এর নীচে সত্যিই খুব কম লক্ষ্য পিএলইয়ের ফলাফল This ধরে নিলাম গত 12 দিন এই সার্ভারটির জন্য সাধারণ ব্যবহারের প্রতিনিধি, আমি বলব max server memory (mb)সেটিংসটি হ্রাস করা যেতে পারে।

স্কেলের অন্য প্রান্তে, আমার 294 এর পিএলই সহ আরও একটি ইন্টিগ্রেশন-টেস্ট সার্ভার রয়েছে, যার max server memory (mb)কেবলমাত্র 1GB এর সেটিং রয়েছে। এই সার্ভারটিতে কেবল 224MB এসকিউএল সার্ভার ডেটা রয়েছে লগগুলি অন্তর্ভুক্ত নয় এবং কিছু বিজফ্লো ডাটাবেস চালাচ্ছে। এই সার্ভারটি উচ্চতর সেটিং থেকে উপকৃত হতে পারেmax server memory (mb)

আমি লক্ষ্যগুলি যে খুব বেশি মেমরি নির্ধারিত হতে পারে এটি দেখার জন্য অন্তর্ভুক্ত করার জন্য একটি ভাল শুরু করার জায়গাটি ভাবছি :

SELECT 
    RamMB = physical_memory_in_bytes / 1048576
    , BufferPoolCommittedMB = bpool_committed * 8192E0 / 1048576
    , BufferPoolCommitTargetMB = bpool_commit_target * 8192E0 / 1048576
    , PercentOfDesiredSizeMB = CONVERT(INT,(CONVERT(DECIMAL(18,2),bpool_committed) 
                            / bpool_commit_target) * 100)
FROM sys.dm_os_sys_info;

যদি BufferPoolCommitTargetMB / BufferPoolCommittedMB1 এর বেশি হয় তবে সার্ভারটি পুরো বাফার পুলটি ব্যবহার করছে না। যদি প্রশ্নযুক্ত মেশিনেও "x" এর চেয়ে বড় PLE থাকে তবে এটি হ্রাস পাওয়ার জন্য ভাল প্রার্থী হতে পারে max server memory (mb)

যেহেতু Buffer Manager:Lazy writes/secপারফরম্যান্স কাউন্টার মেমরির চাপের কারণে এসকিউএলওএস চেকপয়েন্টগুলির মধ্যে ডিস্কে পৃষ্ঠা লিখেছিল তার সন্ধান করে, তাই এটি অন্য আরেকটি ভাল বিষয় হতে পারে।

DECLARE @WaitTime DATETIME;
SET @WaitTime = '00:00:15';
DECLARE @NumSeconds INT;
SET @NumSeconds = DATEDIFF(SECOND, 0, @WaitTime);
DECLARE @LazyWrites1 BIGINT;
DECLARE @LazyWrites2 BIGINT;

SELECT @LazyWrites1 = cntr_value 
FROM sys.dm_os_performance_counters dopc
WHERE (
        dopc.counter_name LIKE 'Lazy writes/sec%' COLLATE SQL_Latin1_General_CP1_CI_AS
    )
    AND dopc.object_name = 'MSSQL$' + CONVERT(VARCHAR(255),
               SERVERPROPERTY('InstanceName')) + ':Buffer Manager';

WAITFOR DELAY @WaitTime;

SELECT @LazyWrites2 = cntr_value 
FROM sys.dm_os_performance_counters dopc
WHERE (
        dopc.counter_name LIKE 'Lazy writes/sec%' COLLATE SQL_Latin1_General_CP1_CI_AS
    )
    AND dopc.object_name = 'MSSQL$' + CONVERT(VARCHAR(255),
               SERVERPROPERTY('InstanceName')) + ':Buffer Manager';

SELECT LazyWritesPerSecond = (@LazyWrites2 - @LazyWrites1) / @NumSeconds;

উপরের কোডটি ধরে নিয়েছে যে সার্ভারটি চালাতে যে 15 সেকেন্ড সময় লাগবে তার মধ্যে লোডের মধ্যে রয়েছে, অন্যথায় এটি 0 প্রতিবেদন করবে; যা একটি বিভ্রান্তিকর মিথ্যা-নেতিবাচক হতে পারে।

আমি কি PAGELATCHIO_*মেমরির চাপের সূচক বা অপ্রতুলতার অপেক্ষাকৃত অপেক্ষার পরিসংখ্যান বা অন্য কোনও অপেক্ষার প্রকারের দিকে নজর দেব?

আমার প্রশ্নটি হল, আমি কীভাবে নির্ভরযোগ্যভাবে পিএলই এবং এর জন্য একটি "ভাল" লক্ষ্য মান নির্ধারণ করতে পারি max server memory (mb)?

উত্তর:


11

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

এসকিউএল সার্ভার 2005 থেকে 2008 আর 2 এর জন্য

দয়া করে নোট করুন এসকিউএল সার্ভার ২০০৩ থেকে ২০০৮ পর্যন্ত আর 2 সর্বোচ্চ সার্ভার মেমরি কেবল বাফার পুল নিয়ন্ত্রণ করে controls সুতরাং সর্বোচ্চ সার্ভার মেমরি কনফিগারেশন এখানে কিছুটা ক্লান্তিকর এবং কয়েকটি গণনা জড়িত

  1. উইন্ডোজ ওএসের জন্য 2 জি মেমরি সরাসরি ছেড়ে দিন।

  2. অবশ্যই সিস্টেমে অ্যান্টিভাইরাস চলমান ছিল। অ্যান্টিভাইরাস জন্য 1.5 জি ছেড়ে দিন। দয়া করে মনে রাখবেন যে ম্যাকাফি এবং এসকিউএল সার্ভার হাতে না চলে তাই নিশ্চিত করুন যে আপনি এটির জন্য যথেষ্ট পরিমাণ রেখেছেন। আপনি Perfmon Process-> Private bytes and Working Setএসকিউএল সার্ভার বাক্সে চলমান এভি এবং অন্যান্য ছোট অ্যাপ্লিকেশন দ্বারা মেমরির ব্যবহার নিরীক্ষণ করতে পারফোন কাউন্টারটিও পরীক্ষা করতে পারেন

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

  1. ড্রাইভার / ফার্মওয়্যারের মেমরির প্রয়োজনীয়তাগুলি বিবেচনা করুন You আপনাকে সিস্টেমে ইনস্টল করা ড্রাইভার দ্বারা মেমরির প্রয়োজনীয়তার উপর ভিত্তি করে এটিকে অর্জন করতে হবে। র‌্যামমাপ সরঞ্জাম সাহায্য করতে পারে

  2. এসকিউএল সার্ভারের ননবপুল (ওরফে এমটিএল বা এমটিআর) মেমরির প্রয়োজনীয়তাগুলি বিবেচনা করুন।

    select  sum(multi_pages_kb)/1024 as multi_pages_mb from  sys.dm_os_memory_clerks

    + সর্বোচ্চ কর্মী থ্রেড * 2 এমবি

    + + বেশিরভাগ ক্ষেত্রে সরাসরি উইন্ডোজের বরাদ্দের জন্য মেমরি তবে বেশিরভাগ ক্ষেত্রে এসকিউএল সার্ভার প্রসেসে 3 টি পার্টির উপাদান লোড করা থাকলে (লিঙ্কযুক্ত সার্ভার ডেলস, তৃতীয় পক্ষের ব্যাকআপ ডেল ইত্যাদিসহ) আপনাকে এটি বাড়িয়ে দিতে হতে পারে)

    + আপনি যদি সিএলআর ব্যবহার করছেন তবে সিএলআরের জন্য কিছু অতিরিক্ত মেমরি যুক্ত করুন।

  3. চাকরির (মেমরির প্রতিলিপি এজেন্টস, লগ শিপিং ইত্যাদি) এবং সার্ভারে চলমান প্যাকেজগুলির মাধ্যমে মেমরির প্রয়োজনীয়তা বিবেচনা করুন। এটি চলমান সংখ্যার অনুযায়ী এমবি থেকে শুরু করে জিবি পর্যন্ত যেতে পারে। মাঝারি আকারের সার্ভারের জন্য আপনি এটি 250 এমবি হিসাবে নিতে পারেন

  4. অপারেটিং সিস্টেমের জন্য যথেষ্ট ভাল জায়গা আছে তা নিশ্চিত করুন।

    আনুমানিক (4 জি অবধি প্রতিটি গিগাবাইটের জন্য 100 এমবি) + (12 গিগাবাইট পর্যন্ত প্রতিটি অতিরিক্ত জিবি এর জন্য 50 এমবি) + (আপনার র‌্যামের আকার পর্যন্ত প্রতিটি অতিরিক্ত গিগাবাইটের জন্য 25 এমবি)

  5. অন্যান্য স্মৃতি প্রয়োজনীয়তা।

    আপনার যদি আপনার পরিবেশের সাথে সম্পর্কিত অন্য কোনও মেমরির প্রয়োজনীয়তা থাকে।

    সর্বোচ্চ সার্ভারের মেমরি = মোট শারীরিক স্মৃতি - (1 + 2 + 3 + 4 + 5 + 6 + 7)

    আমি এসএসআইএস.এসএসআরএস, এসএসএএস-এর জন্য মেমরি কনফিগারেশনটি অন্তর্ভুক্ত করি নি আপনাকে মোট শারীরিক সার্ভার মেমরি থেকে এই পরিষেবাগুলির দ্বারা প্রয়োজনীয় মেমরিটি বিয়োগ করতে হবে।

    উপরের কনফিগার করার পরে আপনাকে নিম্নলিখিত কাউন্টারগুলি পর্যবেক্ষণ করতে হবে

  • এসকিউএল সার্ভার: বাফার ম্যানেজার - পৃষ্ঠা জীবন প্রত্যাশা (পিএলই):

  • এসকিউএল সার্ভার: বাফার ম্যানেজার - চেকপয়েন্ট পৃষ্ঠা / সেকেন্ড:

  • এসকিউএল সার্ভার: মেমরি ম্যানেজার - মেমরি অনুদান মুলতুবি:

  • এসকিউএল সার্ভার: মেমরি ম্যানেজার - টার্গেট সার্ভার মেমরি:

  • এসকিউএল সার্ভার: মেমরি ম্যানেজার - মোট সার্ভার মেমরি

এসকিউএল সার্ভারের জন্য 2012/2014।

From SQL Server 2012 onwardsসর্বোচ্চ সার্ভার মেমরি সেট আপ করা সহজ হয়ে উঠেছে। কারণ এখন প্রায় ম্যাক্স সার্ভার মেমরি সমস্ত মেমরির ব্যবহারের জন্য অ্যাকাউন্ট করে। সর্বাধিক সার্ভার মেমরি এসকিউএল সার্ভার মেমরি বরাদ্দ নিয়ন্ত্রণ করে, যার মধ্যে রয়েছে বাফার পুল, সংকলন মেমরি, সমস্ত ক্যাশে, কিউ মেমরি অনুদান, লক ম্যানেজার মেমরি এবং সিএলআর মেমরি (মূলত কোনও "ক্লার্ক" dm_os_memory_clerks পাওয়া যায়)। থ্রেড স্ট্যাকস, হিপস, এসকিউএল সার্ভার ব্যতীত লিঙ্কযুক্ত সার্ভার সরবরাহকারী বা "নন এসকিউএল সার্ভার" ডিএলএল দ্বারা বরাদ্দকৃত কোনও মেমরির মেমরি সর্বোচ্চ সার্ভার মেমরি দ্বারা নিয়ন্ত্রিত হয় না।

আপনি এসকিউএল সার্ভারে 75-80% বরাদ্দ করতে পারেন এবং তারপরে মেমরির ব্যবহার নিরীক্ষণ করতে পারফোন কাউন্টার ব্যবহার করতে পারেন। এসকিউএল সার্ভারে 2012 তেমন কয়েকটি পারফোন কাউন্টার অবচিত করা হয়েছে। বাফার ম্যানেজারের কাউন্টারকে অবহিত করা হয়েছে আপনাকে অবশ্যই মেমোরি পরিচালক ব্যবহার করতে হবে

  • এসকিউএল সার্ভার: মেমরি পরিচালক - টার্গেট সার্ভার মেমরি (কেবি)

  • এসকিউএল সার্ভার: মেমরি ম্যানেজার - মোট সার্ভার মেমরি (কেবি)

  • এসকিউএল সার্ভার: মেমরি পরিচালক - ফ্রি মেমরি (কেবি)

  • এসকিউএল সার্ভার: মেমরি ম্যানেজার - ডাটাবেস ক্যাশে মেমরি (কেবি)

পিএলইয়ের মান অনুসারে আমি জোয়ান্থানের সূত্র ব্যবহার করেছি এবং ভাগ্যক্রমে এটি আমার পক্ষে কাজ করেছে।


6

এখানে চ্যালেঞ্জটি হ'ল সংখ্যাগুলি ব্যবহারকারীর শেষ অভিজ্ঞতাটি গ্রহণ করে না।

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

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

পারফরম্যান্সটি একটি প্রশ্ন দিয়ে শুরু করা দরকার: ব্যবহারকারীরা কি পারফরম্যান্সে খুশি? যদি তা হয় তবে সিস্টেমটি যেখানে রয়েছে তা ছেড়ে দিন।


এমনকি আপনি যদি আপনার প্রয়োজনের চেয়ে বেশি মেমরি ব্যবহার করেন?
জেমস অ্যান্ডারসন

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

2
ভাল পয়েন্ট, ব্রেন্ট। আমাকে জিজ্ঞাসা করা হয়েছিল যে কিছু সার্ভার অতিরিক্ত বিধানযুক্ত কারণ আমরা প্রতি জিবি প্রতি মেমরির জন্য অর্থ প্রদান করি। আমি যে উদাহরণগুলি দেখছি তার মধ্যে অনেকগুলিই আমি খুব সামান্য পরিমাণে র‌্যাম max server memory (mb)হিসাবে বিবেচনা করি এবং যেমন আমি সেগুলি ডাউন-আকার করতে বেশ অনিচ্ছুক। যাইহোক, অন্য কয়েকটি উদাহরণে 1,000,000 + পিএলই রয়েছে এবং যেমন র‌্যামের ঝরে পড়ার সম্ভাব্য প্রার্থী। স্পষ্টত, কমিয়ে র্যাম IOps বৃদ্ধি হতে হবে, এবং আমি নিশ্চিত খরচ নই যে হতে হবে।
ম্যাক্স ভার্নন

1
এছাড়াও, max server memoryসেটিংয়ের সাথে তুলনা করে পিএলইয়ের দিকে তাকানো একটি মুরগি এবং ডিমের জিনিস; কম max server memoryসেটিং, নিম্ন ন্যূনতম "গ্রহণযোগ্য" PLE হবে, তাই আমি একটি সদা কমানোর সর্পিল আটকে পারে। আমি নিশ্চিত, আপনি যেমন উল্লেখ করেছেন, ব্যবহারকারীর কর্মক্ষমতা কিছুটা সময় প্রভাবিত হবে।
ম্যাক্স ভার্নন

পিএলই কাউন্টারগুলি হ'ল আপনি যা ২০১২ সাল থেকে এড়ানো উচিত বা আপনার যখন NUMA সিস্টেম থাকে সেখানে প্রতিটি নোড নিজের ছোট মেমরির বরাদ্দকারী হিসাবে আচরণ করে। আপনি যদি প্রতিটি NUMA নোড সম্পূর্ণ না করে থাকেন তবে আপনি
পিএলইয়ের সন্ধান

3

PLE বনাম মূল্যায়নের জন্য আমি যে টি-এসকিউএল ব্যবহার করছি max server memoryতা হ'ল:

/*
    Purpose:            Returns a resultset describing various server level stats including PLE
                        Max and Min Server Memory, etc.
    By:                 Max Vernon
    Date:               2014-12-01
*/
SET NOCOUNT ON;

/*
    wait stats for PAGELATCH_IO
*/
DECLARE @Debug BIT;
SET @Debug = 0;
DECLARE @HTMLOutput BIT;
SET @HTMLOutput = 1;
DECLARE @WaitTime DATETIME;
SET @WaitTime = '00:00:15';
DECLARE @NumSeconds INT;
SET @NumSeconds = DATEDIFF(SECOND, 0, @WaitTime);
DECLARE @InstanceName NVARCHAR(255);
SET @InstanceName = CONVERT(NVARCHAR(255), SERVERPROPERTY('InstanceName'));
DECLARE @Version NVARCHAR(255);
DECLARE @VersionINT INT;
SET @Version = CONVERT(NVARCHAR(255),SERVERPROPERTY('ProductVersion'));
SET @VersionINT = CONVERT(INT, SUBSTRING(@Version,1 ,CHARINDEX('.',@Version)-1));
DECLARE @cmd NVARCHAR(MAX);
SET @cmd = '';
DECLARE @TaskCount INT;
DECLARE @TasksPerSecondAvg INT;
DECLARE @AvgWaitTimeInMSPerTask DECIMAL(10,2);
DECLARE @AvgWaitTimeInMSPerSecond DECIMAL(10,2);
DECLARE @TotalWaitTimeInMSOverall DECIMAL(10,2);
DECLARE @LazyWrites1 BIGINT;
DECLARE @LazyWrites2 BIGINT;
DECLARE @FreeListStallsSec1 BIGINT;
DECLARE @FreeListStallsSec2 BIGINT;
DECLARE @BatchReq1 BIGINT;
DECLARE @BatchReq2 BIGINT;
DECLARE @ws TABLE
(
    RunNum INT
    , wait_type SYSNAME
    , waiting_tasks_count BIGINT
    , wait_time_ms BIGINT
    , max_wait_time_ms BIGINT
    , signal_wait_time_ms BIGINT
);
INSERT INTO @ws
SELECT 1, dows.*
FROM sys.dm_os_wait_stats dows
WHERE dows.wait_type LIKE 'PAGEIOLATCH_%'
ORDER BY dows.waiting_tasks_count DESC;

SELECT @LazyWrites1 = cntr_value 
FROM sys.dm_os_performance_counters dopc
WHERE (
        dopc.counter_name LIKE N'Lazy writes/sec%' COLLATE SQL_Latin1_General_CP1_CI_AS
    )
    AND dopc.object_name = N'MSSQL$' + @InstanceName + N':Buffer Manager';

SELECT @FreeListStallsSec1 = cntr_value 
FROM sys.dm_os_performance_counters dopc
WHERE (
        dopc.counter_name LIKE N'Free list stalls/sec%' COLLATE SQL_Latin1_General_CP1_CI_AS
    )
    AND dopc.object_name = N'MSSQL$' + @InstanceName + N':Buffer Manager';

SELECT @BatchReq1 = cntr_value
FROM sys.dm_os_performance_counters dopc
WHERE dopc.counter_name LIKE N'Batch Requests/sec%' COLLATE SQL_Latin1_General_CP1_CI_AS
    AND dopc.object_name = N'MSSQL$' + @InstanceName + N':SQL Statistics';

WAITFOR DELAY @WaitTime;

INSERT INTO @ws
SELECT 2, dows.*
FROM sys.dm_os_wait_stats dows
WHERE dows.wait_type LIKE N'PAGEIOLATCH_%'
ORDER BY dows.waiting_tasks_count DESC;

SELECT @LazyWrites2 = cntr_value 
FROM sys.dm_os_performance_counters dopc
WHERE (
        dopc.counter_name LIKE N'Lazy writes/sec%' COLLATE SQL_Latin1_General_CP1_CI_AS
    )
    AND dopc.object_name = N'MSSQL$' + @InstanceName + N':Buffer Manager';

SELECT @FreeListStallsSec2 = cntr_value 
FROM sys.dm_os_performance_counters dopc
WHERE (
        dopc.counter_name LIKE N'Free list stalls/sec%' COLLATE SQL_Latin1_General_CP1_CI_AS
    )
    AND dopc.object_name = N'MSSQL$' + @InstanceName + N':Buffer Manager';

SELECT @TaskCount = SUM(w2.waiting_tasks_count - w1.waiting_tasks_count)
    , @TasksPerSecondAvg = CONVERT(DECIMAL(10,2), (SUM(w2.waiting_tasks_count) - SUM(w1.waiting_tasks_count))) / @NumSeconds
    , @AvgWaitTimeInMSPerTask = CONVERT(DECIMAL(10,2),(SUM(w2.wait_time_ms) - SUM(w1.wait_time_ms))) / CONVERT(DECIMAL(10,2),(SUM(w2.waiting_tasks_count) - SUM(w1.waiting_tasks_count)))
    , @AvgWaitTimeInMSPerSecond = (CONVERT(DECIMAL(10,2), (SUM(w2.waiting_tasks_count) - SUM(w1.waiting_tasks_count))) / @NumSeconds) * (CONVERT(DECIMAL(10,2),(SUM(w2.wait_time_ms) - SUM(w1.wait_time_ms))) / CONVERT(DECIMAL(10,2),(SUM(w2.waiting_tasks_count) - SUM(w1.waiting_tasks_count))))
    , @TotalWaitTimeInMSOverall = SUM(w2.wait_time_ms) - SUM(w1.wait_time_ms)
FROM (SELECT * FROM @ws ws1 WHERE ws1.RunNum = 1) w1
    INNER JOIN (SELECT * FROM @ws ws2 WHERE ws2.RunNum = 2) w2 ON w1.wait_type = w2.wait_type
WHERE (w2.waiting_tasks_count - w1.waiting_tasks_count) > 0;

SELECT @BatchReq2 = cntr_value
FROM sys.dm_os_performance_counters dopc
WHERE dopc.counter_name LIKE N'Batch Requests/sec%' COLLATE SQL_Latin1_General_CP1_CI_AS
    AND dopc.object_name = N'MSSQL$' + @InstanceName + N':SQL Statistics';

/*
    configured values for max server memory and min server memory, etc
*/
DECLARE @MaxServerMemory BIGINT;
DECLARE @MaxServerMemoryPages BIGINT;
DECLARE @MinServerMemory BIGINT;
DECLARE @MinPLE BIGINT;
DECLARE @RamMB BIGINT;
DECLARE @BufferPoolCommittedMB BIGINT;
DECLARE @BufferPoolCommitTargetMB BIGINT;
DECLARE @PercentOfDesiredSizeMB INT;
DECLARE @TargetPageLifeExpectancyPer4GB BIGINT;
SET @TargetPageLifeExpectancyPer4GB = 60 * 120; /* 120 minutes */
/*DECLARE @VMType VARCHAR(255);*/
DECLARE @PLESeconds BIGINT;

SELECT @MaxServerMemory = CONVERT(BIGINT,c.value)
FROM sys.configurations c
WHERE c.name = N'max server memory (mb)'

SET @MaxServerMemoryPages = @MaxServerMemory / 128; /* 8KB pages */

SELECT @MinServerMemory = CONVERT(BIGINT,c.value)
FROM sys.configurations c
WHERE c.name = N'min server memory (mb)'

SET @MinPLE = @MaxServerMemory / 4096E0 * @TargetPageLifeExpectancyPer4GB;

IF @VersionINT < 11
BEGIN
    SET @cmd = 'SELECT 
    @RamMB = dosi.physical_memory_in_bytes / 1048576
    , @BufferPoolCommittedMB = dosi.bpool_committed * 8192E0 / 1048576
    , @BufferPoolCommitTargetMB = dosi.bpool_commit_target * 8192E0 / 1048576
    , @PercentOfDesiredSizeMB = CONVERT(INT,(CONVERT(DECIMAL(18,2),dosi.bpool_committed) / dosi.bpool_commit_target) * 100)
FROM sys.dm_os_sys_info dosi;
';
END
ELSE 
BEGIN 
SET @cmd = 'SELECT 
    @RamMB = dosi.physical_memory_kb / 1024
    , @BufferPoolCommittedMB = dosi.committed_kb / 1024
    , @BufferPoolCommitTargetMB = dosi.committed_target_kb / 1024
    , @PercentOfDesiredSizeMB = CONVERT(INT,(CONVERT(DECIMAL(18,2),dosi.committed_kb) / dosi.committed_target_kb) * 100)
FROM sys.dm_os_sys_info dosi;';
END
EXEC sp_executesql @cmd
    , N'@RamMB BIGINT OUTPUT, @BufferPoolCommittedMB BIGINT OUTPUT, @BufferPoolCommitTargetMB BIGINT OUTPUT, @PercentOfDesiredSizeMB INT OUTPUT' 
    , @RamMB = @RamMB OUT
    , @BufferPoolCommittedMB = @BufferPoolCommittedMB OUT
    , @BufferPoolCommitTargetMB = @BufferPoolCommitTargetMB OUT
    , @PercentOfDesiredSizeMB = @PercentOfDesiredSizeMB OUT;

/*
    Page Life Expectancy for all memory nodes
*/
SELECT @PLESeconds = CONVERT(BIGINT, cntr_value) 
FROM sys.dm_os_performance_counters dopc
WHERE dopc.counter_name LIKE N'Page Life Expectancy%' COLLATE SQL_Latin1_General_CP1_CI_AS
    AND dopc.object_name = N'MSSQL$' + @InstanceName + N':Buffer Manager';

/*
    Total data in all user-databases.
*/
DECLARE @TotalDBSpaceUsed TABLE
(
    TotalSpaceUsedInMB BIGINT
);
DECLARE @SpaceUsedInMB BIGINT;
SET @cmd = '';
SELECT @cmd = @cmd + CASE WHEN @cmd = '' THEN '' ELSE '
UNION ALL
' END + 
'
SELECT DatabaseName = ''' + d.name + ''' 
    , AllocType = au.type_desc
    , TotalPagesInMB = SUM(au.total_pages) * 8192E0 / 1048576
FROM ' + QUOTENAME(d.name) + '.sys.allocation_units au
WHERE au.type > 0
GROUP BY au.type_desc
'
FROM master.sys.databases d
WHERE d.database_id > 4;
SET @cmd = 'SELECT SUM(TotalPagesInMB)
FROM (
' + @cmd + '
) t;'; 
INSERT INTO @TotalDBSpaceUsed (TotalSpaceUsedInMB)
EXEC sp_executesql @cmd;
SELECT @SpaceUsedInMB = TDSU.TotalSpaceUsedInMB
FROM @TotalDBSpaceUsed TDSU;

IF @Debug = 1
BEGIN
    SELECT ServerName = @@SERVERNAME
        , InstanceName = @InstanceName
        , DatabaseSpaceUsedMB = @SpaceUsedInMB
        , PLEinSeconds = @PLESeconds
        , MinAcceptablePLE = @MinPLE
        , MinServerMemoryMB = @MinServerMemory
        , MaxServerMemoryMB = @MaxServerMemory
        , TotalServerRAMinMB = @RamMB
        , BufferPoolCommittedMB = @BufferPoolCommittedMB
        , BufferPoolCommitTargetMB = @BufferPoolCommitTargetMB
        , PercentBufferPoolCommitted = @PercentOfDesiredSizeMB
        , BatchReqPerSecond = (@BatchReq2 - @BatchReq1) / @NumSeconds
        , LazyWritesPerSecond = (@LazyWrites2 - @LazyWrites1) / @NumSeconds
        , FreeListStallsPerSecond = (@FreeListStallsSec2 - @FreeListStallsSec2) / @NumSeconds
        /*, VMType = @VMType*/
        , IOTaskCount = @TaskCount 
        , TaskPerSecondAvg = @TasksPerSecondAvg 
        , AvgWaitTimeInMSPerTask = @AvgWaitTimeInMSPerTask 
        , AvgWaitTimeInMSPerSecond = @AvgWaitTimeInMSPerSecond 
        , TotalWaitTimeInMSOverall  = @TotalWaitTimeInMSOverall
        , SamplePeriodinSec = @NumSeconds;

    SELECT MaxServerMemorySuggested = 
            CASE WHEN @BufferPoolCommittedMB < @BufferPoolCommitTargetMB 
            THEN @BufferPoolCommittedMB 
            ELSE ((CONVERT(DECIMAL(18,4), @MinPLE) / @PLESeconds) * @MaxServerMemory) 
                    + (((@LazyWrites2 - @LazyWrites1) / @NumSeconds) * 64) 
                    + ((@FreeListStallsSec2 - @FreeListStallsSec2) / @NumSeconds) * 64 
            END
        , Reason = CASE WHEN @BufferPoolCommittedMB < @BufferPoolCommitTargetMB THEN N'Committed MB less than current Max Server Memory'
            ELSE N'Calculated based on PLE, Lazy Writes / second and List Stalls / second' END
        , LazyWritesX64 = (((@LazyWrites2 - @LazyWrites1) / @NumSeconds) * 64)
        , ListStallsX64 = ((@FreeListStallsSec2 - @FreeListStallsSec2) / @NumSeconds) * 64;
END

DECLARE @Out TABLE
(
    KeyID INT IDENTITY(1,1)
    , ItemDesc NVARCHAR(255)
    , ItemValue SQL_VARIANT
    , IsDebug BIT DEFAULT(0)
);

INSERT INTO @Out (ItemDesc, ItemValue, IsDebug)
VALUES (N'Server Name', CONVERT(NVARCHAR(255),@@SERVERNAME), 1);

INSERT INTO @Out (ItemDesc, ItemValue)
VALUES (N'Data Space Used (MB)', @SpaceUsedInMB);

INSERT INTO @Out (ItemDesc, ItemValue)
VALUES (N'Page Life Expectancy (sec)', @PLESeconds);

INSERT INTO @Out (ItemDesc, ItemValue)
VALUES (N'Minimum Acceptable Page Life Expectancy (sec)', @MinPLE);

INSERT INTO @Out (ItemDesc, ItemValue)
VALUES (N'Minimum Server Memory (MB)', @MinServerMemory);

INSERT INTO @Out (ItemDesc, ItemValue)
VALUES (N'Maximum Server Memory (MB)', @MaxServerMemory);

INSERT INTO @Out (ItemDesc, ItemValue)
VALUES (N'Total Server RAM in MB', @RamMB);

INSERT INTO @Out (ItemDesc, ItemValue)
VALUES (N'Buffer Pool Committed MB', @BufferPoolCommittedMB);

INSERT INTO @Out (ItemDesc, ItemValue)
VALUES (N'Buffer Pool Commit Target MB', @BufferPoolCommitTargetMB);

INSERT INTO @Out (ItemDesc, ItemValue)
VALUES (N'Percent of Buffer Pool Committed', @PercentOfDesiredSizeMB);

INSERT INTO @Out (ItemDesc, ItemValue)
VALUES (N'Batch Requests Per Second', (@BatchReq2 - @BatchReq1) / @NumSeconds);

INSERT INTO @Out (ItemDesc, ItemValue)
VALUES (N'Lazy Writes Per Second', (@LazyWrites2 - @LazyWrites1) / @NumSeconds);

INSERT INTO @Out (ItemDesc, ItemValue)
VALUES (N'Free List Stalls Per Second', (@FreeListStallsSec2 - @FreeListStallsSec2) / @NumSeconds);

INSERT INTO @Out (ItemDesc, ItemValue)
VALUES (N'IO Task Count', @TaskCount);

INSERT INTO @Out (ItemDesc, ItemValue)
VALUES (N'Task Per Second Avg', @TasksPerSecondAvg);

INSERT INTO @Out (ItemDesc, ItemValue)
VALUES (N'Avg Wait Time In MS Per Task', @AvgWaitTimeInMSPerTask);

INSERT INTO @Out (ItemDesc, ItemValue)
VALUES (N'Avg Wait Time In MS Per Second', @AvgWaitTimeInMSPerSecond);

INSERT INTO @Out (ItemDesc, ItemValue)
VALUES (N'Total Wait Time In MS Overall', @TotalWaitTimeInMSOverall);

INSERT INTO @Out (ItemDesc, ItemValue)
VALUES (N'Sample Period in Seconds', @NumSeconds);

INSERT INTO @Out (ItemDesc, ItemValue)
VALUES (N'Lazy Writes per Second', ((@LazyWrites2 - @LazyWrites1) / @NumSeconds));

INSERT INTO @Out (ItemDesc, ItemValue)
VALUES (N'List Stalls per Second', ((@FreeListStallsSec2 - @FreeListStallsSec2) / @NumSeconds));

INSERT INTO @Out (ItemDesc, ItemValue)
VALUES (N'Recommended Max Memory (MB)', N'');

INSERT INTO @Out (ItemDesc, ItemValue)
VALUES (N'Recommended Max Memory Reason', N'');

INSERT INTO @Out (ItemDesc, ItemValue, IsDebug)
VALUES (N'Recommended Max Memory Signal', 0, 1);

/*
    Add memory if Lazy Writes occurred
    Add 64MB per Lazy Write (just for fun)
*/
DECLARE @LazyWritesMB INT;
SET @LazyWritesMB = (((@LazyWrites2 - @LazyWrites1) / @NumSeconds) * 64);

/*
    Add memory if Free List Stalls occurred
    Add 128MB per Free List Stall
*/
DECLARE @FreeListStallMB INT;
SET @FreeListStallMB = (((@FreeListStallsSec2 - @FreeListStallsSec2) / @NumSeconds) * 128);

/*
    Add the Additional memory requirements to the Recommended Max Memory row
*/
DECLARE @AdditionalMemory INT;
SET @AdditionalMemory = 
    @LazyWritesMB
    + @FreeListStallMB;

IF (@MaxServerMemory + @AdditionalMemory < 1024) AND (@PLESeconds >= @MinPLE)
BEGIN
    UPDATE @Out 
    SET ItemValue = @MaxServerMemory
    WHERE ItemDesc = N'Recommended Max Memory (MB)';

    UPDATE @Out 
    SET ItemValue = 'Max Server Memory is low, however PLE is acceptable'
    WHERE ItemDesc = N'Recommended Max Memory Reason';

    UPDATE @Out 
    SET ItemValue = 1
    WHERE ItemDesc = N'Recommended Max Memory Signal';
END

IF ((@BufferPoolCommittedMB + @AdditionalMemory) < @BufferPoolCommitTargetMB) AND (@PLESeconds >= @MinPLE)
BEGIN
    UPDATE @Out 
    SET ItemValue = @BufferPoolCommittedMB + @AdditionalMemory
    WHERE ItemDesc = N'Recommended Max Memory (MB)';

    UPDATE @Out 
    SET ItemValue = 'Buffer pool committed is less than Max Server Memory, and PLE is acceptable.'
    WHERE ItemDesc = N'Recommended Max Memory Reason';

    UPDATE @Out 
    SET ItemValue = 2
    WHERE ItemDesc = N'Recommended Max Memory Signal';
END

DECLARE @PLEMultiplier DECIMAL(10,2);
SET @PLEMultiplier = (CONVERT(DECIMAL(10,2),@MinPLE) / CONVERT(DECIMAL(10,2), @PLESeconds));
IF @PLEMultiplier < 0.90 SET @PLEMultiplier = 0.90;
IF @PLEMultiplier > 1.10 SET @PLEMultiplier = 1.10;

INSERT INTO @Out (ItemDesc, ItemValue, IsDebug)
VALUES (N'PLE Multiplier', @PLEMultiplier, 1);

IF /*(@MaxServerMemory + @AdditionalMemory >= 1024) AND*/ (@PLESeconds <= @MinPLE)
BEGIN
    UPDATE @Out 
    SET ItemValue = 
        (SELECT TOP(1) Inc
        FROM (
            SELECT Inc = t.RowNum * 256
            FROM (
                SELECT RowNum = CONVERT(BIGINT,ROW_NUMBER() OVER (ORDER BY o.object_id))
                FROM sys.objects o, sys.objects o1
                ) t
            WHERE (t.RowNum * 256) <  CONVERT(BIGINT,POWER(2,30))
            ) t1
        WHERE t1.Inc > CONVERT(INT, (@MaxServerMemory * @PLEMultiplier))
        ORDER BY t1.Inc)
    WHERE ItemDesc = N'Recommended Max Memory (MB)';

    UPDATE @Out 
    SET ItemValue = 'Low PLE indicates Max Server Memory should be adjusted upwards.'
    WHERE ItemDesc = N'Recommended Max Memory Reason';

    UPDATE @Out 
    SET ItemValue = 3
    WHERE ItemDesc = N'Recommended Max Memory Signal';
END

IF (@MaxServerMemory + @AdditionalMemory >= 1024) AND (@PLESeconds > @MinPLE)
BEGIN
    UPDATE @Out 
    SET ItemValue = 
        (SELECT TOP(1) Inc
        FROM (
            SELECT Inc = t.RowNum * 256
            FROM (
                SELECT RowNum = CONVERT(BIGINT,ROW_NUMBER() OVER (ORDER BY o.object_id))
                FROM sys.objects o, sys.objects o1
                ) t
            WHERE (t.RowNum * 256) <  CONVERT(BIGINT,POWER(2,30))
            ) t1
        WHERE t1.Inc <= CONVERT(INT, (@MaxServerMemory * @PLEMultiplier))
        ORDER BY t1.Inc DESC)
    WHERE ItemDesc = N'Recommended Max Memory (MB)';

    UPDATE @Out 
    SET ItemValue = 'High PLE indicates Max Server Memory could be adjusted downwards.'
    WHERE ItemDesc = N'Recommended Max Memory Reason';

    UPDATE @Out 
    SET ItemValue = 4
    WHERE ItemDesc = N'Recommended Max Memory Signal';
END

DECLARE @RecommendedMaxServerMemory INT;
SELECT  @RecommendedMaxServerMemory = CONVERT(INT,ItemValue)
FROM @Out o 
WHERE o.ItemDesc = N'Recommended Max Memory (MB)';

IF @RecommendedMaxServerMemory > (@MaxServerMemory * 0.96)
    AND @RecommendedMaxServerMemory < (@MaxServerMemory * 1.04)
BEGIN
    UPDATE @Out
    SET ItemValue = @MaxServerMemory
    WHERE ItemDesc = N'Recommended Max Memory (MB)';
    UPDATE @Out
    SET ItemValue = 'No changed recommended'
    WHERE ItemDesc = N'Recommended Max Memory Reason';
    UPDATE @Out 
    SET ItemValue = 0
    WHERE ItemDesc = N'Recommended Max Memory Signal';
END 

IF (@HTMLOutput = 1)
BEGIN
    SELECT ItemValue
        , HTMLOutput = '<table>' + 
            (
                SELECT 'td' = ItemDesc
                    , ''
                    , 'td' = ItemValue
                    , ''
                FROM @Out o
                WHERE CASE WHEN @Debug = 0 THEN o.IsDebug ELSE 0 END = 0
                ORDER BY o.KeyID
                FOR XML PATH('tr')
            ) +
            '</table>'
    FROM @Out o
    WHERE o.ItemDesc = N'Recommended Max Memory Signal';
END
ELSE
BEGIN
    SELECT *
    FROM @Out o
    WHERE CASE WHEN @Debug = 0 THEN o.IsDebug ELSE 0 END = 0
    ORDER BY o.KeyID;
END

এই কোডটি পিএলইয়ের তুলনা max server memoryকরে সিস্টেমের পরিমাণের জন্য ন্যূনতম "গ্রহণযোগ্য" পিএলইয়ের তুলনা করে । PLE গ্রহণযোগ্য সংখ্যার চেয়ে appreciably উচ্চতর হয়, তাহলে এটি 10% সর্বোচ্চ কমে দাড়ায় max server memory। যদি PLE গ্রহণযোগ্য PLE এর চেয়ে কম হয় তবে এটি সর্বোচ্চ 10% বেশি প্রস্তাব দেয় max server memory

প্রতিশ্রুতিবদ্ধ বাফার পুলের প্রকৃত পরিমাণ যদি লক্ষ্য বাফার পুলের আকারের চেয়ে কম হয় তবে এটি max server memoryসেই পরিমাণে কমিয়ে আনার পরামর্শ দেয় , পাশাপাশি থ্রেড, অলস লেখার জন্য কিছু অতিরিক্ত মেমরি sugges

কোডটি অলস রাইটস / সেকেন্ড, ফ্রি তালিকা স্টল এবং ব্যাচের অনুরোধগুলির মতো জিনিসের জন্য বিভিন্ন পারফরম্যান্স কাউন্টারগুলিকেও দেখে।

কোডটি নিখুঁত নয়, আমি ইনপুট পেতে এবং ভবিষ্যতের এসও ব্যবহারকারীদের সুবিধার্থে এটি এখানে ভাগ করছি।


1
আপনি এসকিউএল সার্ভার থেকে শুরু ম্যাক্স মাইন্ড 2012 বাফার পুল লক্ষ্য এবং প্রতিশ্রুতিবদ্ধ কোনও বোধগম্য নয় এবং এই কাউন্টারগুলি হ্রাস করা হয়েছে। পরিবর্তে আপনাকে অবশ্যই মেমোরি ম্যানেজার টার্গেট কমিটেড (কেবি) এবং বর্তমান প্রতিশ্রুতিবদ্ধ ব্যবহার করতে হবে। এটির কেন ভুল মূল্য দেয় সে সম্পর্কে যদি আপনি আরও পড়তে চান তবে সোস্যাল.টেকনেট.মাইক্রোসফট
উইকি /
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.