MSSQL — Activiry Monitor — เพื่อดู Table Lock หรือดู Process ต่างๆที่เกิดขึ้น

Thanaroj chareonphuthiwat
2 min readFeb 20, 2020

--

โจทย์คือ ระบบมีการทำงานที่ช้า หรือ Load data ค้าง ซึ่งต้องหาสาเหตุอย่างเร่งด่วน เนื่องจากลูกค้าไม่สามารถ ใช้งานได้ ซึ่งมีปัจจัยหลายด้านมาก เช่น Network , Server Database, Server Web Application และอื่นๆ จากการตรวจสอบเบื้องต้นพบว่า การทำงานของ Server ทั้ง Database และ Web Application ทำงานปกติ และสิ่งที่สังเกตุเห็นคือ ระบบจะช้าเฉพาะบางหน้า เลยสันนิษฐานว่า น่าะเป็นที่ Table บาง Table Lock อยู่ โดยใช้ Activty Monitor ตรวจสอบการทำงานของ Database ปรากฏว่า พบมี Table lock จริงๆ ซึ่งขั้นตอนสามารถทำได้ ดังนี้

Step1 : เปิดใช้งาน Activity Monitor ตามรูป

Step2 : ตรวจสอบหารายการ Task ที่ Lock อยู่ ที่ Tab Process และ ดูที่ Column Wait Type จะมีข้อความแสดง ว่า LCK และสังเกตุที่ Column Bloc By จากรูปด้านล่างจะเป็น หมายเลข 54

Step3 : ให้นำ Query ตามด้านล่าง ไปรันใน MSSQL

USE Master
GO
EXEC sp_who2
GO

Step4: จะได้ข้อมูลตามรูปด้านล่าง ซึ่งให้ดูที่ Column BlkBy จากตัวอย่างจะเป็น 54

หมายถึง เลข 54 นี้คือ SPID ที่ทำให้ รายการที่ SPID 55 นี้ Lock อยู่ หรือ Status เป็น SUSPENDED ซึ่งเราจะต้องไป ตรวจสอบอีกครั้งว่าทำไม Query รายการที่ SPID = 54 ถึงมีปัญหาอยู่ หรือมีการทำงานที่ค่อนข้างช้า ซึ่งจะช่วยให้รู้ว่า Process อะไรที่เป็นต้นเหตุของปัญหาและแก้ไขจุดบกพร่องตรงนี้ต่อไป

#Ti

SELECT spid,
sp.[status],
loginame [Login],
hostname,
blocked BlkBy,
sd.name DBName,
cmd Command,
cpu CPUTime,
physical_io DiskIO,
last_batch LastBatch,
[program_name] ProgramName
FROM master.dbo.sysprocesses sp
JOIN master.dbo.sysdatabases sd ON sp.dbid = sd.dbid
ORDER BY cpu desc

#Monitor

Determining current memory allocation

SELECT
(total_physical_memory_kb/1024) AS Total_OS_Memory_MB,
(available_physical_memory_kb/1024) AS Available_OS_Memory_MB
FROM sys.dm_os_sys_memory;

SELECT
(physical_memory_in_use_kb/1024) AS Memory_used_by_Sqlserver_MB,
(locked_page_allocations_kb/1024) AS Locked_pages_used_by_Sqlserver_MB,
(total_virtual_address_space_kb/1024) AS Total_VAS_in_MB,
process_physical_memory_low,
process_virtual_memory_low
FROM sys.dm_os_process_memory;

Determining current SQL Server memory utilization

SELECT
sqlserver_start_time,
(committed_kb/1024) AS Total_Server_Memory_MB,
(committed_target_kb/1024) AS Target_Server_Memory_MB
FROM sys.dm_os_sys_info;

Determining page life expectancy

SELECT
CASE instance_name WHEN ‘’ THEN ‘Overall’ ELSE instance_name END AS NUMA_Node, cntr_value AS PLE_s
FROM sys.dm_os_performance_counters
WHERE counter_name = ‘Page life expectancy’;

https://docs.microsoft.com/en-us/sql/relational-databases/performance-monitor/monitor-memory-usage?view=sql-server-ver16

--

--

No responses yet