নির্দিষ্ট উদাহরণস্বরূপ ডাটাবেসের মাধ্যমে সিপিইউ ব্যবহার কীভাবে পাবেন?


15

ডাটাবেসের মাধ্যমে সিপিইউ ব্যবহার সনাক্ত করতে আমি নীচের প্রশ্নগুলি পেয়েছি, তবে তারা বিভিন্ন ফলাফল দেখাচ্ছে:

WITH DB_CPU_Stats
AS
(
    SELECT DatabaseID, DB_Name(DatabaseID) AS [DatabaseName], 
      SUM(total_worker_time) AS [CPU_Time_Ms]
    FROM sys.dm_exec_query_stats AS qs
    CROSS APPLY (
                    SELECT CONVERT(int, value) AS [DatabaseID] 
                  FROM sys.dm_exec_plan_attributes(qs.plan_handle)
                  WHERE attribute = N'dbid') AS F_DB
    GROUP BY DatabaseID
)
SELECT ROW_NUMBER() OVER(ORDER BY [CPU_Time_Ms] DESC) AS [row_num],
       DatabaseName,
        [CPU_Time_Ms], 
       CAST([CPU_Time_Ms] * 1.0 / SUM([CPU_Time_Ms]) OVER() * 100.0 AS DECIMAL(5, 2)) AS [CPUPercent]
FROM DB_CPU_Stats
--WHERE DatabaseID > 4 -- system databases
--AND DatabaseID <> 32767 -- ResourceDB
ORDER BY row_num OPTION (RECOMPILE);

উপরের ক্যোয়ারীটি বলেছে যে সমস্যাটি আমার একটি ডাটাবেসে (প্রায় 96%)।

এবং নীচের ক্যোয়ারীটি জানায় যে সমস্যাটি মাস্টার এবং বিতরণ ডাটাবেসের সাথে (প্রায় 90%):

DECLARE @total INT
SELECT @total=sum(cpu) FROM sys.sysprocesses sp (NOLOCK)
    join sys.sysdatabases sb (NOLOCK) ON sp.dbid = sb.dbid

SELECT sb.name 'database', @total 'system cpu', SUM(cpu) 'database cpu', CONVERT(DECIMAL(4,1), CONVERT(DECIMAL(17,2),SUM(cpu)) / CONVERT(DECIMAL(17,2),@total)*100) '%'
FROM sys.sysprocesses sp (NOLOCK)
JOIN sys.sysdatabases sb (NOLOCK) ON sp.dbid = sb.dbid
--WHERE sp.status = 'runnable'
GROUP BY sb.name
ORDER BY CONVERT(DECIMAL(4,1), CONVERT(DECIMAL(17,2),SUM(cpu)) / CONVERT(DECIMAL(17,2),@total)*100) desc

আমি এটি পরীক্ষা করে sys.sysprocessesদেখেছি এর অর্থ কি দ্বিতীয় ক্যোয়ারীর ফলাফলগুলি ভুল?

উত্তর:


14

আমি @ থমাসের মতো, "প্রতি ডেটাবেসস সিপিইউ ব্যবহার" যে কোনওটি সঠিক বা কার্যকর হওয়ায় উদ্বেগ সম্পর্কিত প্রশ্নে মন্তব্যে @ অ্যারনের সাথে সম্পূর্ণরূপে একমত হয়েছি, তবে আমি অন্তত এই প্রশ্নের দুটি কারণ কেন এমন প্রশ্নের উত্তর দিতে পারি? আলাদা। এবং কেন এগুলি পৃথক হওয়ার কারণটি ইঙ্গিত দেবে যে কোনটি আরও সঠিক, যদিও উচ্চতর স্তরের নির্ভুলতা এখনও বিশেষভাবে ভুলের সাথে তুলনামূলক, সুতরাং এখনও সত্যই সঠিক নয় ;-)।

প্রথম ক্যোয়ারী সিপিইউ তথ্য (যেমন ) পেতে sys.dm_exec_query_stats ব্যবহার করে total_worker_time। যদি আপনি সেই ডিএমভির জন্য এমএসডিএন ডকুমেন্টেশনযুক্ত লিঙ্কযুক্ত পৃষ্ঠায় যান তবে আপনি একটি সংক্ষিপ্ত, 3 টি বাক্য প্রবর্তন এবং সেই বাক্যগুলির মধ্যে 2 টি এই তথ্যের প্রসঙ্গে বুঝতে আমাদের যা প্রয়োজন তা আমাদের বেশিরভাগই দেন ("এটি কতটা নির্ভরযোগ্য" এবং "এটি এর সাথে কীভাবে তুলনা করে sys.sysprocesses")। এই দুটি বাক্য হ'ল:

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

প্রথম বাক্য, " সমষ্টিগত পারফরম্যান্সের পরিসংখ্যানগুলি দেখায়", আমাদের জানায় যে এই ডিএমভিতে থাকা তথ্যগুলি (অন্য বেশিরভাগের মতো) সংশ্লেষজনক এবং বর্তমানে চলমান অনুসন্ধানগুলির জন্য নির্দিষ্ট নয়। এটি সেই ডিএমভিতে এমন একটি ক্ষেত্র দ্বারাও ইঙ্গিত করা হয়েছে যা প্রশ্নের ক্যোয়ারির অংশ নয় execution_count, যা আবার দেখায় যে এটি संचयी ডেটা। এবং এই হিসাবে ডেটা ক্রমবর্ধমান হওয়া খুব সহজ যেহেতু আপনি গড় ইত্যাদি অর্জন করতে পারেন কারণ দ্বারা কিছু মেট্রিককে ভাগ করে execution_count

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

এখন উপরের সাথে বিপরীতে করা যাক sys.sysprocesses। এই সিস্টেমের ভিউতে কেবল বর্তমানে কী চলছে তা দেখানো হচ্ছে ঠিক একইভাবে sys.dm_exec_connitions , sys.dm_exec_sessions এবং sys.dm_exec_requests (যা সংযুক্ত পৃষ্ঠায় বর্ণিত হয়েছে sys.dm_exec_sessions) এর সংমিশ্রণের মতো । sys.dm_exec_query_statsপ্রক্রিয়া শেষ হওয়ার পরেও এটি ডিএমভির তুলনায় সার্ভারের সম্পূর্ণ ভিন্ন দৃষ্টিভঙ্গি যা ডেটা ধরে রাখে। অর্থ, সম্পর্কিত "দ্বিতীয় ক্যোয়ারী থেকে ফলাফল ভুল আছে?" প্রশ্ন, এগুলি ভুল নয়, তারা কেবল পারফরম্যান্সের পরিসংখ্যানের একটি ভিন্ন দিক (যেমন সময়সীমা) এর সাথে সম্পর্কিত।

সুতরাং, কোয়েরিটি sys.sysprocessesকেবল "এখনই" দেখছে at এবং ব্যবহার sys.dm_exec_query_statsকরা ক্যোয়ারীটি বেশিরভাগ (সম্ভবত) এসকিউএল সার্ভার পরিষেবাদির শেষ পুনর্সূচনা (বা সম্ভবত সিস্টেম রিবুট) পরে যা ঘটেছে তা দেখছে । সাধারণ পারফরম্যান্স বিশ্লেষণের জন্য মনে হয় এটি sys.dm_exec_query_statsঅনেক ভাল, তবে আবার এটি দরকারী তথ্য সর্বদা ফেলে দেয়। এবং উভয় ক্ষেত্রেই আপনাকে প্রথম স্থানটিতে "ডাটাবেস_আইডি" মানটির যথার্থতা সম্পর্কে প্রশ্ন মন্তব্যে (আরম্ভ করা হয়েছে) @ অ্যারোন দ্বারা তৈরি পয়েন্টগুলিও বিবেচনা করা উচিত (অর্থাত্ এটি কোডটি শুরু করা সক্রিয় ডিবি প্রতিফলিত করে) , "ইস্যু" যে ঘটছে তা অগত্যা নয়)।

কিন্তু, যদি আপনি শুধু প্রয়োজন / এই মুহূর্তে সব ডেটাবেস জুড়ে ঘটছে একটা ধারনা পেতে চান, সম্ভবত কারণ কিছু গতি কমে এখন ডান, আপনি সমন্বয় ব্যবহার করে লাভও নেই sys.dm_exec_connections, sys.dm_exec_sessionsএবং sys.dm_exec_requests(এবং অবচিত sys.sysprocesses)। শুধু মনে রাখবেন যে আপনার জন্য / এ খুঁজছেন প্রশ্নের , না ডাটাবেস এক বা একাধিক ডেটাবেস ইত্যাদি থেকে, কারণ প্রশ্নের একাধিক ডাটাবেস জুড়ে যোগ দিতে পারেন, UDFs অন্তর্ভুক্ত


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

নিম্নলিখিত ক্যোয়ারী উচ্চ গড় সিপিইউ ব্যবহারের সাথে অনুসন্ধানগুলি সনাক্ত করতে সহায়তা করবে। এটি ক্যোরি_স্ট্যাটস ডিএমভি-তে ডেটাটি কনডেন্স করে যেহেতু সেই রেকর্ডগুলি একই ক্যোয়ারী (হ্যাঁ, ক্যোয়ারী ব্যাচের একই উপসেট) একাধিকবার প্রদর্শন করতে পারে, প্রতিটি পৃথক প্রয়োগের পরিকল্পনা সহ with

;WITH cte AS
(
  SELECT stat.[sql_handle],
         stat.statement_start_offset,
         stat.statement_end_offset,
         COUNT(*) AS [NumExecutionPlans],
         SUM(stat.execution_count) AS [TotalExecutions],
         ((SUM(stat.total_logical_reads) * 1.0) / SUM(stat.execution_count)) AS [AvgLogicalReads],
         ((SUM(stat.total_worker_time) * 1.0) / SUM(stat.execution_count)) AS [AvgCPU]
  FROM sys.dm_exec_query_stats stat
  GROUP BY stat.[sql_handle], stat.statement_start_offset, stat.statement_end_offset
)
SELECT CONVERT(DECIMAL(15, 5), cte.AvgCPU) AS [AvgCPU],
       CONVERT(DECIMAL(15, 5), cte.AvgLogicalReads) AS [AvgLogicalReads],
       cte.NumExecutionPlans,
       cte.TotalExecutions,
       DB_NAME(txt.[dbid]) AS [DatabaseName],
       OBJECT_NAME(txt.objectid, txt.[dbid]) AS [ObjectName],
       SUBSTRING(txt.[text], (cte.statement_start_offset / 2) + 1,
       (
         (CASE cte.statement_end_offset 
           WHEN -1 THEN DATALENGTH(txt.[text])
           ELSE cte.statement_end_offset
          END - cte.statement_start_offset) / 2
         ) + 1
       )
FROM cte
CROSS APPLY sys.dm_exec_sql_text(cte.[sql_handle]) txt
ORDER BY cte.AvgCPU DESC;

হয় AvgCPUমিলিসেকেন্ডে?
কলব ক্যানিয়ন

হাই @ কলবক্যানিয়ন ডকুমেন্টেশন মতে sys.dm_exec_query_stats , total_worker_time"হয় CPU- র সময় মোট পরিমাণ, মাইক্রোসেকেন্ড (কিন্তু শুধুমাত্র মিলিসেকেন্ড সঠিক) রিপোর্ট, যে এই পরিকল্পনার মৃত্যুদণ্ড কার্যকর দ্বারা ক্ষয়প্রাপ্ত হয় যেহেতু এটি সংকলন করেছেন। "। এটা কি সাহায্য করে? আপনি যদি এটি দেখতে চান তবে এটি সহজেই মিলি সেকেন্ডে রূপান্তরিত হতে পারে।
সলোমন রুটজকি

1

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

SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED
GO
WITH DB_CPU_Stats
AS
(
    SELECT DatabaseID, isnull(DB_Name(DatabaseID),case DatabaseID when 32767 then 'Internal ResourceDB' else CONVERT(varchar(255),DatabaseID)end) AS [DatabaseName], 
      SUM(total_worker_time) AS [CPU_Time_Ms],
      SUM(total_logical_reads)  AS [Logical_Reads],
      SUM(total_logical_writes)  AS [Logical_Writes],
      SUM(total_logical_reads+total_logical_writes)  AS [Logical_IO],
      SUM(total_physical_reads)  AS [Physical_Reads],
      SUM(total_elapsed_time)  AS [Duration_MicroSec],
      SUM(total_clr_time)  AS [CLR_Time_MicroSec],
      SUM(total_rows)  AS [Rows_Returned],
      SUM(execution_count)  AS [Execution_Count],
      count(*) 'Plan_Count'
    FROM sys.dm_exec_query_stats AS qs
    CROSS APPLY (
                    SELECT CONVERT(int, value) AS [DatabaseID] 
                  FROM sys.dm_exec_plan_attributes(qs.plan_handle)
                  WHERE attribute = N'dbid') AS F_DB
    GROUP BY DatabaseID
)
SELECT ROW_NUMBER() OVER(ORDER BY [CPU_Time_Ms] DESC) AS [Rank_CPU],
       DatabaseName,
       [CPU_Time_Hr] = convert(decimal(15,2),([CPU_Time_Ms]/1000.0)/3600) ,
        CAST([CPU_Time_Ms] * 1.0 / SUM(case [CPU_Time_Ms] when 0 then 1 else [CPU_Time_Ms] end) OVER() * 100.0 AS DECIMAL(5, 2)) AS [CPU_Percent],
       [Duration_Hr] = convert(decimal(15,2),([Duration_MicroSec]/1000000.0)/3600) , 
       CAST([Duration_MicroSec] * 1.0 / SUM(case [Duration_MicroSec] when 0 then 1 else [Duration_MicroSec] end) OVER() * 100.0 AS DECIMAL(5, 2)) AS [Duration_Percent],    
       [Logical_Reads],
        CAST([Logical_Reads] * 1.0 / SUM(case [Logical_Reads] when 0 then 1 else [Logical_Reads] end) OVER() * 100.0 AS DECIMAL(5, 2)) AS [Logical_Reads_Percent],      
       [Rows_Returned],
        CAST([Rows_Returned] * 1.0 / SUM(case [Rows_Returned] when 0 then 1 else [Rows_Returned] end) OVER() * 100.0 AS DECIMAL(5, 2)) AS [Rows_Returned_Percent],
       [Reads_Per_Row_Returned] = [Logical_Reads]/(case [Rows_Returned] when 0 then 1 else [Rows_Returned] end),
       [Execution_Count],
        CAST([Execution_Count] * 1.0 / SUM(case [Execution_Count]  when 0 then 1 else [Execution_Count] end) OVER() * 100.0 AS DECIMAL(5, 2)) AS [Execution_Count_Percent],
       [Physical_Reads],
       CAST([Physical_Reads] * 1.0 / SUM(case [Physical_Reads] when 0 then 1 else [Physical_Reads] end ) OVER() * 100.0 AS DECIMAL(5, 2)) AS [Physcal_Reads_Percent], 
       [Logical_Writes],
        CAST([Logical_Writes] * 1.0 / SUM(case [Logical_Writes] when 0 then 1 else [Logical_Writes] end) OVER() * 100.0 AS DECIMAL(5, 2)) AS [Logical_Writes_Percent],
       [Logical_IO],
        CAST([Logical_IO] * 1.0 / SUM(case [Logical_IO] when 0 then 1 else [Logical_IO] end) OVER() * 100.0 AS DECIMAL(5, 2)) AS [Logical_IO_Percent],
       [CLR_Time_MicroSec],
       CAST([CLR_Time_MicroSec] * 1.0 / SUM(case [CLR_Time_MicroSec] when 0 then 1 else [CLR_Time_MicroSec] end ) OVER() * 100.0 AS DECIMAL(5, 2)) AS [CLR_Time_Percent],
       [CPU_Time_Ms],[CPU_Time_Ms]/1000 [CPU_Time_Sec],
       [Duration_MicroSec],[Duration_MicroSec]/1000000 [Duration_Sec]
FROM DB_CPU_Stats
WHERE DatabaseID > 4 -- system databases
AND DatabaseID <> 32767 -- ResourceDB
ORDER BY [Rank_CPU] OPTION (RECOMPILE);

0

আমি সিপিইউয়ের ক্যোয়ারীটি sys.dm_exec_query_statsএতটা পছন্দ করেছি যে আমি এটি প্রসারিত করেছি। এটি এখনও সিপিইউ দ্বারা স্থান পেয়েছে তবে আমি আরও ভাল সার্ভার প্রোফাইল পেতে অন্যান্য যোগফল এবং পার্সেন্ট যুক্ত করেছি। এই অনুলিপিটি এক্সেলের মধ্যে দুর্দান্ত প্রতিলিপি এবং শতকরা ভাগ কলামগুলিতে শর্তযুক্ত রঙ বিন্যাস সহ, সবচেয়ে খারাপ সংখ্যাগুলি সুন্দরভাবে দাঁড়ায়। আমি 3 গ্রেডযুক্ত 'গ্রেডেড কালার স্কেল' ব্যবহার করেছি; উচ্চ মানের জন্য একটি গোলাপ রঙ, মাঝারি জন্য হলুদ, কম জন্য সবুজ।

আমি একটি লেবেল যুক্ত করেছি database id 32676যার জন্য অভ্যন্তরীণ এসকিউএল রিসোর্স ডেটাবেস। সময়ের ব্যবহারের আরও ভাল ধারণা পেতে আমি সিপিইউ এবং সময়কালকে ঘন্টাকে রূপান্তর করি।

WITH DB_CPU_Stats
AS
(
    SELECT DatabaseID, isnull(DB_Name(DatabaseID),case DatabaseID when 32767 then 'Internal ResourceDB' else CONVERT(varchar(255),DatabaseID)end) AS [DatabaseName], 
      SUM(total_worker_time) AS [CPU Time Ms],
      SUM(total_logical_reads)  AS [Logical Reads],
      SUM(total_logical_writes)  AS [Logical Writes],
      SUM(total_logical_reads+total_logical_writes)  AS [Logical IO],
      SUM(total_physical_reads)  AS [Physical Reads],
      SUM(total_elapsed_time)  AS [Duration MicroSec],
      SUM(total_clr_time)  AS [CLR Time MicroSec],
      SUM(total_rows)  AS [Rows Returned],
      SUM(execution_count)  AS [Execution Count],
      count(*) 'Plan Count'

    FROM sys.dm_exec_query_stats AS qs
    CROSS APPLY (
                    SELECT CONVERT(int, value) AS [DatabaseID] 
                  FROM sys.dm_exec_plan_attributes(qs.plan_handle)
                  WHERE attribute = N'dbid') AS F_DB
    GROUP BY DatabaseID
)
SELECT ROW_NUMBER() OVER(ORDER BY [CPU Time Ms] DESC) AS [Rank CPU],
       DatabaseName,
       [CPU Time Hr] = convert(decimal(15,2),([CPU Time Ms]/1000.0)/3600) ,
        CAST([CPU Time Ms] * 1.0 / SUM([CPU Time Ms]) OVER() * 100.0 AS DECIMAL(5, 2)) AS [CPU Percent],
       [Duration Hr] = convert(decimal(15,2),([Duration MicroSec]/1000000.0)/3600) , 
       CAST([Duration MicroSec] * 1.0 / SUM([Duration MicroSec]) OVER() * 100.0 AS DECIMAL(5, 2)) AS [Duration Percent],    
       [Logical Reads],
        CAST([Logical Reads] * 1.0 / SUM([Logical Reads]) OVER() * 100.0 AS DECIMAL(5, 2)) AS [Logical Reads Percent],      
       [Rows Returned],
        CAST([Rows Returned] * 1.0 / SUM([Rows Returned]) OVER() * 100.0 AS DECIMAL(5, 2)) AS [Rows Returned Percent],
       [Reads Per Row Returned] = [Logical Reads]/[Rows Returned],
       [Execution Count],
        CAST([Execution Count] * 1.0 / SUM([Execution Count]) OVER() * 100.0 AS DECIMAL(5, 2)) AS [Execution Count Percent],
       [Physical Reads],
       CAST([Physical Reads] * 1.0 / SUM([Physical Reads]) OVER() * 100.0 AS DECIMAL(5, 2)) AS [Physcal Reads Percent], 
       [Logical Writes],
        CAST([Logical Writes] * 1.0 / SUM([Logical Writes]) OVER() * 100.0 AS DECIMAL(5, 2)) AS [Logical Writes Percent],
       [Logical IO],
        CAST([Logical IO] * 1.0 / SUM([Logical IO]) OVER() * 100.0 AS DECIMAL(5, 2)) AS [Logical IO Percent],
       [CLR Time MicroSec],
       CAST([CLR Time MicroSec] * 1.0 / SUM(case [CLR Time MicroSec] when 0 then 1 else [CLR Time MicroSec] end ) OVER() * 100.0 AS DECIMAL(5, 2)) AS [CLR Time Percent],
       [CPU Time Ms],[CPU Time Ms]/1000 [CPU Time Sec],
       [Duration MicroSec],[Duration MicroSec]/1000000 [Duration Sec]
FROM DB_CPU_Stats
--WHERE DatabaseID > 4 -- system databases
--AND DatabaseID <> 32767 -- ResourceDB
ORDER BY [Rank CPU] OPTION (RECOMPILE);
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.